通过主机对象传递设备指针

Passing device pointers through host objects

本文关键字:指针 主机 对象      更新时间:2024-09-24

我正在尝试将部分 c++ 代码卸载到 GPU,所以我编写了一个包装器文件wrapper.cu"它完成了所有 cuda 工作并使用 nvcc 编译,同时我将这些功能调用到用 g++ 编写的 c++ 代码。我想将设备指针存储为类的成员变量,以便我可以将其传递给各种内核,但是在将主机类初始化的数组复制到设备时遇到问题。

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

在我的 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_array的值时,它会给出垃圾值。所以我的假设是指向设备数组的指针不能在主机代码中初始化。我该如何解决这个问题。我知道使用 Cuda 统一内存中的CudaMallocManaged()可以工作,但由于各种性能限制,我正在尝试不使用它。

问题出在cuda_h2d,与 CUDA 本身无关。

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

您需要通过引用传递dst指针,或者像cudaMalloc一样使用指针到指针来实际修改调用范围的指针。