![](/img/trans.png)
[英]CUDA: Allocating 1d device memory to copy 2d pointer-to-pointer host array to and from GPU
[英]Accessing Class Member Array Pointer on Device from Host in 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。
我認為你以錯誤的方式使用sizeof
和指針。
sizeof(dc)
和sizeof(dc->array)
可以替換為sizeof(MyClass)
和ArraySize * sizeof(int)
。
對於指針,你必須做兩次cudaMemcpy
來獲得你的數組。
首先獲取對象hc,它存儲數組的addr。
cudaMemcpy(&hc, dc, sizeof(MyClass), cudaMemcpyDeviceToHost);
然后獲取數組本身。
cudaMemcpy(h_array, hc.array, ArraySize*sizeof(int),D2H);
此外, dc
是指向設備mem的指針。 你不能在主機上取消引用它,就像這個dc->array
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.