在CUDA中在类之间传递指向设备内存的指针

3

我希望能够得到一些有关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内核文件中重复使用?

1个回答

7

您的指针已经丢失!

查看您的 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)调用这个函数,没有必要保留它,它只会让你的代码变得混乱。

非常感谢,我担心这种情况会发生。我知道extern "C"是多余的,所以稍后会将其删除,再次感谢! - Daniel Galasko
能否传递对象本身而不是它的成员?这样我就可以将参数数量限制为仅对象名称,并在函数内引用对象指针了。 - Daniel Galasko
你的意思是将对象传递给init_memory吗?是的,你可以这样做。你应该通过引用传递它 - 如果你打算更改任何成员,那么出于与原始问题相同的原因,即使你不打算更改成员,也要避免复制。 - Tom
谢谢,我意识到我关注的问题是错误的,并且一直正确地传递了我的对象引用,只是没有声明数组大小的整数。感谢您宝贵的帮助。 - Daniel Galasko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接