簡體   English   中英

堆內存上具有cudaMemCpy2D()連續行的2D數組

[英]2D arrays with contiguous rows on the heap memory for cudaMemCpy2D()

CUDA文檔建議將cudaMemCpy2D()用於2D陣列(對於3D陣列,則類似地使用cudaMemCpy3D() ),而不是cudaMemCpy()以獲得更好的性能,因為前者會更適當地分配設備內存。 另一方面,所有的cudaMemCpy函數(如memcpy()都需要連續分配內存。

如果我創建我的(宿主)數組例如float myArray[h][w];這很好float myArray[h][w]; 但是,如果使用以下方法,則很可能無法正常工作:

float** myArray2 = new float*[h];
for( int i = 0 ; i < h ; i++ ){
   myArray2[i] = new float[w];
}

除了當人們試圖將CUDA實施到現有項目中時,這不是一個大問題,這是我面臨的問題。 現在,我創建一個臨時的1D數組,將2D數組的內容復制到其中,並使用cudaMemCpy()並在內核啟動后重復整個過程以獲得結果,但這似乎不是一種優雅/有效的方法。

有沒有更好的方法來處理這種情況? 具體來說,有沒有一種方法可以在具有連續分配的行的堆上創建真正的2D數組,以便可以使用cudaMemCpy2D()

PS:在以下類似的帖子中找不到該問題的答案:

分配大數組,然后使用指針算法查找行的實際開頭。

float* bigArray = new float[h * w]
float** myArray2 = new float*[h]
for( int i = 0 ; i < h ; i++ ){
   myArray2[i] = &bigArray[i * w];
}

您的myArray2指針數組為您提供C / C ++風格的二維數組行為,bigArray為您提供CUDA所需的連續內存塊。

暫無
暫無

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

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