2013-03-13 81 views
0

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

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文件:调用 “内核” 打印 “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”文件调用的“内核”函数中打印“d_array”。但是,它不打印它。也没有错误。如果在“cuda-print.cu”文件中,我再次分配设备内存并将其设置为零,然后内核将其打印出来。

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

感谢

+1

你'cuda_malloc'函数不正确。您必须传递您通过引用分配的指针,而不是通过该函数的值。这与CUDA无关,它理解C指针如何工作。 – talonmies 2013-03-13 21:28:33

回答

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

感谢stuhlo和@talonmies:我不好,我是一个新的C和CUDA程序员。感谢您指出我的错误并纠正错误。 – shadowfax 2013-03-13 23:25:33

相关问题