在CUDA中从主机访问设备上的类成员阵列指针

时间:2013-01-10 16:03:49

标签: c++ cuda

我已经对这个问题感到困惑了一段时间了。这涉及CUDA设备指针。我有一个自定义类的实例,它位于我的设备上,它有一个成员变量,它是一个指向数组的指针(位于设备上)。

class MyClass {
public:
    int* array;
    // Other variables and functions, etc.
};

它需要是一个动态分配的数组,因为数组的大小取决于程序开头的某些输入。在程序的持续时间我使用内核函数修改类,但最终我想在主机上获得此类的副本以输出到文件。但是我似乎无法让cudaMemCpy为我工作。

我可以使用此代码获取该类的副本(其中dc是指向设备上类的指针):

MyClass hc;
cudaMemcpy(&hc, dc, sizeof(dc), cudaMemcpyDeviceToHost);

但是这只会获取类中不是指针的信息,这是有道理的,因为在hc中检索的指针仍然指向设备上的数据。所以我想我可以使用这段代码来实际获取数组。

int* h_array;
cudaMemcpy(h_array, dc->array, sizeof(dc->array), cudaMemcpyDeviceToHost);

这只返回一个空数组,加上我得到一个cudaFree错误(“Cuda错误:cuda free operations:invalid argument”)。我尝试了很多这方面的变体,包括使用hc->数组,没有成功。有没有办法让我可以获得这个数组,而无需编写内核函数来复制每个单独的条目?我正在使用CUDA 5.0。

1 个答案:

答案 0 :(得分:1)

我认为你以错误的方式使用sizeof和指针。

代码中的

sizeof(dc)sizeof(dc->array)可以替换为sizeof(MyClass)& ArraySize * sizeof(int)

对于指针,您必须执行cudaMemcpy两次才能获得数组。

  1. 首先获取对象hc,它存储数组的地址。

    cudaMemcpy(&hc, dc, sizeof(MyClass), cudaMemcpyDeviceToHost);
    
  2. 然后获取数组本身。

    cudaMemcpy(h_array, hc.array, ArraySize*sizeof(int),D2H);
    
  3. 此外,dc是指向设备mem的指针。您不能在主机上取消引用它,例如dc->array