2013-02-01 100 views
4

如果i是像下面那樣的隨機行走(每個索引不是唯一的),並且存在填充零的設備向量A帶推力的直方圖計算

{0, 1, 0, 2, 3, 3, ....} 

難道推力可以使A[i]自動遞增,操作A後,可能看起來像

//2 means appears count of 0's 
//1 means appears count of 1's 
//1 means appears count of 2's 
//2 means appears count of 3's 
{2, 1, 1, 2} 

我試過幾種情況,但這些情況下,只有正常工作時A是主機向量,我猜是因爲推力做平行,它以前的結果不會影響新的結果,結果可能看起來像 //只計數一次,無論索引出現多少次 {1,1,1, 1}

可以用設備向量A和隨機遊走索引向量來實現我的目標嗎?

+3

thrust :: sort then thrust :: reduce_by_key – kangshiyin

+0

我嘗試了排序,但性能不夠好,所以現在我使用「主機向量+直方圖」方法來實現我的目標。新方法的執行時間(包含設備<-->主機開銷)比排序版本短。我對更好的解決方案感興趣,並在這裏問。 – user1995868

+0

http://docs.nvidia.com/cuda/cuda-samples/index.html#cuda-histogram – kangshiyin

回答

2

如果您正在尋求通過推力直方圖計算,那麼你不妨注意,有一個Thrust documentation example提供兩種不同的算法:

  1. 密集直方圖,使用sort到數組排序,然後使用upper_bound確定一個統計直方圖,最後用adjacent_difference來計算直方圖;
  2. 稀疏直方圖,使用sort對數組進行排序,然後使用reduce_by_key進行排序,如@Eric在其評論中所述。

從這兩個線程

我會說以上是使用Thrust實現直方圖的唯一兩種方法。我已經在開普勒K20c卡上計時了兩種方法,並且這些已經是時間:

  • N=1024*16; # bins = 16*16;密集= 2.0ms; Sparse = 2.4ms;
  • N=1024*128; # bins = 16*128;密集= 3.4ms;稀疏= 3.1ms;

考慮到時間確實取決於輸入數組,因此我認爲結果看起來並沒有顯着不同。

應當注意到,CUDA樣本提供一個直方圖計算的例子,但它是爲64256倉優化,所以它是不均質於上述推力代碼。