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