2012-08-02 201 views
0

有人可以啓發我:在CUDA中並行/同時執行塊嗎? 換句話說,如果兩個不同的塊嘗試寫入相同的全局地址,即globalPtr [12],是否存在丟失更新問題?Cuda並行執行

(我要求這個作爲我已閱讀,在CUDA並行執行單元是warp = 32個線程。)

回答

2

是,多個塊並行執行,所以訪問全局存儲器需要是原子的,如果多個線程需要訪問相同的地址。無論是同一個塊中的兩個線程還是不同塊中的兩個線程,這都適用。

+0

謝謝保羅,雖然同一個塊內的兩個線程如果屬於同一個warp就需要是原子的。如果沒有,那麼他們不會並行執行,到目前爲止我的知識。 – thanasisanthopoulos 2012-08-03 09:15:34

2

是的,如果CUDA設備具有多個warp調度程序,則可以在多個塊之間並行執行。

具有計算能力2.1的CUDA設備具有兩個warp調度程序,因此可以同時執行來自兩個不同warp(來自同一個塊或不同塊的指令)的指令。

具有計算能力3.0的CUDA設備具有四個warp調度程序,並且可以爲每個warp執行準備執行的兩條獨立指令。

請注意,即使沒有warp之間的併發執行,調度程序有多個塊可用也是有利的,這樣如果warp被阻塞等待內存操作完成,調度程序可以切換到另一warp執行,所以核心不會閒置。

可以駐留在覈心上的調度程序可以切換到的核心數量因計算能力而異。

如果您只定義了與調度程序一樣多的塊,則無法實現設備的全部計算潛力。如果你的代碼有很多內存I/O,尤其如此 - 一種「隱藏」內存延遲的方法是確保有足夠的塊/ warp可用,這樣調度器總是有一個準備好的warp來切換到什麼時候其中一個經紗空轉,等待內存I/O。

無論您當前的硬件是否可以同時執行多個變形,只要您有多個變形讀取和寫入相同的內存地址,就應該使用原子I/O或鎖定。即使在任務交換單核執行中,寫後寫後工件(「丟失更新」)也可以表現出來。

+0

這非常明確,謝謝。這讓我去閱讀相關的Cuda文檔以獲得更好的理解。我編碼的內核使用嵌套循環來更新32 * 32共享內存。我明白,如果內核是32線程發出的,那麼我可以保證在我的共享內存中沒有競爭條件。不過,我發佈256線程。有沒有什麼辦法可以保證除了使用諸如if(threadIdx.x thanasisanthopoulos 2012-08-03 11:36:29

+0

那麼,你可以把它拉回到每塊只能運行32個線程,但是在更大的CUDA鐵上,我懷疑這會造成比使用原子寫入更多的性能問題。 – dthorpe 2012-08-03 19:27:14