簡體   English   中英

在CUDA中從主機訪問設備上的類成員陣列指針

[英]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來獲得你的數組。

  1. 首先獲取對象hc,它存儲數組的addr。

     cudaMemcpy(&hc, dc, sizeof(MyClass), cudaMemcpyDeviceToHost); 
  2. 然后獲取數組本身。

     cudaMemcpy(h_array, hc.array, ArraySize*sizeof(int),D2H); 

此外, dc是指向設備mem的指針。 你不能在主機上取消引用它,就像這個dc->array

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM