2013-03-13 64 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

相關問題