Cuda 如何使用cula设备
我对如何使用cula设备接口有点困惑。 现在,我正在cpp文件上使用cula接口,并从cu文件生成一些随机数 cu文件:Cuda 如何使用cula设备,cuda,cula,Cuda,Cula,我对如何使用cula设备接口有点困惑。 现在,我正在cpp文件上使用cula接口,并从cu文件生成一些随机数 cu文件: ... __global__ void kernel( double * A,double * B, curandState * globalState, int Asize, int Bsize ) { // generate random numbers ... void kernel_wrapper( double ** const A_ho
...
__global__ void kernel( double * A,double * B, curandState * globalState, int Asize, int Bsize )
{
// generate random numbers
...
void kernel_wrapper(
double ** const A_host,
double ** const B_host,
const int Asize ,
const int Bsize )
{
...
// create random states
curandState * devStates;
gpuErrchk( cudaMalloc( &devStates, N * sizeof(curandState) ) );
// allocate host memory
*A_host = (double*) malloc( Asize * sizeof(double) );
*B_host = (double*) malloc( Bsize * sizeof(double) );
// allocate device memory
double * A_dev, * B_dev;
gpuErrchk( cudaMalloc( (void**) &A_dev, Asize * sizeof(double) ) );
gpuErrchk( cudaMalloc( (void**) &B_dev, Bsize * sizeof(double) ) );
// setup seeds
setup_kernel<<<1,N>>>( devStates, unsigned( time(NULL)) );
...
// generate random numbers
kernel<<<1,1>>>( A_dev, B_dev, devStates, Asize, Bsize );
gpuErrchk( cudaPeekAtLastError() );
gpuErrchk( cudaDeviceSynchronize() );
// copy result from device to host
gpuErrchk( cudaMemcpy( *A_host, A_dev, Asize * sizeof(double), cudaMemcpyDeviceToHost ) );
gpuErrchk( cudaMemcpy( *B_host, B_dev, Bsize * sizeof(double), cudaMemcpyDeviceToHost ) );
// clean up device memory
gpuErrchk( cudaFree( A_dev ) );
gpuErrchk( cudaFree( B_dev ) );
gpuErrchk( cudaFree( devStates ) );
return;
}
所以,我从cu文件分配主机内存,并将其传递给cpp文件
如果我想使用cula设备
我不知道如何管理内存传输。我不知道库拉。但是,在简要了解之后(我建议在此之前咨询),您可以将cula设备功能用作主机功能。但是,必须向函数传递设备内存指针
__global__ void kernel( double * A,double * B, curandState * globalState, int Asize, int Bsize )
{
// generate random numbers
...
void kernel_wrapper(
double * const A,
double * const B,
const int Asize ,
const int Bsize )
{
...
// create random states
curandState * devStates;
gpuErrchk( cudaMalloc( &devStates, N * sizeof(curandState) ) );
// setup seeds
setup_kernel<<<1,N>>>( devStates, unsigned( time(NULL)) );
...
// generate random numbers
kernel<<<1,1>>>( A, B, devStates, Asize, Bsize );
gpuErrchk( cudaPeekAtLastError() );
gpuErrchk( cudaDeviceSynchronize() );
// clean up device memory
gpuErrchk( cudaFree( devStates ) );
return;
}
就是这样,只要所有内容都保留在设备内存中,您甚至不需要主机内存
最后,我可以建议你看一下这本书吗?我认为这将帮助您了解主机和设备内存以及“内存传输”的差异往返CUDA设备。可能重复@kronos:这指的是使用cula的设备接口,我想知道它是如何工作的。这与重复的不一样。你能纠正一下吗?:在调用kernel\u wrapper和我试图访问B矩阵时,程序会出现分段错误。(还要注意,在内核参数中“kernel”(A,B,devStates,Asize,Bsize);“必须使用”*A和*B。修复了指针;您不能直接从主机代码访问B。A,B现在只驻留在设备内存中。如果您想访问主机代码中的矩阵(所有不是全局或设备的东西)您必须将其memcopy到主机主内存中。注意:指针必须在void kernel\u wrapper和extern void kernel\u wrapper中**才能传递值(更正代码)。删除*会导致segm错误。好的,所以我使用memcopy从设备到主机,现在看起来还可以。谢谢。
__global__ void kernel( double * A,double * B, curandState * globalState, int Asize, int Bsize )
{
// generate random numbers
...
void kernel_wrapper(
double * const A,
double * const B,
const int Asize ,
const int Bsize )
{
...
// create random states
curandState * devStates;
gpuErrchk( cudaMalloc( &devStates, N * sizeof(curandState) ) );
// setup seeds
setup_kernel<<<1,N>>>( devStates, unsigned( time(NULL)) );
...
// generate random numbers
kernel<<<1,1>>>( A, B, devStates, Asize, Bsize );
gpuErrchk( cudaPeekAtLastError() );
gpuErrchk( cudaDeviceSynchronize() );
// clean up device memory
gpuErrchk( cudaFree( devStates ) );
return;
}
extern void kernel_wrapper(double** A,double** B, int Asize ,int Bsize);
...
culaDouble* A;
culaDouble* B;
gpuErrchk( cudaMalloc( (void**) &A, Asize * sizeof(double) ) );
gpuErrchk( cudaMalloc( (void**) &B, Bsize * sizeof(double) ) );
kernel_wrapper( A, B, Asize, Bsize );
...
status = culaDeviceDgels('N',N,N, NRHS, A, N, B, N);
gpuErrchk( cudaFree( A ) );
gpuErrchk( cudaFree( B ) );