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

Pointers 在CUDA中的类之间传递指向设备内存的指针,pointers,cuda,Pointers,Cuda,我将非常感谢一些涉及CUDA设备内存指针的帮助。基本上,我想把我的CUDA内核代码分割成多个文件,以提高可读性,因为它是一个大型程序。所以我想做的是能够将相同的设备内存指针传递给多个CUDA内核,而不是同时传递。下面是一个粗略的例子,我需要什么 //random.h class random{ public: int* dev_pointer_numbers; }; 因此,对象只需要存储指向设备内存的指针 //random_kernel.cu __global__ void doSom

我将非常感谢一些涉及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);
}

我知道,当我用对象指针运行内核代码时,它没有映射到设备内存中,因此内核代码失败。我想知道的是,如何将指向主文件中设备内存中特定块的指针存储到主文件中,以便它可以在其他cuda内核文件中重用?

您正在丢失指针

查看您的init_内存函数:

init_memory(int *devPtr,int *host_memory,int arraysize)
{
  cudaMalloc(&devPtr,arraysize*sizeof(int));
  cudaMemcpy(devPtr,host_memory,arraysize*sizeof(int),cudaMemcpyHostToDevice);
}
因此,传入一个指针,在该指针处有一个名为devPtr的本地副本。然后使用指针的本地副本的地址调用cudamaloc()。当函数返回时,本地副本(在堆栈上)被销毁,因此指针丢失

相反,请尝试以下方法:

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);

作为一个旁注,考虑删除<代码>外部“C”<代码>,因为您从C++(main .CPP)调用这个没有点,它只是凌乱代码。

谢谢您这么多,我担心这是发生的。我知道外部代码“C”是多余的,所以我稍后会删除它,再次感谢!是否可以传入对象本身而不是其成员?通过这种方式,我可以将参数的数量限制为仅对象名,并在函数中引用对象指针?您的意思是将对象传递给init_内存吗?是的,你可以这样做。你应该通过引用的方式通过它-如果你打算改变任何成员,那么出于与原始问题相同的原因,即使你不打算改变成员,也会避免一份副本。谢谢,我意识到我关注的是错误的问题,并且正确地传递了对象引用,而不是声明数组大小的整数。谢谢你宝贵的帮助。
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);