2011-09-11 112 views
0

代碼不起作用。但是,當我在以下代碼中評論atomicAdd時,代碼有效。cuda中的直方圖計算

這是什麼原因?
從哪裏可以獲得浮點數組的直方圖代碼?

__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 
      } 
     } 
    } 
+0

您可能要檢查'indexInHis'有效前夕到'atomicAdd'。 –

+1

你是什麼意思,不起作用?它是否編譯?您的硬件是否支持全局原子添加(Cuda Capabiltiy> 1.0)?你是否在內核代碼中包含了雜注? –

+0

我檢查了indexInHis它是正確的。我的cuda能力是1.1。 – user570593

回答

3

看看由Jason Sanders和愛德華Kandrot通過實例CUDA的第9章。它涵蓋原子,並通過一個計算8位整數直方圖的簡單示例。第一個版本爲每個值使用原子添加,但這種工作非常緩慢。該示例的精煉版本計算共享內存中每個塊的直方圖,然後將所有直方圖合併到全局內存中以獲得最終結果。你的代碼就像第一個版本,一旦你得到它的工作,你會想讓它更像快速改進版本。

您可以從本書下載的例子,看看兩個版本:CUDA by Example downloads

你似乎並沒有給出完整的代碼或錯誤信息,所以我不能說究竟是什麼在你的代碼去錯了。這裏有一些想法:

  • 您需要使用支持原子能公司(即不是默認的1.0架構的目標更高)
  • 索引和索引的限制顯得有些複雜,我會仔細檢查那些
  • 的架構編譯
  • 你的bin計算可能在向區號碼之外的有效範圍爲retHis,我會使用的返回值前加一些檢查,至少對於調試