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

标签 pointers 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);
}

我知道,当我使用对象指针运行内核代码时,它没有映射到设备内存中,因此这就是内核代码失败的原因。我想知道的是如何在主文件中存储指向设备内存中特定 block 的指针,以便可以在其他 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);
}

所以你传入一个指针,此时你就有了一个名为 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) 调用它,所以没有任何意义,而且只会让您的代码变得困惑。

关于pointers - 在 CUDA 中的类之间传递指向设备内存的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12369790/

相关文章:

c - 通过c中的函数传递的二维数组

cuda - 如何编译PTX代码

c - (*exptr)->cnt 与 exptr->cnt 或 (*exptr).cnt 相同吗?

c - 以下 C 代码有什么问题 - 结构和指针

cuda - 如何判断GPU卡是否被使用?

c++ - 如何正确实现在 Cuda/C++ 中从主机和设备代码调用其成员的类?

go - Go语言的cgo如何编译Cuda源码?

cuda - CUDA 中的梯度下降优化

c++ - Lint 警告 与指针结合的算术表达式中的可疑截断

c++ - 我如何在单独的头文件中的结构中定义一个 char* 数组?