-2

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デバイスを使用したい場合は?

メモリ転送を管理する方法がわかりません。

4

1 に答える 1

2

私はキュラを知りません。ただし、リファレンス ガイド(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 プログラミング ガイドをご覧になることをお勧めしますか? これは、ホストとデバイスのメモリの違い、および CUDA デバイスとの間の「メモリ転送」の違いを理解するのに役立つと思います。

于 2014-02-27T13:12:00.040 に答える