OpenMP編程總結表

 

    本文對OpenMP 2.0的所有語法——Macro(宏定義)、Environment Variables(環境變量)、Data Types(數據類型)、Compiler Directives(編譯指導語句)、Run-time Library Functions(庫函數)的含義用表格進行總結,以便於快速使用OpenMP。若是想詳細瞭解表格中項的含義,或者想要看一些實例,請參閱個人另外一篇博文:OpenMP共享內存並行編程詳解html

 

1. Macroexpress

_OPENMP編程

 

2. Environment Variables緩存

Environment Variableside

Description函數

OMP_SCHEDULEoop

「#pragma omp [parallel] for schedule(runtime)」時 C++ for屢次迭代劃分到多個線程的方式,取值:"static[,chunk_size]", "dynamic [,chunk_size]", "guided[,chunk_size]"測試

OMP_NUM_THREADSui

默認線程數,取值:numberatom

OMP_DYNAMIC

默認是否使能動態調整線程數,取值:"TURE", "FALSE"

OMP_NESTED

默認是否使能並行嵌套(使能後須要實現支持),取值:"TURE", "FALSE"

 

3. Data Types

Data Types

Description

omp_lock_t

記錄lock的狀態

omp_nest_lock_t

記錄lock的狀態,還有嵌套層數

 

4. Compiler Directives

Directive/syntax

Description

Clauses(optional)

#pragma omp parallel [clause[ [, ]clause] ...] new-line
    structured-block

定義一個parallel region,該parallel region將被多個線程並行執行

if(scalar-expression):條件並行化

num_threads(integer-expression):設置線程數

private, firstprivate, shared, default, reduction, copyin見表末

#pragma omp for [clause[[,] clause] ... ] new-line
    for-loop

將C++ for循環的屢次迭代劃分給多個線程(C++ for需符合必定限制),塊末尾隱含一個barrier

ordered:配合ordered directive使用

schedule(kind[,chunk_size]):C++ for屢次迭代的劃分方式,參數:static[,chunk_size], dynamic[,chunk_size], guided[,chunk_size], runtime

nowait:禁止隱含的barrier

private, firstprivate, lastprivate, reduction見表末

