OpenMP Tutorial学习笔记(10)OpenMP指令之数据范围属性的子句

来源:互联网 发布:皮皮学拼音软件 编辑:程序博客网 时间:2024/05/11 17:16

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的比较:

PRIVATETHREADPRIVATEData ItemC/C++: variable 
Fortran: variable or common blockC/C++: variable 
Fortran: common blockWhere DeclaredAt start of region or work-sharing groupIn declarations of each routine using block or global file scopePersistent?NoYesExtentLexical only - unless passed as an argument to subroutineDynamicInitializedUse FIRSTPRIVATEUse 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为一个合法的操作符,比如+/-/*等等。



PRIVATETHREADPRIVATEData ItemC/C++: variable 
Fortran: variable or common blockC/C++: variable 
Fortran: common blockWhere DeclaredAt start of region or work-sharing groupIn declarations of each routine using block or global file scopePersistent?NoYesExtentLexical only - unless passed as an argument to subroutineDynamicInitializedUse FIRSTPRIVATEUse COPYIN
原创粉丝点击