2014年3月7日 星期五

[ C 文章收集 ] 簡易的程式平行化-OpenMP(二)語法說明

來源自 這裡 
Preface: 
之前對於多執行緒和 OpenMP 的平行化已經做了些簡單的介紹,有興趣的可以回頭參考《簡易的程式平行化方法-OpenMP(一)》。而由於最近看了些資料,也做了些測試,所以主要可能想來講最近學的一些語法吧. 

OpenMP Syntax: 
* Directives: 提供指示詞中 OpenMP API 所使用的連結。(msdn)
* Clauses: 提供連結 OpenMP API 中所使用的子句 (msdn)
* Functions: 提供用於 OpenMP API 函式的連結. (msdn)

而 function 的部份是獨立呼叫的,其實在一般的情況下,似乎不大會用到。而 directive 和 clause 的用法,大致上應該是: 
#pragma omp directive-name [ clause [[[,] clause] .. ]

的形式。像之前 #pragma omp parallel for,實際上 parallel 和 for 都是 directive;所以語法實際上可以拆開成 #pragma omp parallel 和 #pragma omp for 兩行。也就是: 
  1. #pragma omp parallel for  
  2. forint i = 0; i < 10; ++ i )  
  3.   Test( i );  
實際上是: 
  1. #pragma omp parallel  
  2. {  
  3.   #pragma omp for  
  4.   forint i = 0; i < 10; ++ i )  
  5.    Test( i );  
  6. }  
所形成的。而 OpenMP 的 directive 列表如下: 
 

其中,要拿來平行化,是使用 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" 使用時機

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...