#pragma omp sections [clause[[,] clause] ...] new-line
{
    [#pragma omp section new-line]
        structured-block
    [#pragma omp section new-line
        structured-block ]
    ...
}

定義包含多個section塊的代碼區,這些section塊將被多個線程並行執行,section塊用section定義,塊末尾隱含一個barrier

nowait:禁止隱含的barrier

private, firstprivate, lastprivate, reduction見表末

#pragma omp single [clause[[,] clause] ...] new-line
    structured-block

代碼將僅被一個線程執行,具體是哪一個線程不肯定,塊末尾隱含一個barrier

nowait:禁止隱含的barrier

private, firstprivate, copyprivate見表末

#pragma omp parallel for [clause[[,] clause] ...] new-line
    for-loop

同只含一個for directive 的parallel region

Parallel和for的clauses,除nowait外

#pragma omp parallel sections [clause[[,] clause] ...] new-line
{
    [#pragma omp section new-line]
        structured-block
    [#pragma omp section new-line
        structured-block ]
    ...
}

同只含一個sections directive 的parallel region

Parallel和sections的clauses,除nowait外

#pragma omp master new-line
    structured-block

代碼將僅被主線程執行,塊末尾沒有隱含的barrier

#pragma omp critical [(name)] new-line
    structured-block

定義一個臨界區,保證同一時刻只有一個線程訪問臨界區

#pragma omp barrier new-line

定義一個同步,全部線程都執行到該行後,全部線程才繼續執行後面的代碼

#pragma omp atomic new-line
    expression-stmt

變量將被原子的更新,expression-stmt需是 a++, a--, ++a, --a, a?=expr 之一,其中 ? 能夠爲 +, *, -, /, &, ^, |, <<, >>

#pragma omp flush [(variable-list)] new-line

全部線程對全部共享對象具備相同的內存視圖(view of memory),例如,確保將變量的新值寫回內存或從內存讀取,而不是使用之前讀到寄存器或緩存中的值

#pragma omp ordered new-line
    structured-block

使用在有ordered clause的for directive(或parallel for)中,代碼將被按迭代次序執行(像串行程序同樣)

#pragma omp threadprivate(variable-list) new-line

將全局或靜態變量聲明爲線程私有的。

Data-Sharing Attribute Clauses

private(variable-list):每一個線程有一個變量的私有副本,調用默認構造函數初始化
可用於的directivesparallel, for, sections, single

firstprivate(variable-list):private基礎上,拷貝共享變量值初始化線程私有副本
可用於的directivesparallel, for, sections, single

lastprivate(variable-list):private基礎上,將執行最後一次迭代(for)或最後一個section塊(sections)的線程的私有副本拷貝到共享變量
可用於的directivesfor, sections

shared(variable-list):聲明變量爲線程間共享,相對於private
可用於的directivesparallel

default(shared|none):參數shared同於將全部變量用share clause定義,參數none指示對沒有用private, shared, reduction, firstprivate, lastprivate clause定義的變量報錯
可用於的directivesparallel

reduction(op:variable-list):定義對變量進行歸約操做
可用於的directivesparallel, for, sections

copyin(variable-list):讓threadprivate聲明的變量的值和主線程的值相同
可用於的directivesparallel

copyprivate(variable-list):不一樣線程中的私有變量的值在全部線程中共享
可用於的directivessingle

 

5. Run-time Library Functions

    要使用這些函數,須要 #include<omp.h> 。

Function

Description

Execution Environment Functions

void omp_set_num_threads(int);

設置默認parallel region的線程數

int omp_get_num_threads();

返回該函數所在parallel region的線程數

int omp_get_max_threads();

返回值等於或大於該函數所在處的未使用num_threads clause的parallel region的線程數,一般這個最大數量由omp_set_num_threads()或OMP_NUM_THREADS環境變量決定

int omp_get_thread_num();

返回線程編號,主線程編號爲0

int omp_get_num_procs();

返回可用處理器數(通常等於CPU物理核心數)

int omp_in_parallel();

若是在parallel region內,則返回非0(通常爲1),不然返回0

void omp_set_dynamic(int);

設置是否使能運行時動態調整parallel region的線程數,非0使能,0不使能

int omp_get_dynamic();

當前使能運行時動態調整parallel region的線程數,返回非0(通常爲1),不然返回0

void omp_set_nested(int);

設置是否使能並行嵌套,非0使能,0不使能(若使能須要實現支持)

int omp_get_nested();

當前使能並行嵌套,返回非0(通常爲1),不然返回0

Lock Functions

void omp_init_lock(omp_lock_t*);

初始化一個簡單Lock

void omp_destroy_lock(omp_lock_t*);

刪除一個簡單Lock

void omp_set_lock(omp_lock_t*);

等待直到Lock可用,而後鎖上該Lock

void omp_unset_lock(omp_lock_t*);

釋放該Lock使其可用

void omp_test_lock(omp_lock_t*);

測試當前Lock,若可用返回非0,不然返回0

void omp_init_nest_lock(omp_nest_lock_t*);

初始化一個可嵌套Lock

void omp_destroy_nest _lock(omp_nest_lock_t*);

刪除一個可嵌套Lock

void omp_set_nest _lock(omp_nest_lock_t*);

等待直到可嵌套Lock可用,而後鎖上該可嵌套Lock

void omp_unset_nest _lock(omp_nest_lock_t*);

釋放該可嵌套Lock使其可用

void omp_test_nest _lock(omp_nest_lock_t*);

測試當前可嵌套Lock,若可用返回非0,不然返回0

Timing Routines

double omp_get_wtick();

返回CPU時鐘週期,以秒爲單位

double omp_get_wtime();

返回從起始計時點開始逝去的時間,以秒爲單位

 

6. 參考文獻

wikipedia關於OpenMP條目

OpenMP 2.0 Specification

MSDM上關於OpenMP條目

《MPI與OpenMP並行程序設計(C語言版)》第17章,Michael J. Quinn著,陳文光等譯,清華大學出版社,2004

相關文章
相關標籤/搜索