Как использовать устройство Cula

Я немного запутался в том, как использовать интерфейс устройства cula. Сейчас я использую интерфейс cula в файле cpp и генерирую случайные числа из файла 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?

Я не могу понять, как управлять передачей памяти.

1 ответ

Решение

Я не знаю кула Однако, после краткого ознакомления со справочным руководством (с которым я предлагаю ознакомиться до 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 и с него.

Другие вопросы по тегам