【问题标题】:how to use the cula device如何使用 cula 设备
【发布时间】:2014-03-30 14:52:55
【问题描述】:

我对如何使用 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_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;

} 

cpp 文件:

...
extern void kernel_wrapper(double** A,double** B, int Asize ,int Bsize);
...
 culaDouble* A;
 culaDouble* B;

kernel_wrapper( &A, &B, Asize, Bsize );
...
status = culaDgels('N',N,N, NRHS, A, N, B, N);

所以,我从 cu 文件分配主机内存并将其传递给 cpp 文件。

如果我想使用 cula 设备?

我不知道如何管理内存传输。

【问题讨论】:

标签: cuda cula


【解决方案1】:

我不知道库拉。但是,在简要查看reference guide(我建议在 SO 之前咨询)之后,您可以将 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;

} 

在你的 cpp 中:

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 ) );

就是这样,只要所有内容都保留在设备内存中,您甚至不需要主机内存。

最后,我可以建议你看看CUDA Programming Guide吗?我认为这将帮助您了解主机和设备内存以及进出 CUDA 设备的“内存传输”的差异。

【讨论】:

  • :程序在调用 kernel_wrapper 后以及当我尝试访问 B 矩阵时给出分段错误。(另请注意,在内核参数中“kernel>>(A,B,devStates , Asize, Bsize );" 必须使用 "*A and *B"。
  • 修正了指针指针;您不能直接从主机代码访问 B。 A、B 现在仅驻留在设备内存中。如果你想在主机代码中访问你的矩阵(所有不是 globaldevice 的东西)你必须将它 memcopy 到主机主内存中。
  • :指针必须在 void kernel_wrapper 和 extern void kernel_wrapper 中为 ** 才能传递值(更正您的代码)。删除 * 导致 segm 错误。好的,所以我使用了 memcopy from设备托管,现在似乎没问题。谢谢。
猜你喜欢
  • 2015-05-14
  • 2015-05-02
  • 2014-09-12
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多