一段时间以来,我一直很困惑这个问题。这涉及到 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。