7.6 重映射和子程序接口 BACKWARD FORWARD


如果任意子程序的哑参具有DYNAMIC属性,则该子程序需要一个显式接口(见7.14节)。关于具有子程序参数接口的REALIGN和REDISTRIBUTE指令相互影响的规则是:

1.哑参可以被定义为DYNAMIC。但是,它服从关于使用数组名来代表其相关模板的一般约束。

当过程返回到调用者后,对哑参的任意重分配的效果依赖于实参的属性。如果与哑参相关联的实参也被定义成DYNAMIC,则当过程返回后,对哑参的任意显式重映射在调用者中是可见的。如果使用一个范围指令(见7.11节)来限制实参所允许的分配格式的集合,则新映射应该与范围指令所指定的格式之一相匹配。

如果与哑参相关联的实参未被定义成DYNAMIC,则当返回时,必须将实参的原始映射重新存储回去。当子程序返回且调用者重新执行时,调用者所访问到的所有未被定义成DYNAMIC的对象在调用后与其调用前的映射完全相同。

2.如果一个数组或任意区域可被两个或更多的路径访问到,则在那些路径的任意一个对它进行重映射是不符合HPF标准的。例如,如果一个数组被作为实参传递,则在子程序返回之前,禁止在调用时重对准该数组,或将它所对准的数组或模板重分配。这样就防止了“脏”别名问题。例如:

    MODULE FOO
    REAL A(10,10)
 !HPF$ DYNAMIC :: A
    END

    PROGRAM MAIN
    USE FOO
    CALL SUB(A(1:5,3:9))
    END

    SUBROUTINE SUB(B)
    USE FOO
    REAL B(:,:)
 !HPF$ DYNAMIC :: B
    ...
 !HPF$ REDISTRIBUTE A    !不符合HPF标准
    ...
    END

诸如这样的情况是禁止的,基于同样的原因,在语句中对A进行赋值也是禁止的。一般来说,由于别名的原因,会使得一个变量的赋值不符合HPF标准,在这种情况下,通过显式REALIGN或REDISTRIBUTE指令对该变量进行重映射也是禁止的。

注意:如果一个宿主关联或使用关联变量被定义成DYNAMIC且仅能通过一条路径访问到,则在子程序中对它进行重映射是合法的。即使当子程序返回到调用者后这种重映射仍然是有效的。


Copyright: NPACT BACKWARD FORWARD