7.5 DYNAMIC指令 BACKWARD FORWARD


DYNAMIC属性指明一个对象可以动态重映射或重分配。

H704 dynamic-directive   is DYNAMIC alignee-or-distributee-list
H705 alignee-or-distributee is alignee
                   distributee

约束:

约束:

REALIGN指令不适用于没有DYNAMIC属性的对准子。REDISTRIBUTE指令不适用于没有DYNAMIC属性的分配子。

DYNAMIC指令可以与其它指令组合在一起,指令中的属性可以是任意次序的,这一点与Fortran90属性语法一致。

例子:

 !HPF$ DYNAMIC A,B,C,D,E
 !HPF$ DYNAMIC:: A,B,C,D,E
 !HPF$ DYNAMIC, ALIGN WITH SNEEZY:: X,Y,Z
 !HPF$ ALIGN WITH SNEEZY, DYNAMIC:: X,Y,Z
 !HPF$ DYNAMIC, DISTRIBUTE(BLOCK, BLOCK) :: X,Y
 !HPF$ DISTRIBUTE(BLOCK, BLOCK), DYNAMIC :: X,Y

前两个例子的意义完全相同。紧接着的两个例子表示完全相同的另一件事。最后两个例子表示完全相同的第三件事。

下面的三个指令:

 !HPF$ TEMPLATE A(64,64),B(64,64),C(64,64),D(64,64)
 !HPF$ DISTRIBUTE(BLOCK, BLOCK) ONTO P:: A,B,C,D
 !HPF$ DYNAMIC A,B,C,D

可以被合并成下面的一条指令:

 !HPF$ TEMPLATE, DISTRIBUTE(BLOCK, BLOCK) ONTO P,  &
 !HPF$  DIMENSION(64,64), DYNAMIC :: A,B,C,D

一个可分配对象也可以具有DYNAMIC属性.如果ALLOCATE语句后面紧接着REDISTRIBUTE和/或REALIGN指令,则原则上表示数组首先用静态定义的映射创建,然后马上被重映射。实际上有一个显而易见的优化方式:在一步之内,将数组创建在其将要重映射的处理器上。强烈鼓励HPF实现者实现这一优化并鼓励HPF程序员依靠它。这里是一个例子:

    REAL,ALLOCATABLE(:,:) :: TINKER,EVERS
 !HPF$ DYNAMIC :: TINKER, EVERS
    REAL, ALLOCATABLE :: CHANCE(:)
 !HPF$ DISTRIBUTE(BLOCK),DYNAMIC :: CHANCE
    ...
    READ 6,M,N
    ALLOCATE(TINKER(N*M,N*M))
 !HPF$ REDISTRIBUTE TINKER(CYCLIC, BLOCK)
    ALLOCATE(EVERS(N,N))
 !HPF$ REALIGN EVERS(:,:) WITH TINKER(M::M,1::M)
    ALLOCATE(CHANCE(10000))
 !HPF$ REDISTRIBUTE CHANCE(CYCLIC)

虽然CHANCE缺省总是以BLOCK方式分配,但是编译器应该有可能注意到它将马上以CYCLIC方式重映射。类似的评论也适用于TINKER和EVERS。(注意:EVERS是以稀疏分布方式映射到TINKER上的;EVERS的相邻元素被映射到TINKER的以步长M分割的元素上。由于EVERS(1,1)被映射到TINKER(M,1)上,因此这一稀疏分布被放在TINKER的左下角。)


Copyright: NPACT BACKWARD FORWARD