7.11 范围指令 BACKWARD FORWARD


RANGE指令被用于限制具有DYNAMIC属性或抄写性分配格式的对象和模板的可能的分配格式(包括指针)。

H711 range-directive   is RANGE ranger range-attr-stuff-list
H712 ranger          is object-name
                or template-name
H713 range-attr-stuff   is ( range-attr-list )
H714 range-attr        is range-dist-format
                  or ALL
H715 range-dist-format  is BLOCK [ ()]
                  or CYCLIC [ () ]
                  or GEN_BLOCK
                 or INDIRECT
                 or * 

约束:ranger必须具有DYNAMIC属性,INHERIT属性以及非显式DISTRIBUTE,否则它必须在DISTRIBUTE或合成指令中用*分配格式子句来指定。

约束:任何range-attr-list的长度必须等于ranger的维数。

约束:ranger不能在ALIGN或REALIGN指令中作为对准子出现。

因为每个range-attr-list的长度与ranger的维数相同,所以每个range-attr-stuff中的每个range-attr在位置上与ranger的某一维D相对应。此第D维或者与ranger所根本对准的模板的某一维A相对准,或者在该模板上没有对应维。

根据这一概念,ranger上的RANGE属性等价于下列约束:

对于range-attr-stuff-list中的至少一个range-attr-stuff,每个range-attr,R,必须或者

.如果存在对应维A,则与该维的分配格式相兼容,或者

.如果不存在对应维,则是*或ALL。

这种兼容性必须由DISTRIBUTE或REDISTRIBUTE指令维护,且在这些指令中ranger或者作为分配子出现,或者对于任意与ranger相关联的目标,ranger具有POINTER属性且以指示性方式分配的。

下列分配格式

1.BLOCK与BLOCK,BLOCK()或CYCLIC()的range-dist-format相兼容。

2.BLOCK(n)与BLOCK()或CYCLIC()的range-dist-format相兼容。

3.CYCLIC与CYCLIC或CYCLIC()的range-dist-format相兼容。

4.CYCLIC(n)与CYCLIC()的range-dist-format相兼容。

5.GEN_BLOCK与GEN_BLOCK的range-dist-format相兼容。

6.INDIRECT与INDIRECT的range-dist-format相兼容。

7.*与*的range-dist-format相兼容。

所有的分配格式都与ALL的range-dist-format相兼容。

注意,如果合成指令使用规则H701所定义的combined-attribute-extended,则该指令的语法规则H201使下面形式的RANGE指令成为可能:

 !HPF$ RANGE range-attr-stuff-list :: ranger-list

例子:

 !HPF$ DISTRIBUTE T(BLOCK)
 !HPF$ ALIGN A(I,J) WITH T(I)

    CALL SUB(A)
     ....

    SUBROUTINE SUB(X)
 !HPF$ INHERIT X
 !HPF$ RANGE X (BLOCK, *), (CYCLIC, *)

因为X的根本对准目标(在这里是继承模板T)没有第二维,所以在X的range-attr-stuff的第二维仅能使用*和ALL。

    REAL A(100, 100, 100)
 !HPF$ DISTRIBUTE A(BLOCK, *, CYCLIC)

    CALL SUB( A(:,,:,1) )! 符合HPF标准
    CALL SUB( A(:,,1,:) )! 不符合HPF标准
    CALL SUB( A(1,,:,:) )! 不符合HPF标准
     ....

    SUBROUTINE SUB(X)
    REAL A(:, :)
 !HPF$ INHERIT X
 !HPF$ RANGE X (BLOCK, *)

对于子程序SUB中的范围指令,仅有第一个对SUB的调用符合HPF标准。但是,如果上面的范围指令被代之为下列指令,则这三个调用就将都符合HPF标准:

 !HPF$ RANGE(BLOCK,*),(BLOCK,CYCLIC),(*,CYCLIC)::X


Copyright: NPACT BACKWARD FORWARD