MIC的异步传输
關于signal和wait,屬于異步傳輸的語法,即CPU端無需等待offload語句返回,即可異步運行下面的代碼。一般用于啟動MIC代碼段后,并發執行CPU代碼,達到同步執行的目的。另外一種用法是使用offload_transfer和offload_wait語句,這兩個語句與offload類似,但只負責數據傳輸,后面不加入計算代碼。其中offload_transfer支持的參數與offload語句相同,offload_wait語句僅支持target,if,wait三個參數。兩種用法的signal和wait的使用方法是相同的,signal語句在offload代碼段結束后發送一個信號,wiat語句負責接收,所以二者一定是成對使用,但是wait語句可以一次等待多個信號,所以二者語句數量未必相等。signal和wait的參數tag,在C語言中,是傳輸的其中的一個數組的指針,即in/out/inout中的一個數組名,同時傳輸多個數組的時候,能且只能signal/wait一個數組名。例如:
1 int counter; 2 float *in1; 3 counter=10000; 4 __attribute__((target(mic))) mic_compute; 5 cpu_cpmpute(); 6 while(counter>0){ 7 #pragma offload target(mic:0) signal(in1) 8 { 9 mic_compute(); 10 } 11 cpu_compute();//此時函數與上面的MIC函數并發執行 12 #pragma offload_wait target(mic:0) wait(in) 13 counter--; 14 }例子中定義了一個MIC計算函數mic_compute和一個CPU計算函數cpu_compute。當程序執行到offload語句時,MIC端執行mic_compute并將控制權交回CPU線程,CPU在得到控制權后,執行cpu_compute函數。cpu_compute函數執行完成后,執行offload_wait語句,offload_wait查看之前offload語句發出的signal信號是否已經到達,如果沒有到達,則等待,否則繼續執行下面的語句,即counter自減。
MIC語句offload中有if的用法,可以根據條件判斷是否將該代碼放到設備端運行。如果if中的表達式為假,則代碼放到CPU端運行,否則放到MIC端運行。
#pragma offload target(mic) if(N>1000)意為當N>1000時使用MIC進行計算,否則使用CPU端進行計算。
轉載于:https://www.cnblogs.com/sdxk/p/4216947.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: 戴尔电脑怎么快速截图快捷键 戴尔电脑快速
- 下一篇: 电脑出现蓝屏怎么处理 电脑蓝屏故障的自我