CUDA通訊機制

2021-05-02 17:59:55 字數 2516 閱讀 6705

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位址,協議,埠 就可以標識網路的程序...