REDUCTION变量说明
REDUCTION的概念我们在第七章中已经介绍过,但主要偏重于集合通信中的通信部分。(思考:既然对共享存储的计算机系统来说,程序员不用考虑通信,为什么还要提供一个REDUCTION操作?)。由于对很多的循环,REDUCTION操作是造成它们不可并行化的一个重要原因,所以,OpenMP提供了对REDUCTION变量的说明机制,来解决这种问题。和消息通信程序中的REDUCTION操作一样,在实现的时候,OpenMP中的REDUCTION操作也是先由各工作线程先并行算出自己的局部结果(思考:为什么可以这么做?),然后再合并这些局部结果最后在主线程处得到最后的结果)。
REDUCTION变量是作为一些指导语句的子句出现的,它的形式如下:
REDUCTION({操作符|intrinsic函数名}:变量列表)
可以被说明为REDUCTION变量的变量所出现的语句只能是下面的形式:
● x = x operator expr
● x = expr operator x (减法操作除外)
● x = intrinsic_procedure_name( x, expr_list )
● x = intrinsic_procedure_name( expr_list, x )
其中,x是一个基本数据类型的标量变量,
operator是归约操作符,它可以取如下的值:
● +
● -
● *
● .AND.
● .OR.
● .EQV.
● .NEQV.
expr为一个标量表达式,在expr中不能再出现归约变量x;
intrinsic_procedure_name是intrinsic函数名称,它可以是如下的操作:
● MAX
● MIN
● IAND
● IOR
● IEOR
expr_list是一个逗号分割的,非空的标量表达式列表,其中的表达式不能再包含x,当intrinsic_procedure_name为IAND,
IOR或者IEOR的时候,expr_list中只能出现一个表达式。
有的时候,一些归约操作可以以其它的形式出现,比如,一个标准的MAX归约操作可能会以下面的形式出现:
IF( x .LT. expr ) x = expr
有的时候,归约操作可能会被包含在子过程调用中,因此,在说明归约操作属性的时候,用户需要确定被说明的变量满足归约操作的类型。
各种归约变量的通常情况下的初始值由下表给出:
操作名称
|
初始值(实际的初始值与类型有关)
|
+
|
0
|
*
|
1
|
-
|
0
|
.AND
|
.TRUE.
|
.OR.
|
.FALSE.
|
.EQV.
|
.TRUE.
|
.NEQV.
|
.FALSE.
|
MAX
|
系统最小数(与类型有关)
|
MIN
|
系统最大数(与类型有关)
|
IAND
|
所有位均为1
|
IOR
|
0
|
IEOR
|
0
|
|