2012-09-11 35 views
2

我希望得到涉及CUDA設備內存指針的一些幫助。基本上我想將我的CUDA內核代碼拆分爲多個文件以提高可讀性,因爲它是一個大型程序。所以我想要做的是能夠將相同的設備內存指針傳遞給多個CUDA內核,而不是同時傳遞。下面是什麼,我需要在CUDA中的類之間傳遞指向設備內存的指針

//random.h 
class random{ 
public: 
    int* dev_pointer_numbers; 
}; 

所以對象只需要指針存儲到設備內存

//random_kernel.cu 
__global__ void doSomething(int *values){ 
//do some processing} 

extern "C" init_memory(int *devPtr,int *host_memory,int arraysize) 
{ 
    cudaMalloc(&devPtr,arraysize*sizeof(int)); 
    cudaMemcpy(devPtr,host_memory,arraysize*sizeof(int),cudaMemcpyHostToDevice); 
} 

extern "C" runKernel(int *devPtr){ 
    doSomething<<<1,1>>>(devPtr); 
} 

和主文件粗略的例子:

//main.cpp 
//ignoring all the details etc 
random rnd; 
void CUDA(int *hostArray) 
{ 
    init_memory(rnd.dev_pointer_numbers,hostArray,10); 
    runKernel(rnd.dev_pointer_numbers); 
} 

我明白當我用對象指針運行內核代碼時,它並沒有映射到設備內存中,這就是爲什麼內核代碼失敗。我想知道的是,如何將指針存儲到我的主文件中設備內存中的特定塊的指針,以便它可以在其他cuda內核文件中重用?

回答

6

你正在失去你的指針!

查看您所在init_memory功能:

init_memory(int *devPtr,int *host_memory,int arraysize) 
{ 
    cudaMalloc(&devPtr,arraysize*sizeof(int)); 
    cudaMemcpy(devPtr,host_memory,arraysize*sizeof(int),cudaMemcpyHostToDevice); 
} 

所以你在一個指針傳遞,此時你有一個名爲devPtr本地副本。然後你用指針的本地副本的地址調用cudaMalloc()。當函數返回本地副本(在堆棧上)被銷燬時,所以你丟失了指針。

相反試試這個:

init_memory(int **devPtr,int *host_memory,int arraysize) 
{ 
    cudaMalloc(devPtr,arraysize*sizeof(int)); 
    cudaMemcpy(*devPtr,host_memory,arraysize*sizeof(int),cudaMemcpyHostToDevice); 
} 

... 

init_memory(&rnd.dev_pointer_numbers,hostArray,10); 

作爲一個側面說明,考慮取消extern "C",因爲你從C調用此++(main.cpp中)有沒有點,它只是雜波您的代碼。

+0

非常感謝,我很害怕這種情況發生。我知道外部的「C」是多餘的,所以我會在稍後刪除它,再次感謝! –

+0

是否可以傳入對象本身而不是其成員?這樣我可以限制參數的數量只是對象的名稱和函數引用的對象指針? –

+0

你的意思是把對象傳遞給init_memory嗎?是的,你可以這樣做。您應該通過引用來傳遞它 - 如果您打算更改任何成員,則出於與原始問題相同的原因,即使您不打算更改成員,也會避免副本。 – Tom

相關問題