2017-07-15 61 views
-2
class bead { 
int ID; 
__host__ __device__ bead(int id){ID=id}; 
} 
void main(void){ 
vector<bead*> beadvec; 
for(int i=0;i<128;i++){ 
bead* b1=new bead(i); 
beadvec.pushback(b1); 
} 
} 

我不確定如何將指針矢量(beadvec)複製到設備。 我應該依靠cudaMemCpy和cudaMalloc函數,還是有推力功能來有效地完成它*/ 在設備代碼中,我想訪問每個磁珠並對ID進行基本操作。CUDA C++複製指向設備的對象指針

+0

這裏需要的概念在CUDA SO標籤中有很多其他問題,甚至在[標籤信息鏈接](https://stackoverflow.com/tags/cuda/info)中提到「使用數組CUDA中的指針「。通過提出一系列指針的存儲公式,你可能會讓事情變得比他們需要的要困難得多。這種類型的對象(而不是指向對象的指針數組)的數組通過比較將變得微不足道。 –

+0

感謝您的澄清。在發佈這篇文章之前,我經歷了這些問題。我認爲,複製對象指針的向量所需的時間比僅將對象向量複製到設備的時間要短。我錯過了什麼嗎? –

+0

對象指針的向量,其中每個對象分別用'new'分配,無法方便地複製到設備,並且需要循環來複制其他問題。我指出的問題是一個討論如何處理指針數組的問題。你是否認爲它對你的問題沒有影響,這基本上是如何處理指針數組的? –

回答

0

'cuMemcpyHtoD'可用於將對象指針複製到設備。

我複製指針設備JCuda這樣的:

private void updateArrayPointer(CUdeviceptr arrayPointer, CUdeviceptr[] elementPtrs) { 
    JCudaDriver.cuMemcpyHtoD(arrayPointer, Pointer.to(elementPtrs), maxBatchSize * Sizeof.POINTER); 
} 

這裏, 'arrayPointer' 就像是在CUDA內核一個 '浮動**'。許多CUdeviceptr(如float *)先分配給CPU上的elementPtrs,然後像上面那樣調用cuMemcpyHtoD在設備上形成一個'float **'。 Sizeof.POINTER在64位系統上爲8。