7.11 范围指令 |
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 |