通过主机对象传递设备指针 我试图把我的C++代码的部分卸载到GPU,所以我写了一个包装文件“< /代码>,它做所有CUDA的东西,并用NVCC编译,而我把这些函数称为我的C++代码,用G++编写。我想将设备指针存储为类的成员变量,以便将其传递给各种内核,但将在主机类初始化的数组复制到设备时遇到了问题 //wrapper.cu //simple func to copy arrays from host to device void cuda_h2d(int* src, int* dst, int size) { cudaMalloc(&dst, size*sizeof(int)); cudaMemcpy(dst, src, size*sizeof(int), cudaMemcpyHostToDevice); }

通过主机对象传递设备指针 我试图把我的C++代码的部分卸载到GPU,所以我写了一个包装文件“< /代码>,它做所有CUDA的东西,并用NVCC编译,而我把这些函数称为我的C++代码,用G++编写。我想将设备指针存储为类的成员变量,以便将其传递给各种内核,但将在主机类初始化的数组复制到设备时遇到了问题 //wrapper.cu //simple func to copy arrays from host to device void cuda_h2d(int* src, int* dst, int size) { cudaMalloc(&dst, size*sizeof(int)); cudaMemcpy(dst, src, size*sizeof(int), cudaMemcpyHostToDevice); },c++,cuda,C++,Cuda,在我的cpp代码中调用此函数,如下所示: //main.cpp . . Class obj; //object that has a pointer to respective device array as a member(int* device_array) int host_array[3] = {2,3,4}; int size = 3; cuda_h2d(host_array, obj.device_array, size); 当我在另一个主机函数中访问obj.device\u

在我的cpp代码中调用此函数,如下所示:

//main.cpp
.
.

Class obj; //object that has a pointer to respective device array as a member(int* device_array)
int host_array[3] = {2,3,4};
int size = 3;
cuda_h2d(host_array, obj.device_array, size);

当我在另一个主机函数中访问
obj.device\u array
的值时,它会给出垃圾值。因此,我的假设是,指向设备数组的指针不能在主机代码中初始化。我该如何解决这个问题。我知道使用Cuda统一内存中的
cudamalocmanaged()
是可行的,但由于各种性能限制,我尝试不使用它。

问题在于
Cuda_h2d
,与Cuda本身无关

实际上,
cudamaloc
分配一个内存块并将其放入
dst
,然后
cudaMemcpy
执行复制,然后函数返回。当函数
cuda_h2d
返回时,
obj.device_array
不会被修改,因为参数
dst
是通过值传递的


您需要通过引用传递
dst
指针,或者使用指向指针的指针(如
cudamaloc
does)来实际修改调用范围中的指针。

“因此我的假设是指向设备数组的指针不能在主机代码中初始化”——这是错误的。除此之外,还需要一个实际的工作示例来说明更多内容。我猜您的问题实际上与类复制构造语义和在您不希望调用析构函数时调用析构函数有关,但这是不可能的!谢谢你!