4.2.1 FORALL 语句 | ![]() ![]() |
FORALL语句和相应的块结构表示按数组下标所定义的集合的对准(选择地标记)。例如下面语句:
FORALL( i=1:m,j=1:n ) A(i,j) = i+j
在指定范围内,对A的所有的下标值定义赋值。类似于数组赋值,FORALL表达式在给左部赋值以前,对所有激活的下标进行完全的计算。这种情况,等价的fortran 90程序
A = SPREAD( (/( i=1,m)/), DIM=2,NCOPIES=n) + &
SPREAD( (/( i=1,n)/), DIM=1,NCOPIES=m)
是更麻烦的。当右边包含下标变量值时,而不是仅以下标出现,这是典型的。一个具有更复杂本质的深入的例子是:
FORALL( K=1:N, A(K,K).ne.0D0 ) D(K) = 1D0/A(K,K)
FORALL( I=1:M,J=1:N)
AB(I,J) = A(I)*B(J)
V(I,J) = SUM( V,MASK=(C==C(I,J)) )
END FORALL
FORALL (K=1:N) S(K) = SUM( A(:K) )
在第一个例子中,我们把数组A的对角线的元素赋给向量D。为控制哪一个元素被赋值,注意标量标记表达式的使用。第二,A和B的乘积赋给AB。下一个语句表示怎样做复杂的事情。 这儿,把与数组C有相同值的V的所有元素的和赋给V。等价的Fortran 90表达式更复杂。最后, 一个FORALL语句能实现一个并行前缀操作,这儿,把求和结果放在S。
对FORALL语句有限制,这样一个编译器能产生可并行(或以任何顺序对下标操作)执行的程序。特别地,多个值不能赋给同一个最小的数据对象。例如,语句 FORALL ( i=1:n ) A( p(i) ) = B(i) 如果p包含重复的值,那么这个语句是不与标准一致的。 在body中或FORALL的mask表达式中使用用户定义的函数是可能的,但是为保证这些函数没有副作用,这些函数必须满足一定的要求。HPF引入PURE属性,用于定义这样的函数。
Copyright: NPACT | ![]() ![]() |