2016-01-18 53 views
4

我試圖理解用GPU編碼。我在理解GPU線程與全局內存的交互方面有點麻煩。線程與全局內存的交互

我知道我們什麼時候分配或複製的東西在設備上它是由參考實現。但是當我們試圖在一個線程中訪問全局內存時,到底發生了什麼? 是否所有的線程都嘗試訪問內存,導致串行執行,或者他們都做出自己的副本或其他東西?

任何幫助將不勝感激。

+1

不是重複的,但您可能也會閱讀[這裏](http://stackoverflow.com/q/15029765/1938163) –

+0

謝謝!這很有幫助。 –

回答

1

是否所有的線程都試圖在同一時間訪問內存導致串行執行,或者他們都做自己的副本或其他東西?

沒有,如果你想要並行計算。從兩個不同的位置和一個寫到另一個位置

int idx = blockIdx.x * blockDim.x + threadIdx.x; 
outArr[idx] = a[idx] + b[idx]; 

的網格內的每個線程會做兩次讀取(右):例如,添加並行陣列你會怎麼做。全部在全球內存中。您可以讓全部線程從全局內存中的相同位置讀取/寫入。但是,爲了防止競爭狀況,您需要使用atomic functions

從全局內存讀取/寫入可能會很慢(這是DRAM),特別是線程不從共存內存讀取時(特別是:如果線程0,1,2,3從0x0,0x4,0x8,0xc讀取那麼它是共同的)。要了解關於CUDA內存模型的更多信息,可以閱讀CUDA編程指南中的第2.4節。

希望有幫助!