最小化数据传输(使用设备内存?)

时间:2014-02-26 12:49:20

标签: cuda

我正在使用cu文件,我在其中生成随机数。

...
__global__ void kernel(double* A,double *B, curandState* globalState,int Asize,int Bsize)
{...



void kernel_wrapper(double** A_host,double** B_host, int Asize ,int Bsize)
{

    int N=1000; // random numbers

    //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)));
    gpuErrchk( cudaPeekAtLastError() ); 
    gpuErrchk( cudaDeviceSynchronize() );

    //define threads  and blocks
    const int NUM_BLOCKS=16;    
    const int NUM_THREADS=256;  
    dim3 dimGrid(NUM_BLOCKS);
    dim3 dimBlock(NUM_THREADS);

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


}

然后,我从cpp文件加载这些值,并将它们用作函数的参数。

...
extern void kernel_wrapper(double** A,double** B, int Asize ,int Bsize);
...
int main()
{
...
kernel_wrapper(&A,&B,Asize ,Bsize);
...
myfunction(...A,B)
...
 free(A);
 free(B);

如何最大限度地减少数据传输并主要在设备中完成工作? 因为现在我正在分配主机内存并将其传递给cpp文件。 我无法计算如何传递设备内存?

1 个答案:

答案 0 :(得分:0)

如果你所做的只是在设备上生成随机数,然后在主机代码(myfunction)中使用它们,那么你将无法做到比你所拥有的更好的传递数据。您myfunction文件中的.cpp被编写为使用主机代码,因此没有必要将数据传递给驻留在设备上的数据。