我将不胜感激一些涉及CUDA设备内存指针的帮助.基本上我想将我的CUDA内核代码拆分成多个文件以便于阅读,因为它是一个大型程序.所以我想要做的是能够将相同的设备内存指针传递给多个CUDA内核,而不是同时.下面是我需要的一个粗略的例子
//random.h
class random{
public:
int* dev_pointer_numbers;
};
Run Code Online (Sandbox Code Playgroud)
所以对象只需要将指针存储到设备内存中
//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);
}
Run Code Online (Sandbox Code Playgroud)
和主文件:
//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);
}
Run Code Online (Sandbox Code Playgroud)
我知道当我使用对象指针运行内核代码时,它不会映射到设备内存中,这就是内核代码失败的原因.我想知道的是如何将指针存储到主文件中设备内存中特定块的指针,以便可以在其他cuda内核文件中重用?
你失去了指针!
看看你的init_memory函数:
init_memory(int *devPtr,int *host_memory,int arraysize)
{
cudaMalloc(&devPtr,arraysize*sizeof(int));
cudaMemcpy(devPtr,host_memory,arraysize*sizeof(int),cudaMemcpyHostToDevice);
}
Run Code Online (Sandbox Code Playgroud)
所以你传入一个指针,此时你有一个名为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);
Run Code Online (Sandbox Code Playgroud)
作为旁注,考虑删除extern "C"
,因为你从C++(main.cpp)调用它是没有意义的,它只会使你的代码混乱.