Cuda从gpu到cpu的分配和返回数组

时间:2014-04-03 01:49:34

标签: c++ c arrays cuda

我在Cuda中有以下代码(它不是完整的代码)。 我试图检查它是否正确地从主机到设备复制数组 设备托管。

flVector初始化时带有一些数字和凹陷。

pass函数需要将flVector和indeces复制到设备内存中。 总的来说,在我调用传递函数之后,我尝试再次复制数组,但现在从设备复制到主机,然后打印值以检查值是否正确。

flat_h正确返回且值正确,但indeces返回垃圾值,我不知道代码有什么问题。

从pass函数返回两个变量我使用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: \n\n");
    for (int i =0; i < flVector.size(); i++)
        printf("%d, " , flat_h[i]);
    printf("\n\ninde_h: \n\n");
    for (int i =0; i < inSize; i++)
        printf("%d, " , inde_h[i]);
    printf("\n\n");
}

1 个答案:

答案 0 :(得分:2)

这不符合您的想法:

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

我认为如果您使用proper cuda error checking作为suggested to you before,您会看到从此行代码返回的错误:

cudaMemcpy(inde_h,inOnDevice,inSize*sizeof(int),cudaMemcpyDeviceToHost);