2011-05-18 58 views
2

我對CUDA真的很陌生,並且一直在嘗試遍歷2D數組。我有下面的代碼在普通C作爲預期其工作原理:CUDA替代2D塊的雙倍空間

for (ty=0;ty<s;ty++){ 
     if (ty+pixY < s && ty+pixY>=0){ 
      for(tx=0;tx<r;tx++){ 
       T[ty/3][tx/3] += (tx+pixX<s && tx+pixX>=0) ? 
       *(image +M*(ty+pixY)+tx+pixX) * *(filter+fw*(ty%3)+tx%3) : 0; 
      } 
     } 
    } 

也許我得到一些錯誤,但不會將此代碼轉換爲CUDA如下?

tx = threadIdx.x; 
ty = threadIdy.y; 

T[ty/3][tx/3] += (tx+pixX<s && tx+pixX>=0) ? 
       *(image +M*(ty+pixY)+tx+pixX) * *(filter+fw*(ty%3)+tx%3) : 0; 

只要我定義我的內核參數dimGrid(1,1,1)blockDim(r,s,1)

我問,因爲我得到意想不到的效果。另外,如果我正確地聲明和分配我的數組作爲2D CUDA數組而不是一個大的一維數組,這會有幫助嗎?

感謝您的幫助。

回答

4

撇開數組分配和索引方案是否正確(我不確定是否有足夠的信息來確認),以及整數除法和模數慢和應該避免的事實,你有一個更重要的問題 - 記憶力競賽。

您正在使用的單個塊內的多個線程將嘗試同時讀取和寫入T的相同條目。 CUDA對這種操作的正確性不作任何保證,它幾乎肯定不會起作用。最簡單的選擇是僅使用單個線程來計算每個T[][]條目,而不是三個線程。這消除了內存競賽。

+0

剛剛讀「記憶競賽」使問題看起來很明顯。非常感謝你的幫助! – cookM 2011-05-18 07:56:25