OpenMP Tutorial:https://computing.llnl.gov/tutorials/openMP/#Clauses
(1)Summary:
在OpenMP的指令中,有一系列的子句,子句中一大部分子句是和数据属性相关的,也是指令很重要的一部分。称之为”Data Scope Attribute Clauses“,或者称之为”Data-sharing Attribute Clauses“。掌握数据属性的使用是OpenMP学习和理解的很重要的一部分,由于OpenMP是基于内存共享的,所以很多数据默认就是共享的。这些数据共享属性的子句通常用于特定的指令中,一般为parallel, do/for, sections等。
(2)private子句:
private (list)
private子句指定列表中的变量对于每个线程都是私有的。
说明:private子句的特性,
对于team中的每个线程,一个同样类型的新的对象被声明;
所有对原来的对象的引用都被新对象的引用替代;
声明为private的变量被认为是对于每个线程没有初始化的。
以下是private和threadprivate的比较:
PRIVATE | THREADPRIVATE | |
---|---|---|
Data Item | C/C++: variable Fortran: variable or common block |
C/C++: variable Fortran: common block |
Where Declared | At start of region or work-sharing group | In declarations of each routine using block or global file scope |
Persistent? | No | Yes |
Extent | Lexical only - unless passed as an argument to subroutine | Dynamic |
Initialized | Use FIRSTPRIVATE | Use COPYIN |
(3)shared子句
shared (list)
shared子句将列表中的变量声明为对于team内的所有线程共享。
说明:shared子句的特性,
一个共享变量只存在于一个内存地址,所有的线程都能读或写其地址;
开发者要自己保证访问共享变量的正确性(通过同步,如critical)。
(4)default子句
default (shared | none)
default子句指定parallel区域的所有变量的默认scope。
说明:default子句的特性,
可以使用其它子句如shared/private等覆盖默认的指定;
C/C++标准没有规定可以指定private作为default(Fortran支持),当然,编译器可以自行实现;
指定none作为default的值,那么并行块中的所有变量都需要显式定义数据范围属性。
另外,对于一个parallel并行块,只能指定一个default值。
(5)firstprivate子句
firstprivate (list)
firstprivate子句结合了private子句和自动初始化的功能。
(6)lastprivate子句
lastprivate (list)
lastprivate子句结合了private子句的功能,而且会复制最后一个循环迭代或section的值。
(7)copyin子句
copyin (list)
copyin子句用于为一个team的所有线程的threadprivate指令的变量赋值统一的值。
说明:copyin的源变量值是master线程的值,线程在进入并行块时使用其值进行初始化。
(8)copyprivate子句
copyprivate (list)
用于single指令。
(9)reduction子句
reduction (operator: list)
reduction子句对指定的变量执行reduction操作。对于多个线程,每个线程会对于reduction类型的变量保存一个副本,在循环迭代或并行结束后,对所有的线程的副本变量执行operator的叠代操作,得到最终的结果。其中,operator为一个合法的操作符,比如+/-/*等等。
PRIVATE | THREADPRIVATE | |
---|---|---|
Data Item | C/C++: variable Fortran: variable or common block |
C/C++: variable Fortran: common block |
Where Declared | At start of region or work-sharing group | In declarations of each routine using block or global file scope |
Persistent? | No | Yes |
Extent | Lexical only - unless passed as an argument to subroutine | Dynamic |
Initialized | Use FIRSTPRIVATE | Use COPYIN |