Preface:
之前對於多執行緒和 OpenMP 的平行化已經做了些簡單的介紹,有興趣的可以回頭參考《簡易的程式平行化方法-OpenMP(一)》。而由於最近看了些資料,也做了些測試,所以主要可能想來講最近學的一些語法吧.
OpenMP Syntax:
而 function 的部份是獨立呼叫的,其實在一般的情況下,似乎不大會用到。而 directive 和 clause 的用法,大致上應該是:
的形式。像之前 #pragma omp parallel for,實際上 parallel 和 for 都是 directive;所以語法實際上可以拆開成 #pragma omp parallel 和 #pragma omp for 兩行。也就是:
- #pragma omp parallel for
- for( int i = 0; i < 10; ++ i )
- Test( i );
- #pragma omp parallel
- {
- #pragma omp for
- for( int i = 0; i < 10; ++ i )
- Test( i );
- }
其中,要拿來平行化,是使用 parallel、sections、for 這三項;而要指定使用單一執行緒,則是特過 master、single、crigical 這三項。barrier 則是拿來控制執行緒同步用的;ordered 是用來設定平行化的執行順序。atomic、flush、threadprivate 則應該都是用來控制變數的.
而 clause 的部份,則有下列 13 個:
而在 clause 的中,copyin、copyprivate、default、shared、private、firstprivate、lastprivate、reduction 這 8 項,都是用來控制變數在平行化時的處理方法的。ordered 和schedule 是控制平行化時的執行順序分配方法;num_threads、if 則比較像是控制執行緒的設定.
而在 Function 的部份,MSDN 列了二十來個 function;有興趣的可以直接去參考 MSDN 上或是 OpenMP tutorial 上面的說明, 這裡就不一一列出. 雖然一般可能用不到,但是在測試的時候,為了驗正執行的順序、多執行緒的關係,有時候必須要知道線在是由哪個執行緒在跑的~這時候,可以透過 omp_get_thread_num() 這個函式,來取得目前執行緒的編號已進行除錯.
Supplement:
* 簡易的程式平行化方法-OpenMP(一)簡介
* 簡易的程式平行化-OpenMP(二)語法說明
* 簡易的程式平行化-OpenMP(三)範例 parallel、section
* 簡易的程式平行化-OpenMP(四) 範例 for
* 簡易的程式平行化-OpenMP(五) 變數的平行化
* 簡易的程式平行化-OpenMP clause "private" 使用時機
沒有留言:
張貼留言