cuda體系架構支援怎麼樣的通訊方法呢?往下看嘍@_@
1.
__syncthreads()
block
內的執行緒同步。
block
內所有執行緒都執行到這一位置(bar指令),先到的要等後來的,到齊了後再繼續後面的任務。執行結果對
block
內所有執行緒可見
2.
memory fence
l__threadfence()
grid
內的執行緒同步。保證該語句前的,
grid
中所有執行緒發出的訪存指令(對
global memory / shared memory
)都已結束。執行結果對
grid
內所有執行緒可見
l__threadfence_block()
block
內的執行緒同步。保證該語句前的,
block
中所有執行緒發出的訪存指令(對
global memory / shared memory
)都已結束。執行結果對
block
內所有執行緒可見
3.
cuda2.2
中引入,允許多個
gpu裝置從核心程式中直接訪問同一塊
pinned memory
。cpu/gpus
共用一塊記憶體,所以特別要注意做好同步。
4.
cudathreadsynchronize()
gpu與
cpu同步。
kernel
啟動後控制權非同步返回,該函式用以確定所有裝置端線程均已執行結束。
5.
volatile
__global__ void mykernel(int* result,int* myarray)
上面這段程式,
myarray
初值為1
。這段程式跑出來的結果
result全是1
,說明計算
ref2
時myarray[tid]
並如有如約變成2(由
tid-1
修改),程式設計師是想用改變後的值
2來著。為什麼會出現這種情況呢?
是這樣,在計算
ref1
時從視訊記憶體取出
myarray[tid]
,然後在計算
ref2
時compiler
不會再去顯訪問一次而是去復用剛剛取到的結果,
myarray[tid+1]=2
這句操作呢是要寫回視訊記憶體,所以嘍
^o^
可以通過加上
volatile
關鍵字來解決。
__global__ void mykernel(int* result,volatile
int* myarray)
volatile
限定符將變數宣告為敏感變數,
compiler
認為其它執行緒可能隨時會修改變數的值,因此每次對該變數的引用都會被編譯成一次真實的訪存指令。注意,在上面的**中即使將
myarray
宣告為valatile
仍不能確保
ref的值是
2,這是因為執行緒
tid可能在
myarray[tid]
被賦為2
之前就已經進行了讀操作,怎麼辦呢?做乙個同步就好嘍。
6.
atomic function
當多個執行緒同時訪問
global memory / shared memory
同一位置時,原子函式來確保對這個
32-/64-bit
字的read-modify-write
原子操作。保證每個執行緒能夠實現對共享可寫資料的互斥操作:在乙個操作完成前,其它任何執行緒都無法訪問此位址。
7.
vote
cuda2.0
引入的新特性,
1.2計算能力的硬體支援。
vote
指令作用域是乙個
warp
。int
__all(int predicate); //warp
中所有執行緒的判斷表示式結果為真,則返回1,否則0
int__any(int predicate); //warp
中只要乙個thread的判斷表示式結果為真,則返回1,否則0
CUDA通訊機制
分類 gpu cuda opencl2009 08 25 21 57 1479人閱讀 收藏舉報 cuda compiler thread function任務 cuda體系架構支援怎麼樣的通訊方法呢?往下看嘍 1.syncthreads block內的執行緒同步。block內所有執行緒都執行到這一位...
Socket通訊機制
socket套接字起源於美國泊克利大學.方便了開發網路應用程式.tcp面向連線的可靠傳輸協議,具有資料確認和資料重傳機制.保證了傳送資料一定能到達通訊的對方.對資料完整性要求比較高的場合使用 upd協議無連線,不可靠的傳輸協議.不具有資料確認和資料重傳機制,對資料完整性要求比較低的場合使用 ip 網...
socket 通訊機制
如何唯一標識乙個程序 在本地可以通過程序pid來唯一標識乙個程序,但是在網路中這是行不通的。其實tcp ip協議族已經幫我們解決了這個問題,網路層的 ip位址 可以唯一標識網路中的主機,而傳輸層的 協議 埠 可以唯一標識主機中的應用程式 程序 這樣利用三元組 ip位址,協議,埠 就可以標識網路的程序...