2017-07-12 34 views
1

這會導致共享內存不一致嗎?CUDA:來自不同經線但同一個塊的2個線程嘗試寫入相同的SHARED內存位置:危險?

我的內核的代碼看起來是這樣的(僞代碼):

__shared__ uint histogram[32][64]; 

uint threadLane = threadIdx.x % 32; 

for (data){ 
    histogram[threadLane][data]++; 
} 

這會不會導致碰撞,因爲,在具有64個線程的塊,ID爲 「x」 和「線程(X + 32) 「會經常寫入矩陣中的相同位置?

該程序計算給定矩陣的直方圖。我有一個相同的CPU程序。由GPU計算的直方圖一直比CPU計算的直方圖低1/128,我無法弄清楚原因。

+0

您能否提供一些更詳細的信息,特別是關於'data'與threadIdx以及啓動配置有關的內容?編譯的東西會更好。 –

回答

1

這很危險。它導致競爭條件。

如果您無法保證塊中的每個線程都具有對共享內存中某個位置的唯一寫訪問權​​限,那麼您遇到了問題,因爲您需要通過同步來解決問題。

看看本文使用SM的直方圖計算的正確和有效的方式:http://developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/projects/histogram64/doc/histogram.pdf

注意,是很多圖書館的網絡,使您可以在計算一行,Thrust for instance直方圖。

+0

謝謝你immensly!這開始讓我發瘋。我將不得不以不同的方式重做整個事情。 – ismarlowe

+0

看看'cuda-memcheck --tool racecheck':http://docs.nvidia.com/cuda/cuda-memcheck/index.html#using-racecheck和https://stackoverflow.com/questions/13861017/cuda-racecheck-shared-memory-array-and-cudadevicesynchronize –

+0

有沒有辦法強制一個warp在另一個接口之前完成某個任務?或者,是否可以指示機器以原子方式訪問共享內存? – ismarlowe

相關問題