我已经对这个问题感到困惑了一段时间了。这涉及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。
答案 0 :(得分:1)
我认为你以错误的方式使用sizeof
和指针。
sizeof(dc)
和sizeof(dc->array)
可以替换为sizeof(MyClass)
& ArraySize * sizeof(int)
。
对于指针,您必须执行cudaMemcpy
两次才能获得数组。
首先获取对象hc,它存储数组的地址。
cudaMemcpy(&hc, dc, sizeof(MyClass), cudaMemcpyDeviceToHost);
然后获取数组本身。
cudaMemcpy(h_array, hc.array, ArraySize*sizeof(int),D2H);
此外,dc
是指向设备mem的指针。您不能在主机上取消引用它,例如dc->array