2.5 可分配的数组和指针 BACKWARD FORWARD


一个具有ALLOCATABLE属性的变量可作为一个对准子出现在ALIGN指令中或者作为一个分配子出现在DISTRIBUTE指令中。但是这种指令不能立即起作用;它们每次起作用都是在用ALLOCATE语句分配数组空间时,而不是在作用域单元的入口处。这种指令中的所有说明表达式的值都是在作用域单元的入口处一次性确定的并可多次使用(或者根本不使用)。例如:

    SUBROUTINE MILLARD_FILLMORE(N,M)
    REAL, ALLOCATABLE, DIMENSION(:) :: A, B
 !HPF$ ALIGN B(I) WITH A(I+N)
 !HPF$ DISTRIBUTE A(BLOCK(M*2))
    N = 43
    M = 91
    ALLOCATE(A(27))
    ALLOCATE(B(13))
    ...

子程序入口处表达式N和M*2的值概念上是通过后面分配空间时所使用的ALING和DISTRIBUTE指令指定的。当为数组A分配空间时,对它用BLOCK方式分配,每个块的大小等于所获得的M*2的值,而不是182。当为数组B分配空间时,根据所获得的N值,将它与A对准,而不是它的新值43。

注意,在MILLARD_FILLMORE例子中以相反的顺序执行ALLOCATE语句是不对的。一般来说,当创建对象X时,,仅当另一个对象Y已被创建或分配空间,才能将X与Y对准。下列例子阐述了几个相关的情况:

    SUBROUTINE WARREN_HARDING(P,Q)
    REAL P(:) REAL Q(:)
    REAL R(SIZE(Q))
    REAL, ALLOCATABLE :: S(:),T(:)
 !HPF$ ALIGN P(I) WITH T(I) !Nonconforming
 !HPF$ ALIGN Q(I) WITH *T(I) !Nonconforming
 !HPF$ ALIGN R(I) WITH T(I) !Nonconforming
 !HPF$ ALIGN S(I) WITH T(I)
    ALLOCATE(S(SIZE(Q))) !Nonconforming
    ALLOCATE(T(SIZE(Q)))

由于各种对准必须发生时,数组T尚未分配空间,因此ALIGN指令不符合HPF标准。从细节上,这四种情况具有轻微不同。在子程序入口处数组P和Q已经存在,但是由于T尚未分配空间,因此不能正确地刻画T的对准或者描述Q相对于T的对准。(见第四节中关于指示性和描述性指令的讨论)数组R子程序入口处已被创建且它的大小可正确地依赖于Q的大小,但是由于T的大小尚未指定,因此不能根据T的对准指定R的对准。允许根据T对准S,这是由于对准行为直到S分配空间时才发生;但是第一个ALLOCATE语句不符合HPF标准,这是因为S需被对准但在该点T仍未分配空间。

当一个数组分配空间时,如果对这个可分配变量有一个显式ALIGN指令,则它将与一个已存在的模板对准。如果没有显式ALIGN指令,则数组与其自身根本对准。当一个数组由于空间释放变成未定义时,则禁止任意其它对象与此数组根本对准。不管数组创建时在ALLOCATE语句中最初所使用的名字是否具有ALLOCATABLE属性或POINTER属性,所有这些都适用。

HPF中指针不能显式映射且它所相关联的对象不能是显式映射的。当用于分配空间时,编译器可通过指针选择被分配数据的任意映射。在所认可的扩展中,允许指针的显式映射-详见7.8节2.8节描述了指针和顺序相联属性之间的关系。


Copyright: NPACT BACKWARD FORWARD