2010-06-30 58 views

回答

0

原子操作比正常運行慢,因爲他們真的不能並行發生。

可能發生的情況是每次添加都會一次完成一次,但執行過程不會超過添加,直到所有線程都完成爲止,它將從代碼的角度看起來是平行的。

我不確定訪問是否會合並,但原子操作的速度損失可能會超過內存訪問速度的好處。

+0

是的。然而,我一直想知道的是,由於G200設備的內存控制器足夠智能,可以解決半扭曲的衝突和未合併的讀/寫訪問,假設內存控制器具有足夠的獨立原子操作執行單元進行處理,可能所有跨越半war的操作可以並行完成,而不會受到其他設備memoryu請求的中斷。這可能嗎? – 2010-07-30 03:36:54

+0

例如,如果每個warp執行諸如atomicAdd(baseAddress + tid,x)之類的更新,則對於半warp的所有操作可以由存儲器控制器並行完成(如果它具有16個加法器而不是1)。問題是,is這種情況? – 2010-07-30 03:41:12

1

編程時,您可以將原子操作視爲概念上平行(同時仍然滿足原子性的要求)。

優化時有助於瞭解可能發生的序列化。實際發生的情況取決於您正在運行的硬件。性能取決於原子內存單元的位置和數量,以及並行執行的內存訪問模式。

例如,如果並行尋址的位置映射到完全不同的原子單元,它們將並行發生。如果許多地址並行映射到同一個原子單元,則它們必須被序列化。原子操作性能從sm_11(計算能力1.1,最初出現的位置)到sm_2x(費米器件),一直到sm_3x(開普勒器件)均有所改善。開普勒改進了最差情況下的原子內存操作性能(其中許多原子操作訪問相同的內存地址)高達10倍,並且最佳情況下的性能(其中許多原子操作訪問非常不同的內存地址)高達2倍。開普勒的原子性能足夠高,您可以考慮使用以前可能採用了顯式並行簡化代碼的原子。有關更多詳細信息,請參見this presentation

注意:這個討論適用於全局內存原子。共享內存原子是一個不同的野獸,通常導致序列化,因此沒有很高的性能。

0

要重述一下已經說過的內容:原子操作將按順序執行,但由於所有其他操作暫停,因此它們將會同時執行(並行)。需要注意的一點是,雖然原子操作是有序的,但它們的ORDER不能被控制。