通过主机对象传递设备指针
Passing device pointers through host objects
我正在尝试将部分 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
一样使用指针到指针来实际修改调用范围的指针。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 如何在 cuda 中将结构的指针变量从主机复制到设备
- CUDA中设备函数指针的分配(来自主机函数指针)
- CUDA在使用函数指针时启动主机函数作为内核
- 在OpenCL中分配内存,创建一个主机指针,但直到需要时才将其写入设备
- CUDA:分配1d设备内存来将2d指针到指针主机数组复制到GPU
- 在CUDA中从主机访问设备上的类成员数组指针