OpenMP筆記(二)

原文:https://www.bearoom.xyz/2019/02/18/openmp2/web

OpenMP是由三部分組成的:指令、庫函數和環境變量。併發

1、指令

在C/C++中使用OpenMP須要用到的指令通常是:
#pragma omp 指令 [子句[子句]…]

指令有如下常見的11種:ide

  1. atomic 內存位置將會原子更新(Specifies that a memory location that will be updated atomically.)
  2. barrier 線程在此等待,直到全部的線程都運行到此barrier。用來同步全部線程。
  3. critical 其後的代碼塊爲臨界區,任意時刻只能被一個線程運行。
  4. flush 全部線程對全部共享對象具備相同的內存視圖(view of memory)
  5. for 用在for循環以前,把for循環並行化由多個線程執行。循環變量只能是整型
    • parallel for, parallel 和 for語句的結合,也是用在一個for循環以前,表示for循環的代碼將被多個線程並行執行。
  6. master 指定由主線程來運行接下來的程序。
  7. ordered 指定在接下來的代碼塊中,被並行化的 for循環將依序運行(sequential loop)
  8. parallel 表明接下來的代碼塊將被多個線程並行各執行一遍。
  9. sections 將接下來的代碼塊包含將被並行執行的section塊。
    • parallel sections,parallel和sections兩個語句的結合
  10. single 以後的程序將只會在一個線程(未必是主線程)中被執行,不會被並行執行。
  11. threadprivate 指定一個全局或者靜態變量是線程局部存儲(thread local storage),也就是不一樣並行塊中的同個線程裏,這個變量是全局的。

子句有如下常見的幾種:svg

  1. copyin 讓threadprivate的變量的值和主線程的值相同。
  2. copyprivate 不一樣線程中的變量在全部線程中共享。
  3. default  用來指定並行處理區域內的變量的使用方式,缺省是shared。
  4. firstprivate 對於線程局部存儲的變量,其初值是進入並行區以前的值。
  5. if 判斷條件,可用來決定是否要並行化。
  6. lastprivate 在一個循環並行執行結束後,指定變量的值爲循環體在順序最後一次執行時獲取的值,或者#pragma sections在中,按文本順序最後一個section中執行獲取的值。
  7. nowait 忽略barrier的同步等待。
  8. num_threads 設置線程數量的數量。默認值爲當前計算機硬件支持的最大併發數。通常就是CPU的內核數目。超線程被操做系統視爲獨立的CPU內核。
  9. ordered 使用於 for,能夠在將循環並行化的時候,將程序中有標記 directive ordered 的部分依序運行。
  10. private 指定變量爲線程局部存儲。
  11. reduction Specifies that one or more variables that are private to each thread are the subject of a reduction operation at the end of the parallel region.
  12. schedule 設置for循環的並行化方法;有 dynamic、guided、runtime、static 四種方法。shared 指定變量爲全部線程共享。
    • (1)、schedule(static, chunk_size) 把chunk_size數目的循環體的執行,靜態依序指定給各線程。
    • (2)、 schedule(dynamic, chunk_size) 把循環體的執行按照chunk_size(缺省值爲1)分爲若干組(即chunk),每一個等待的線程得到當前一組去執行,執行完後從新等待分配新的組。
    • (3)、schedule(guided, chunk_size) 把循環體的執行分組,分配給等待執行的線程。最初的組中的循環體執行數目較大,而後逐漸按指數方式降低到chunk_size。
    • (4)、schedule(runtime) 循環的並行化方式不在編譯時靜態肯定,而是推遲到程序執行時動態地根據環境變量OMP_SCHEDULE 來決定要使用的方法。
  13. shared 指定變量爲全部線程共享。

2、庫函數

庫函數(Run-Time Library  Routines)在頭文件omp.h中有聲明: ![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20190901170408893.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l6MnpjeA==,size_16,color_FFFFFF,t_70) 1.void omp_set_num_threads(int _Num_threads):在後續並行區域設置線程數,此調用隻影響調用線程所遇到的同一級或內部嵌套級別的後續並行區域。說明:此函數只能在串行代碼部分調用。

2.int omp_get_num_threads(void):返回當前線程數目。說明:若是在串行代碼中調用此函數,返回值爲1。函數

3.int omp_get_max_threads(void):若是在程序中此處遇到未使用 num_threads() 子句指定的活動並行區域,則返回程序的最大可用線程數量。說明:能夠在串行或並行區域調用,一般這個最大數量由omp_set_num_threads()或OMP_NUM_THREADS環境變量決定。oop

4.int omp_get_thread_num(void):返回當前線程id.id從1開始順序編號,主線程id是0。ui

5.int omp_get_num_procs(void):返回程序可用的處理器數。atom

6.void omp_set_dynamic(int _Dynamic_threads):啓用或禁用可用線程數的動態調整.(缺省狀況下啓用動態調整.)此調用隻影響調用線程所遇到的同一級或內部嵌套級別的後續並行區域。若是 _Dynamic_threads 的值爲非零值,啓用動態調整;不然,禁用動態調整。操作系統

7.int omp_get_dynamic(void):肯定在程序中此處是否啓用了動態線程調整。啓用了動態線程調整時返回非零值;不然,返回零值。線程

