2.7 TEMPLATE指令 |
TEMPLATE指令定义了一个或更多的模板,并指定了每个模板的名字,维数,以及每一维的长度。它必须出现在作用域单元的说明部分。
在Fortran标准14.1.2节的语言中,模板是一类本地实体;因此一个模板在同一作用域单元内不能同变量,名字常数,内部过程等具有相同的名字。模板的名字遵循与宿主(host)同样的规则并象Fortran标准12.1.2.2.1节所列出的其它名字一样使用关联。
在一个模块内所定义的模板在该模块内可缺省访问。
基本原理:由于一个模板的名字在HPF中不是第一类的实体,而且必须仅出现在指令中,因此它不能出现在访问语句(access-stmt)中(PRIVATE或PUBLIC)。如果这些指令有朝一日成为完整的Fortran语句,而不再是注释,则允许通过在访问语句中列举其名字来控制对模板的访问就是很合适的了。(基本原理结束)
一个模板只是一个简单的其位置已索引的抽象空间;可将其看成一个"没有东西的数组"(对比于"整数数组")。模板可被用做一个抽象的对准目标,并可随之被分配。
H231 template-directive is TEMPLATE template-decl-list
H232 template-decl is template-name[(explicit-shape-spec-list)]
例子:
!HPF$ TEMPLATE A(N)
!HPF$ TEMPLATE B(N,N), C(N,2*N)
!HPF$ TEMPLATE DOPEY(100,100),SNEEZY(24),GRUMPY(17,3,5)
如果使用了"::"语法, 则这里所定义的模板可以在同一个合成指令(combined-directive)中被有选择地分配。在这种情况下,指令所定义的所有模板必须具有同一维数以便DISTRIBUTE属性有意义。也可以使用DIMENSION属性。
!HPF$ TEMPLATE, DISTRIBUTE(BLOCK,*) :: &
!HPF WHINEY(64,64),MOPEY(128,128)
!HPF$ TEMPLATE, DIMENSION(91,91) :: BORED, WHEEZY,PERKY
模板在某种特定条件下是非常有用的,在此条件下必须将几个数组相互之间相对对准但无须定义单独一个数组来跨越感兴趣的整个索引空间。例如,我们可能希望四个N*N的数组与一个大小为(N+1)*(N+1)的模板的四个角对准:
!HPF$ TEMPLATE, DISTRIBUTE(BLOCK, BLOCK) :: EARTH(N+1,N+1)
REAL, DIMENSION(N,N) :: NW, NE, SW, SE
!HPF$ ALIGN NW(I,J) WITH EARTH(I,J)
!HPF$ ALIGN NE(I,J) WITH EARTH(I,J+1)
!HPF$ ALIGN SW(I,J) WITH EARTH(I+1,J)
!HPF$ ALIGN SE(I,J) WITH EARTH(I+1,J+1)
模板在说明哑元映射方面也是很有用的(见第四节)
与数组不同,模板不能被定义成COMMON类型的。因此不同作用域单元所定义的两个模板总是不同的,即使它们具有相同的名字。在两个程序单元中使用同一模板的唯一方式是在一个模块中定义此模板,然后该模块被这两个程序单元所使用。
不能通过子程序参数接口来传递模板。哑元所对准的模板总是不同于实参所对准的模板,即使此模板只是一个拷贝。(见4.4.2节)。在子程序出口,一种HPF实现方式是安排实参与调用之前它所对准的同一模板对准。
从子程序中返回使得该子程序本地所定义的所有模板变成未定义的。当一个模板变成未定义时,将任何变量对准到此模板上都是不符合HPF标准的,除非至少满足下面两个条件中的一条:
.由于从子程序中返回,变量本身同时变成了未定义的。
.无论何时调用子程序,总是以同样的方式在本地定义此模板,即具有同一下界,同一上界,以及在同一被定义的处理器排列上的同样的分配信息(如果有的话)(见2.6节)
基本原理:注意,第二个条件比要求所有表达式都是常数这一点略微放宽了一些。这样就可以在不违反条件的情况下,允许对NUMBER_OF_PROCESSORS或PROCESSORS_SHAPE的调用。(基本原理结束)
COMMON中或具有SAVE属性的变量可以被映射到一个本地定义的模板上,但是由于此种变量不能满足第一个条件(它们不会变成未定义的),因此必须考察是否满足第二个条件。
Copyright: NPACT |