7.5 DYNAMIC指令 |
DYNAMIC属性指明一个对象可以动态重映射或重分配。
H704 dynamic-directive is DYNAMIC alignee-or-distributee-list
H705 alignee-or-distributee is alignee distributee
约束:
COMMON中的对象不能被定义成DYNAMIC且不能与一个DYNAMIC对象(或模板)对准。(为达到这一效果,必须用Fortran90模块代替COMMON块)
约束:
具有SAVE属性的对象不能被定义成DYNAMIC且不能与一个DYNAMIC对象(或模板)对准。
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 |