从多个cuda文件访问相同的设备内存

时间:2013-03-13 21:06:33

标签: cuda

我想设计一个代码,其中应该从多个cuda文件中的内核访问相同的设备内存。下面给出了一个简化的例子,其中main.c调用3 .cu文件:cuda_malloc.cu,cuda_print.cu和cuda_free.cu。

Main.c文件:声明指针“d_array”

main()
{
int maxpar = 10;

float* d_array;

cuda_malloc(maxpar, d_array);

cuda_print(maxpar,d_array);

cuda_free(d_array);
}

cuda_malloc.cu文件:为d_array分配设备内存并将值设置为零。

extern "C" void cuda_malloc(int maxpar, float* d_array)
{
    CUDA_SAFE_CALL(cudaMalloc((void**)&d_array,sizeof(float)*maxpar));
    CUDA_SAFE_CALL(cudaMemset(d_array,'\0',sizeof(float)*maxpar));
}

cuda_print.cu文件:调用“kernel”从设备内存中打印“d_array”

extern "C"
{
__global__ void kernel(int maxpar, float* d_array)
{
    int tid = threadIdx.x;
    if (tid >= maxpar) return;
    printf("tId = %d, d_array[i] = %f \n",tid,d_array[tid]);
}

    void cuda_print(int maxpar, float* d_array)
{
    //If I un-comment the following 2 lines, the kernel function prints array values
    //otherwise, it does not
    //CUDA_SAFE_CALL(cudaMalloc((void**)&d_array,sizeof(float)*maxpar));
    //CUDA_SAFE_CALL(cudaMemset(d_array,'\0',sizeof(float)*maxpar));

    kernel <<<1, maxpar>>> (maxpar,d_array);

    cudaDeviceSynchronize();
    cudaGetLastError();
}

cuda_free.cu文件:释放设备内存

extern "C" void cuda_free(float* d_array)
{
    CUDA_SAFE_CALL(cudaFree(d_array));
}

此代码编译良好。请注意,我正在尝试在“cuda_print.cu”文件中调用的“kernel”函数中打印“d_array”。但是,它不打印它。也没有错误。如果在“cuda-print.cu”文件中,我再次分配设备内存并将其设置为零,然后内核将其打印出来。

我的问题是:如何从多个cuda文件中访问相同的设备内存?

由于

1 个答案:

答案 0 :(得分:3)

您的问题出在函数void cuda_malloc(int maxpar, float* d_array)中。当你打电话:

CUDA_SAFE_CALL(cudaMalloc((void**)&d_array,sizeof(float)*maxpar));
CUDA_SAFE_CALL(cudaMemset(d_array,'\0',sizeof(float)*maxpar));

d_array仅在“本地”更改。

而不是您的方法,您的功能应该如下所示:

extern "C" void cuda_malloc(int maxpar, float** d_array) {
    CUDA_SAFE_CALL(cudaMalloc((void**)d_array,sizeof(float)*maxpar));
    CUDA_SAFE_CALL(cudaMemset(*d_array,'\0',sizeof(float)*maxpar));    
}

并将其称为:

cuda_malloc(maxpar, &d_array);