5.3 调用HPF外部子程序 |
调用一个外部过程时,它的运行从用HPF编写的调用程序的角度看,就好象此子程序是完全用HPF代码编写的一样。如果一个HPF外部类的程序单元所调用的函数或子程序在调用者中不具有显式可见的接口,则就假定它与调用者具有同样的外部类。
为调用一个外部类的子程序而不是调用者的子程序,该子程序必须在调用者中具有显式可见的接口,且希望该子程序的运行,从调用者的角度看,就好象是用与调用者相同的外部类代码书写的一样。可由编译器和程序员共同负责来满足这一要求。这个接口定义了外部过程的“HPF”视图。
一个用非HPF语言或模型所书写的被调过程,无论它是否使用本地过程执行模型,都应在调用它的HPF程序中被定义为EXTRINSIC。EXTRINSIC前缀定义了当调用指定的子程序时应使用何种接口。如果没有外部说明,则假定由用户来完全负责这种依赖于实现接口的正确性。
出现在HPF外部类程序单元接口模块中的函数语句或子程序语句,可以具有语言实现所支持的任何外部类的外部前缀。如果在这种函数语句或子程序语句中没有出现外部前缀,则假定它与接口模块所出现的程序单元具有相同的HPF外部类。
接口体所定义的过程特性必须与过程定义一致。
对具有外部接口的过程的定义和规则放在HPF范围之外。但是,这种过程的显式接口必须符合HPF标准。注意,任何特殊的HPF实现都可随意支持任何一个外部类,或者除HPF自身外什么都不支持,很显然任何一个HPF实现都必须支持外部类HPF。
被使用模块的外部类
HPF | HPF_SERIAL | HPF_LOCAL | ||
正使用的 |
HPF | T P D | T P | T P |
程序单元 |
HPF_SERIAL | T | T P D | T |
的外部类 |
HPF_LOCAL | T | T | T P D |
T=派生类型定义
P=过程和过程接口
D=数据对象
表5.1 根据每个HPF的外部类,程序单元有权访问的模块中的实体
如果一个HPF外部类的模块X被另一个HPF外部类的程序单元Y所使用,则只能引入X中的那些Y有权使用或引用的项目名;也就是说,或者由X将所有Y无权使用的项目置为私有的,或者让Y中的USE语句具有ONLY选项,并在此选项中仅列出它有权使用的项目名。
可将派生类型定义看成是“中立的外部类”;任何一个HPF外部类的程序单元都可使用任何HPF外部类模块中的派生类型定义。
一个HPF全局程序或过程可以调用其它HPF全局,局部或串行过程。
一个HPF局部程序或过程仅能调用其它HPF局部过程。
一个HPF串行程序或过程仅能调用其它HPF串行过程。
如果在一个HPF类的任意程序单元中有一个有名COMMON块,则它可与同一外部类的每一个其它程序单元中的同名COMMON块建立关联。对于无名OCMMON块也是类似的。(这种COMMON存储的作用与该外部类程序单元中所定义的其它数据对象是一样的。特别是,对于HPF_LOCAL代码在每个处理器上有一个COMMON块的拷贝。)
在同一个程序中,不允许任何一个给定的有名COMMON块在不同HPF类的程序单元中使用;类似地,在同一个程序中,也不允许无名COMMON块在不同HPF类的程序单元中使用。
调用一个外部过程必须在语义上等价于调用一个普通的HPF过程。这样,调用一个外部过程时就好象发生了下列动作。此HPF技术术语“就好象”意味着所描述的动作对用户而言就好象它们以指定的顺序发生了;实现时可以以任意次序执行任意动作,只要该次序能够提供正确的用户视角效果。
1.应在子程序任意动作执行之前,完成子程序引用前面的所有调用者的动作;同时,应在紧跟着子程序引用的任意调用者动作执行之前,完成子程序的所有动作。
2.根据外部过程接口中的指令(显式或隐式的),如果有必要,可以对每个实参进行重映射。这样,出现在接口中的HPF映射指令就是有约束力的—编译器在调用本地外部过程时,必须遵守这些指令。对应于标量哑参的实参在所有的处理器上被复制(例如,通过广播)。就象非外部类子程序一样,也可以以任意方式对实参进行映射;如果有必要,可在引用前将这些实参拷贝到一些已正确映射的临时变量中,并在从外部子程序返回后,再将其拷回实参中。标量哑参和标量函数结果的行为就好象它们被复制到了每个处理器上。这些映射在接口中可以是显式的,但是任何其它的显式映射都是不符合HPF标准的。
3.应注意对IN,OUT,以及INOUT的一些严格约束。
4.除非一个HPF变量可被某个具有相同显式接口的HPF过程所修改,否则不能对该变量进行修改。特别要注意,虽然不允许HPF_LOCAL例程访问和修改HPF全局数据,但是其它种类的外部例程一定程度上可以做到HPF过程所能做到的这一点。
5.当过程返回以及调用者重执行时,调用者所能访问到的所有对象在调用后必须映射成与它们调用前完全一样。特别是,如果有必要的话,应将参数重新存储成其最初的分配方式。
6.在子程序调用前后,HPF环境所能看到的处理器集合是完全相同的。
对实现者的建议:
为保证逻辑上处于调用之前的所有动作都能完成,在进行调用前可能需要对多处理器进行同步。
如果被调例程所能访问到的变量具有一个重复描述,则根据源程序的串行语义,可能需要在调用前对所有的拷贝进行更新以便包含正确的当前值。
如果某重复变量在过程中被更新了,则其所有拷贝必须被一致性更新。更详细地,如果一个过程所能访问到的变量具有重复描述,且被此过程(的一个或更多拷贝)更新,则当最后一个处理器从本地过程返回时,重复变量的所有拷贝必须具有同一值。
一种实现方式可能在从本地子程序返回前进行检查,以确保重复变量以被子程序一致更新。但是,当然不要求——甚至不鼓励——这么做。这只是速度和可维护性之间的一个折衷。
注意,就象对于全局子程序一样,实参可以任意方式被拷贝或重映射,只要从子程序返回时恢复这一影响。
为保证过程的所有动作在调用者被重新执行之前能够逻辑上完成,可能需要在调用后对多个过程进行同步。(对实现者的建议结束)
Copyright: NPACT |