8.int omp_in_parallel(void):肯定線程是否在並行區域的動態範圍內執行。若是在活動並行區域的動態範圍內調用,則返回非零值;不然,返回零值.活動並行區域是指 IF 子句求值爲 TRUE 的並行區域。

9.void omp_set_nested(int _Nested):啓用或禁用嵌套並行操做。此調用隻影響調用線程所遇到的同一級或內部嵌套級別的後續並行區域。_Nested 的值爲非零值時啓用嵌套並行操做;不然,禁用嵌套並行操做。缺省狀況下,禁用嵌套並行操做。

10.int omp_get_nested(void):肯定在程序中此處是否啓用了嵌套並行操做.啓用嵌套並行操做時返回非零值;不然,返回零值,互斥鎖操做嵌套鎖操做功能。
11.void omp_init_lock(omp_lock_t * _Lock):
12.void omp_init_nest_lock(omp_nest_lock_t * _Lock):初始化一個(嵌套)互斥鎖。
13.void omp_destroy_lock(omp_lock_t * _Lock):
14.void omp_destroy_nest_lock(omp_nest_lock_t * _Lock):結束一個(嵌套)互斥鎖的使用並釋放內存。

15.void omp_set_lock(omp_lock_t * _Lock);
16.void omp_set_nest_lock(omp_nest_lock_t * _Lock);得到一個(嵌套)互斥鎖.

17.void omp_unset_lock(omp_lock_t * _Lock):
18.void omp_unset_nest_lock(omp_nest_lock_t * _Lock):釋放一個(嵌套)互斥鎖。

19.int omp_test_lock(omp_lock_t * _Lock):
20.int omp_test_nest_lock(omp_nest_lock_t * _Lock):試圖得到一個(嵌套)互斥鎖,並在成功時放回真(true),失敗是返回假(false)。

21.double omp_get_wtime(void):獲取wall clock time,返回一個double的數,表示從過去的某一時刻經歷的時間,通常用於成對出現,進行時間比較。 此函數獲得的時間是相對於線程的,也就是每個線程都有本身的時間。

22.double omp_get_wtick(void):獲得clock ticks的秒數。

3、環境變量

OpenMP的第三部分是環境變量,以下

在這裏插入圖片描述

一、OMP_SCHEDULE
僅適用於DO,PARALLEL DO(Fortran)和
(C / C ++)指令並行,它們的schedule子句設置爲RUNTIME。此變量的值肯定如何在處理器上調度循環的迭代。例如:

export OMP_SCHEDULE="guided, 4" 
export OMP_SCHEDULE="dynamic"

二、OMP_NUM_THREADS 設置執行期間要使用的最大線程數。例如:

``` export OMP_NUM_THREADS=8 ```

三、OMP_DYNAMIC
啓用或禁用動態調整可用於執行並行區域的線程數。有效值爲TRUE或FALSE。例如

export OMP_DYNAMIC=TRUE

四、OMP_PROC_BIND
啓用或禁用綁定處處理器的線程。有效值爲TRUE或FALSE。例如:

export OMP_PROC_BIND=TRUE

五、OMP_NESTED
啓用或禁用嵌套並行性。有效值爲TRUE或FALSE。例如:

export OMP_NESTED=TRUE

六、OMP_STACKSIZE
控制建立(非主)線程的堆棧大小。例如

export OMP_STACKSIZE=2000500B 
export OMP_STACKSIZE="3000 k " 
export OMP_STACKSIZE=10M 
export OMP_STACKSIZE=" 10 M " 
export OMP_STACKSIZE="20 m " 
export OMP_STACKSIZE=" 1G" 
export OMP_STACKSIZE=20000

七、OMP_WAIT_POLICY


提供有關等待線程的所需行爲的OpenMP實現的提示。兼容的OpenMP實現可能會也可能不會遵照環境變量的設置。有效值爲ACTIVE和PASSIVE。ACTIVE指定等待線程應該主動處於活動狀態,即在等待時消耗處理器週期。PASSIVE指定等待線程應該主要是被動的,即在等待時不消耗處理器週期。ACTIVE和PASSIVE行爲的細節是實現定義的。例子:
export OMP_WAIT_POLICY=ACTIVE 
export OMP_WAIT_POLICY=active 
export OMP_WAIT_POLICY=PASSIVE 
export OMP_WAIT_POLICY=passive

八、OMP_MAX_ACTIVE_LEVELS
控制嵌套活動並行區域的最大數量。此環境變量的值必須是非負整數。若是請求的OMP_MAX_ACTIVE_LEVELS值大於實現能夠支持的嵌套活動並行級別的最大數量,或者該值不是非負整數,則程序的行爲是實現定義的。例:

export OMP_MAX_ACTIVE_LEVELS=2

九、OMP_THREAD_LIMIT
設置要用於整個OpenMP程序的OpenMP線程數。此環境變量的值必須是正整數。若是請求的OMP_THREAD_LIMIT值大於實現能夠支持的線程數,或者該值不是正整數,則程序的行爲是實現定義的。例:

export OMP_THREAD_LIMIT=8

> 嫋嫋城邊柳, 青青陌上桑。 提籠忘採葉, 昨夜夢漁陽。
>   *--張仲素 《春閨思》*
相關文章
相關標籤/搜索