2011-05-18 35 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