3

一段时间以来,我一直很困惑这个问题。这涉及到 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 空闲操作:无效参数”)。我已经尝试了很多这样的变体,包括使用 hc->array,但没有成功。有什么方法可以让我得到这个数组,而不必编写一个内核函数来复制每个单独的条目?我正在使用 CUDA 5.0。

4

1 回答 1

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

另外,dc是指向设备内存的指针。你不能像这样在主机上取消引用它dc->array

于 2013-01-10T19:08:37.753 回答