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內核文件中重用?
非常感謝,我很害怕這種情況發生。我知道外部的「C」是多餘的,所以我會在稍後刪除它,再次感謝! –
是否可以傳入對象本身而不是其成員?這樣我可以限制參數的數量只是對象的名稱和函數引用的對象指針? –
你的意思是把對象傳遞給init_memory嗎?是的,你可以這樣做。您應該通過引用來傳遞它 - 如果您打算更改任何成員,則出於與原始問題相同的原因,即使您不打算更改成員,也會避免副本。 – Tom