我对这个问题感到很困惑已经一段时间了。这涉及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操作:无效参数”)。我尝试了很多变化,包括使用hc->array,但都没有成功。有没有办法可以在不必编写内核函数复制每个单独条目的情况下获取此数组?我正在使用CUDA 5.0。
MyClass.array
的值)是使用主机API分配还是在设备上的内核中使用malloc/new
分配的? - talonmiesdc
是指向设备内存的指针。你不能在主机上像这样解引用它,即dc->array
。 - kangshiyin