cuda中的直方图计算

时间:2011-09-11 14:55:04

标签: cuda

代码不起作用。但是,当我在以下代码中评论atomicAdd时,代码可以正常工作。

原因是什么?
我在哪里可以得到浮点数组的直方图代码?

   __global__ void calculateHistogram(float *devD, int* retHis)
   {
      int globalLi = getCurrentThread(); //get the thread ID
      if(globalLi>=0 && globalLi<Rd*Cd*Dd)
      {
          int r=0,c=0,d=0;
          GetInd2Sub(globalLi, Rd, Cd, r, c, d); //some calculations to get r,c,d
          if(r>=stYd && r<edYd && c>=stXd && c<edXd && d>=stZd && d<edZd)
          {
            //calculate the histogram
            int indexInHis = GetBinNo(devD[globalLi]);  //get the bin number in the histogram
            atomicAdd(&retHis[indexInHis],1); //when I comment this line the code works
          }
       }
    }

1 个答案:

答案 0 :(得分:3)

看看Jason Sanders和Edward Kandrot的 CUDA by Example 的第9章。它涵盖了原子,并通过一个简单的例子来计算8位整数的直方图。第一个版本为每个值使用原子添加,但是效果很慢。该示例的精炼版本为共享内存中的每个块计算直方图,然后将所有直方图合并到全局内存中以获得最终结果。您的代码就像第一个版本一样,一旦您开始工作,您将希望使其更像快速精炼版本。

您可以从书中下载示例,查看两个版本:CUDA by Example downloads

您似乎没有提供完整的代码或错误消息,因此我无法确切地说出您的代码中出现了什么问题。以下是一些想法:

  • 您需要使用支持原子的架构(即大于默认的1.0架构目标)进行编译
  • 索引和索引限制看起来有点复杂,我会仔细检查那些
  • 您的bin计算可能会在retHis的有效范围之外提供bin编号,我会在使用返回值之前添加一些检查,至少在调试时