Cuda 分配和返回从 GPU 到 CPU 的数组
Cuda allocation and return array from gpu to cpu
我在 Cuda 中有以下代码(这不是完整的代码)。我正在尝试检查它是否正确地将数组从主机复制到设备以及从设备到主机。
flVector 用几个数字和 indeces 初始化。
pass函数需要将flVector和indeces复制到设备内存中。总的来说,在我调用传递函数之后,我尝试再次复制数组,但现在从设备复制到主机,然后打印值以检查值是否正确。
flat_h正确返回并且值正确,但返回带有垃圾值,我不知道代码有什么问题。
从传递函数返回两个变量,我使用 return 命令返回 flOnDevice,并且我还传递了一个指向 inOnDevice 的指针来保存这个数组。这两个变量位于设备端,然后我尝试将它们复制回主机。这只是检查一切是否正常。但是当我打印inOnDevice时,我得到了垃圾值。为什么?
int* pass(vector<int>& flVector, int* indeces, int inSize, int* inOnDevice)
{
int* flOnDevice;
cudaMalloc((void**) &(flOnDevice), sizeof(int) * flVector.size());
cudaMemcpy(flOnDevice, &flVector[0], flVector.size()*sizeof(int),cudaMemcpyHostToDevice);
cudaMalloc((void**) &(inOnDevice), sizeof(int) * inSize);
cudaMemcpy(inOnDevice, indeces, inSize*sizeof(int), cudaMemcpyHostToDevice);
return flOnDevice;
}
void main()
{
int* insOnDevice = NULL;
int* flOnDevice;
flOnDevice = pass(flVector, indeces, indSize, inOnDevice);
int* flat_h = (int*)malloc(flVector.size()*sizeof(int));
int* inde_h = (int*)malloc(inSize*sizeof(int));
cudaMemcpy(flat_h,flOnDevice,flVector.size()*sizeof(int),cudaMemcpyDeviceToHost);
cudaMemcpy(inde_h,inOnDevice,inSize*sizeof(int),cudaMemcpyDeviceToHost);
printf("flat_h: nn");
for (int i =0; i < flVector.size(); i++)
printf("%d, " , flat_h[i]);
printf("nninde_h: nn");
for (int i =0; i < inSize; i++)
printf("%d, " , inde_h[i]);
printf("nn");
}
这不是你认为的那样:
int* pass(vector<int>& flVector, int* indeces, int inSize, int* inOnDevice)
{
...
cudaMalloc((void**) &(inOnDevice), sizeof(int) * inSize);
以这种方式将指针传递给函数时,您是按值传递指针的。
如果随后在函数中获取该指针按值传递的地址,则该地址与函数调用上下文中的任何内容都没有连接。 在函数 pass
中,有一个 *inOnDevice
的本地副本,并且您正在使用后续的 cudaMalloc
操作修改该本地副本。
相反,在这种情况下,您需要传递指针到指针(模拟的按引用传递)或按引用传递。 对于指针指向指针的示例,它看起来像这样:
int* pass(vector<int>& flVector, int* indeces, int inSize, int** inOnDevice)
{
...
cudaMalloc((void**) inOnDevice, sizeof(int) * inSize);
cudaMemcpy(*inOnDevice, indeces, inSize*sizeof(int), cudaMemcpyHostToDevice);
在main
:
flOnDevice = pass(flVector, indeces, indSize, &inOnDevice);
而且我认为,如果您按照我之前向您建议的那样使用了适当的cuda错误检查,那么您会看到从以下代码行返回的错误:
cudaMemcpy(inde_h,inOnDevice,inSize*sizeof(int),cudaMemcpyDeviceToHost);
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '