Cuda 分配和返回从 GPU 到 CPU 的数组

Cuda allocation and return array from gpu to cpu

本文关键字:CPU 数组 GPU 分配 返回 Cuda      更新时间:2023-10-16

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