2.8 存储和顺序相联 |
HPF允许数据对象跨越多处理器进行映射以便提高并行性能。对于通过COMMON和EQUIVALENCE语句建立关联的数据对象,Fortran指定了它们之间的存储关系,同时指定了在关联过程中过程边界上实参和哑元之间数组元素的次序。另外,语言不限制数据的位置。
基于下面的存储单元和存储顺序模型,COMMON和EQUIVALENCE语句对不同数据项的对准进行了约束:
存储相联模型是一个单一线性编址的存储器,它基于传统的单地址空间,单存储单元结构。此模型可能使得数据对象所映射的存储结构变得严重低效。
顺序相联指的是当一个数组表达式或数组元素同一个哑数组参数相关联时,Fortran所要求的数组元素的次序:
同存储相联一样,顺序相联仅在线性编址的存储器中是一个自然的概念。
为有助于FORTRAN 77代码的移植,HPF允许那些依赖于顺序和存储相联的代码在HPF中是有效的。不过,对已存在的FORTRAN 77代码进行一些修改仍然是必要的。本节解释了HPF数据映射同顺序和存储相联之间的关系。
1. COMMON块既可是顺序的又可是非顺序的,具体的由显式指令或编译器缺省决定。一个顺序的COMMON块具有单一的一个公共块存储顺序(Fortran 标准5.5.2.1)
2. 聚集变量组是一个变量的集合,它的每个个体存储顺序是某个单独存储顺序的一部分。
通过EQUVALENCE语句或通过EQUIVALENCE及COMMON语句组合建立关联的变量构成了一个聚集变量组。一个顺序COMMON块的变量构成了单独一个聚集变量组。
3. 聚集变量组的大小是组存储顺序内存储单元的个数(Fortran标准14.6.3.1)
4. 数据对象或者是顺序的或者是非顺序的。一个数据对象是顺序的当且仅当下面的任何一个条件成立:
(a) 它出现在一个顺序COMMON块中;
(b) 它是某聚集变量组的一个成员;
(c) 它是一个已假定大小的数组;
(d) 它是一个具有Fortran SEQUENCE属性派生类型的一个结构部件,或
(e) 它在HPF SEQUENCE指令中被定义成顺序的。
一个顺序的对象可以是存储相联或者顺序相联的;非顺序的对象则不可以。
5. 一个COMMON块包含了一个部件序列。每个部件或者是一个聚集变量组,或者是一个不属于任何聚集变量组的变量。顺序COMMON块包含了单独的一个部件。非顺序COMMON块可以包含若干部件,这些部件或者是顺序变量,或者是聚集变量组,或者也可以是非顺序的。
IMPLICIT REAL (A-Z)
COMMON /FOO/ A(100), B(100), C(100), D(100), E(100)
DIMENSION X(100), Y(150), Z(200)
!例 1:
EQUIVALENCE(A(1), Z(1))
!四个部件:(A, B), C, D, E
!大小:200,100,100,100
!例 2:
EQUIVALENCE(A(51), X(1)) (B(100), Y(1))
!两个部件(A,B,C,D),E
!大小:400,100
!例 3:
!HPF$ SEQUENCE /FOO/
!此公共块具有一个部件,(A,B,C,D,E)
!大小:500
例1和2中的COMMON块/FOO/是非顺序的。括号中的部件是聚集变量组。
使用SEQUENCE指令允许用户显式地定义数据对象或COMMON块被编译器当作顺序的。(COMMON块缺省是非顺序的。除非应用定义4,否则数据对象是非顺序的)一些实现可以提供一个可选的编译环境,在此环境下,SEQUENCE指令被缺省应用。为保证此环境下的完整性,HPF定义了一个NO SEQUENCE指令,以便允许用户在作用域单元内将通常的非顺序缺省应用到一个作用域单元,或选定的数据对象以及COMMON块上。
H233 sequence-directive is SEQUENCE[[::]association-name-list]
or NO SEQUENCE[[::]association-name-list]
H234 association-name is object-name
or /[common-block-name]/
约束:在任何作用域单元内,sequence指令中的对象名或COMMON块名至多可以出现一次。
约束:在同一作用域单元内,仅允许一个具有非关联名字列表(association-name-list)的sequence指令。
所定义的具有SEQUENCE属性的指针仅能与顺序对象建立关联,反之亦然。
1. 具有空关联名字列表的sequence指令可被看作是包含了所有隐式映射对象的名字以及作用域单元内的一些COMMON块,这些公共块不能通过语言的上下文确定其是顺序的还是非顺序的。
2. 不能将顺序对象显式映射。
3. 对于具有Fortran SEQUENCE属性的派生类型的部件无法给出其显式映射。注意,由于派生类型的部件在HPF中不能显式映射,因此本规则仅在所认可的扩展下是合适的。
4. 如果COMMON块是非顺序的,则必须满足下面的所有规则:
(a)COMMON块的每一个出现都具有完全相同的部件数目,且每个相对应的部件都具有大小完全相同的存储顺序。
(b)如果某部件在任一个COMMON块中是一个非顺序变量,则它在每一个COMMON块的出现中都必须是非顺序的,且具有同样的类型,形状和映射属性。
(c)COMMON块的每一个出现都必须是非顺序的。
对用户的建议:在这些规则下,只要COMMON块中的部件在定义COMMON块的每一个作用域单元中都是相同的,则就可以对COMMON块中的变量进行映射。
正确的Fortran程序在HPF中如果不加修改就不一定是正确的。用COMMON块使用EQUIVALENCE可能在细节上同数据对象的可映射性发生冲突。为允许性能的最大优化,在HPF中缺省认为数据对象是可映射的。为得到子程序正确的分离编译,这些子程序所使用的COMMON块在不同作用域单元中具有不同的聚集变量组,有必要插入HPF SEQUENCE指令。
用户可应用下面的问题来决定数据对象或COMMON块的状态,依次是:
.对象是否出现在一些显式语言上下文中,这些上下文能够命令对象是顺序的(例如,EQUIVALENCE)还是非顺序的。
.如果没有,则对象是否出现在一个显式映射指令中?
.如果没有,则对象或COMMON块的名字是否出现在SEQUENCE或NO SEQUENCE指令的名字列表中?
.如果没有,则作用域单元是否包含了一个无名SEQUENCE或NO SEQUENCE?
.如果没有,则编译是否受一些特殊的依赖于实现的环境的影响?该环境命令名字缺省是SEQUENCE。
.如果没有,则编译器将认为对象或COMMON块名是非顺序的并可任意应用数据映射优化而不管Fortran的顺序和存储相联。
(对用户的建议结束)
对实现者的建议:为保护用户并方便旧代码的可扩展性,在这里强烈推荐两个实现选择。第一,每个实现应该提供一些机制来验证每个可映射数组的类型和形状,同时,如果COMMON不被定义成顺序的,则在每个作用域单元中,COMMON块聚集变量组的大小都是相同的。同样的检查还应验证COMMON块中的变量应具有同一映射。没有过程间信息的实现可以使用连接时检查。第二种实现选择是一个机制,在此机制下,除非另外定义,对于一个给定的编译,数据对象和COMMON块应被认为是顺序的。这个特征的目的是允许存在存储相联的大型旧库或子程序的编译能够在不修改代码的前提下将HPF的SEQUENCE指令应用到每个COMMON块中。
Copyright: NPACT |