2.6 PROCESSORS指令 BACKWARD FORWARD


PROCESSORS指令定义了一个或更多的线性处理器排列,并指定了每一个处理器排列的名字,维数,以及每一维上的长度。它仅能出现在作用域单元的说明部分。处理器排列的每一维必须具有非0的长度;因此一个处理器排列不能是空的。

在Fortran标准14.1.2节的语言中,处理器排列是一类本地实体;因此一个处理器排列在同一作用域单元内不能同变量,名字常数,内部过程等具有相同的名字。处理器排列的名字遵循与宿主(host)同样的规则并象Fortran标准12.1.2.2.1节所列出的其它名字一样使用关联。

在一个模块内所定义的处理器排列在该模块内可缺省访问。

基本原理:由于一个处理器排列的名字在HPF中不是第一类的实体,而且必须仅出现在指令中,因此它不能出现在访问语句(access-stmt)中(PRIVATE或PUBLIC)。如果这些指令有朝一日成为完整的Fortran语句,而不再是注释,则允许通过在访问语句中列举其名字来控制对处理器排列的访问就是很合适的了。(基本原理结束)

如果两个处理器排列具有相同的形状,则这两个排列的相对应的元素被理解为指的是同一抽象处理器。(预计由一些HPF实现所提供的依赖于实现的指令可能否定具有相同形状的处理器排列的缺省对应关系

如果在程序执行过程中的某一给定瞬间,由指令集体指定两个对象被映射到同一抽象处理器中,则其目的是在那一时刻将这两个对象映射到同一物理处理器上。可使用内部函数NUMBER_OF_PROCESSORS和PROCESSORS_SHAPE查询用于执行程序的实际物理处理器的总数。这个信息可用于计算所定义抽象处理器的适当大小。

H229 processors-directive   is PROCESSORS processors-decl-list

H230 processors-decl      is processors-name[(explicit-shape-spec-list)]

例子:

 !HPF$ PROCESSORS P(N)
 !HPF$ PROCESSORS Q(NUMBER_OF_PROCESSORS()),  &
 !HPF$       R(8,NUMBER_OF_PROCESSORS()/8)
 !HPF$ PROCESSORS BIZARRO(1972:1997,-20:17)
 !HPF$ PROCESSORS SCALARPROC

如果不指定形状,则所定义的处理器排列在概念上被认为是标量。

基本原理:标量处理器排列对于指明某种标量数据应被保存在一起而且无须与分布数据发生强相互影响是很有用的。依据实现的结构,分配到这样一个处理器排列上的数据可以保留在一个单一的“控制”或“主”处理器中(如果机器中有这种处理器),或者保留在一个任意选定的处理器中,或者也可以重复存放在所有处理器中。对于具有一组计算处理器和一个单独标量主计算机的目标结构,一种自然的实现方式是将每一个标量处理器排列都映射到主处理器上。对于具有一组计算处理器但没有一个单独标量主计算机的目标结构,映射到标量处理器排列上的数据可以被映射到一些任意选定的计算处理器中或重复映射到所有计算处理器中。(基本原理结束)

HPF编译器要求能够接受任意PROCESSORS定义,在这个定义中,所定义的每一个处理器排列长度的乘积等于调用NUMBER_OF_PROCESSORS()所返回的物理处理器的数目。它必须也能接受所有标量PROCESSOR排列的定义。依据实现,还可以处理其它的情形。

为了同Fortran属性语法兼容,可以插入选项"::"。其形状也可以用DIMENSION属性指定:

 !HPF$ PROCESSORS :: RUBIK(3,3,3)
 !HPF$ PROCESSORS, DIMENSION(3,3,3) :: RUBIK

正如Fortran中一样,PROCESSORS定义中的显式形状说明可以使一个显式DIMENSION属性无效:

 !HPF$ PROCESSORS, DIMENSION(3,3,3) ::  &
 !HPF$       RUBIK, RUBIKS_REVENGE(4,4,4), SOMA

在这里,RUBIKS_REVENGE是4*4*4,而RUBIK和SOMA每一个都是3*3*3。(可是根据上面所阐明的规则,该语句可能不具有完全的可扩展性,这是因为不要求一个HPF语言处理器能够同时处理总共大小为27和64的形状)

从子程序中返回使得该子程序本地所定义的所有处理器排列变成未定义的。当一个处理器排列变成未定义时,将任何数组或模板分配到此处理器排列上都是不符合HPF标准的,除非至少满足下面两个条件中的一条:

 .由于从子程序中返回,数组或模板本身同时变成了未定义的。

 .无论何时调用子程序,总是以同样的方式在本地定义此处理器排列,即具有同一下界和同一上界。

基本原理:注意,第二个条件比要求所有表达式都是常数这一点略微放宽了一些。这样就可以在不违反条件的情况下,允许对NUMBER_OF_PROCESSORS或PROCESSORS_SHAPE的调用。(基本原理结束)

COMMON中或具有SAVE属性的变量可以被映射到一个本地定义的处理器排列中,但是由于此种变量不能满足第一个条件(它们不会变成未定义的),因此必须考察是否满足第二个条件。通过传统的策略,即将同一定义放在需要使用它们的每一个处理器单元中,可以使得COMMON变量正确工作,同时允许它们所映射到的处理器排列依赖于NUMBER_OF_PROCESSORS所返回的值。(见2.8节中关于映射公共变量的进一步信息)

对实现者的建议:下面的想法是合理的,即为用户提供一种方式使其能够在编译时间指定程序将要执行的物理处理器的数目。这一点既可以通过一个依赖于实现的指令来指定也可以通过程序设计环境指定(例如,作为UNIX命令行参数)。这种机制已经超过了HPF说明的范围,但是作为这种思想的结果我们提供下面的阐述性假想例子:

 !用ABC组合定义多处理器
 !ABC$ PHYSICAL PROCESSORS(8)
 !用合并的XYZ定义mpp
 !XYZ$ PHYSICAL PROCESSORS(65536)
 !用受限的PDQ定义超立方体机器
 !PDQ$ PHYSICAL PROCESSORS(2,2,2,2,2,2,2,2,2,2)
 !用TLA GmbH定义二维网格机器
 !TLA$ PHYSICAL PROCESSORS(128,64)
 !前面的某一项可能对下面产生影响
 !HPF$ PROCESSORS P(NUMBER_OF_PROCESSORS())

进一步讲,下面的想法也是可行的,即为用户提供一种方式使其能够在PROCESSORS语句中指定所定义的处理器排列向作为执行硬件的物理处理器的详细映射。另外,这一点既可以通过一个依赖于实现的指令来指定也可以通过程序设计环境指定(例如,作为UNIX命令行参数)。这种机制已经超过了HPF说明的范围,但是作为这种思想的结果我们提供下面的阐述性假想例子:

 !PDQ$ PHYSICAL PROCESSORS(2,2,2,2,2,2,2,2,2,2,2,2,2)
 !HPF$ PROCESSORS G(8,64,16)
 !PDQ$ MACHINE LAYOUT G(:GRAY(0:2),:GRAY(6:11),:BINARY(3:5,12))

在这里指明了G的第一维应该用一个Gray代码排序使用超立方体的0,1,2维;第二维则应用一个Gray代码排序使用超立方体的6至11维;而第三维应该用二进制排序使用超立方体的3,4,5维和第12维。(对实现者的建议结束)


Copyright: NPACT BACKWARD FORWARD