4.3 分配和处理器排列 BACKWARD FORWARD


如果一个DISTRIBUTE指令中的每个分配子都是一个哑元,则分配格式子句(dist-format-clause)或分配目标(dist-target)两者中的某一个或全部可能以一个星号开始或包含一个星号。

.如果没有星号,则分配格式子句或分配目标是指示性的(prescriptive);此子句描述了一个分配并构成了语言处理器的一个要求以便让它这么做。这可能导致调用者或者被调子程序在运行时入口处进行重映射或者复制实参以便满足哑元所要求的分配。

.如果以一个星号开始,则分配格式子句或分配目标是描述性的。如果编译器不能证明实参不需要重映射,则它会提出一个诊断性消息来报告该结果。除此之外,这种指令在每一方面都等价于一条指示性指令。关于这一点可参见4.1节以获得进一步信息。

.如果仅包含一个星号,则分配格式子句或分配目标是抄写性的;该子句没有告诉关于分配的任何事,但是要求语言处理器将实参的分配部分复制下来。(此目的是如果参数通过引用传递,则运行时不必要进行数据移动。)

在一个单一的DISTRIBUTE指令中,有可能只有分配格式子句具有一个星号而分配目标没有,或者相反。

4.3.1 例子

DISTRIBUTE指令关于哑元的这些例子阐述了不同的组合:

 !HPF$ DISTRIBUTE URANIA(CYCLIC) ONTO GALILEO

语言处理器应该做的是,使得URANIA在处理器排列GALILEO上具有CYCLIC分配。

 !HPF$ DISTRIBUTE POLYHYMNIA * ONTO ELVIS

语言处理器应该做的是,使得POLYHYMNIA在处理器排列ELVIS上被分配,可使用它当前所具有的任何分配格式(该格式有可能在一些其它的处理器排列上)

 !HPF$ DISTRIBUTE THALIA * (CYCLIC) ONTO *FLIP

语言处理器应该做的是,使得THALIA在处理器排列FLIP上具有CYCLIC分配;程序员相信在这种方式下实参已被分配并且不要求重映射。

 !HPF$ DISTRIBUTE EUTERPE (CYCLIC) ONTO *

语言处理器应该做的是,使得EUTERPE在实参所分配到的任何在处理器排列上具有CYCLIC分配。

 !HPF$ DISTRIBUTE ERATO * ONTO *

实参不应该改变ERATO的映射。

另外还需注意,DISTRIBUTE ERATO * ONTO *与下面的指令不表示同一件事:

 !HPF$ DISTRIBUTE ERATO (*) ONTO *

后者意味着:将ERATO *(即,on-processor)分配到实参所分配的处理器排列上。在这种情况下,处理器排列必须是标量。

4.3.2 忽略子句时会发生什么

对于哑元来说,我们可以或者忽略dist-format子句或忽略dist-onto子句。这一点可以理解为下列情况: 

如果哑元具有INHERIT属性(见4.4.2节),则任何情况下都不允许分配指令:同对准一样,分配也是从实参中继承。

在忽略分配信息的任何其它情况下,编译器可以任意选择分配格式或目标处理器排列。

这里是两个例子:

 !HPF$ DISTRIBUTE WHEEL_OF_FORTUNE *(CYCLIC)

程序员相信对应于哑元WHEEL_OF_FORTUNE的实参已经被分配成CYCLIC方式。编译器应保证所传递数据的映射实际上是CYCLIC方式,同时如果不是的话,若有必要就对其重映射。另外可以将其重映射到一些其它的处理器排列上,但是没有原因这么做;如果出现这种重映射,就有可能使得程序员非常惊诧。

 !HPF$ DISTRIBUTE ONTO *TV :: DAVID_LETTERMAN

程序员相信对应于哑元DAVID_LETTERMAN的实参总是以某种方式被分配到TV上。编译器应保证是这样,如果不是的话,就要让它这样。只要DAVID_LETTERMAN保留在TV上,可以改变分配格式。(注意,必须在属性形式中进行此定义;语句形式

 !HPF$ DISTRIBUTE DAVID_LETTERMAN ONTO *TV   !不符合标准

不符合DISTRIBUTE指令的语法)


Copyright: NPACT BACKWARD FORWARD