4.1 简介 BACKWARD FORWARD


本简介给出映射指令与子程序参数传递相互作用方法的一个概述。但是这里所使用的语言不是最后的;本节的后续子节包含了权威性的规则。

除了第二节所描述的数据映射特征,HPF还允许许多选择来描述哑参的映射。

每一个这种哑参的映射可能以不同的方式与主调程序或过程(调用者)中相对应实参的映射有关联。为做到这一点,适用于哑参的映射指令可能有三种不同的句法形式:指示性的(prescriptive),描述性的(descriptive),抄写性的(transcriptive)。

HPF提供了这三种形式以允许程序员或者指明数据存放的位置,或者指明在调用执行过程中,数据必须自动重映射到一个新的可能更有效的映射位置以用于被调子程序的执行。

这些形式的意义如下所示:

指示性的:此指令描述了哑参的映射。但是实参无须具有这一映射。如果没有的话,由编译器负责产生代码来以指定的方式重映射,并在出口重新存储原始映射。此代码既可由调用者产生也可在被调子程序中产生;4.6节中对于显式接口的要求保证了在编译时可以获得必要的信息来执行任意位置的映射。

指示性指令在句法上等价于程序中其它位置出现的指令。例如,如果A是一个哑参,

  !HPF$ DISTRIBUTE A(BLOCK, CYCLIC)

是一个指示性指令。

描述性的:除了由程序员给出这样一个弱声明:实参不需要重映射,描述性的句法与指示性的句法具有完全相同的意义。之所以将此声明描述为“弱”,是由于即使它是错误的,程序仍然符合标准。在这种情况下,编译器必须产生适当的重映射。

如果编译器能够证明此声明是错误的,或者编译器不能证明它是正确的,它可以提出一个警告或者信息性的诊断消息。

与指示性相反,描述性指令的目的只是简单地为编译器提供一个可能的方式以便向程序员报告一些信息,这些信息可能在程序开发及调试中有用。注意,由于使用描述性指令所可能产生的任何诊断消息不是本语言的可移植性特征。特别是,存在一些实例,他们不需要重映射,但是这一事实对于编译器来说不可能或者很难弄清。不同编译器可能在不同环境中发送消息;而且不要求一定发送这种消息。(对用户的建议结束)

除了在描述的前面有一个星号外,描述性指令看起来很想指示性指令。例如:

   !HPF$ DISTRIBUTE A *(BLOCK, CYCLIC)

是一个描述性指令。

抄写性的:不指定映射。被调子程序必须接受传递过来的参数映射。(当然这就意味着调用者必须在运行时传来此映射信息)

对于分配和处理器数组可用一个单一的星号来书写抄写性指令;例如:

   !HPF$ DISTRIBUTE A *

是一个抄写性指令。INHERIT指令(见4.4.2节)用于指定一个抄写性映射。

分配格式和处理器排列都可被指定为指示性的,描述性的,或抄写性的。由于需要指定哑参所需要对准的模板,因此对准更复杂。可以不指定模板(在这种情况下,当然没有ALIGN指令),在此情况下,使用哑参的自然模板。(“自然模板”将在4.4.1节定义)否则,下面的不连贯的可能性必须是真的:

 .模板由指示性ALIGN指令显式指定

 .模板由描述性ALIGN指令显式指定

 .模板是继承的。通过将哑参置为INHERIT属性指定。(将在4.4.2节描述)。它隐式指定了此模板是相应实参所根本对准的模板的拷贝;进一步地讲,哑参所对准的那个模板与相应实参的模板是相同的。这实际上是对准的抄写性形式。

4.4.1节将更详细地讨论。

对用户的建议:虽然可能写出一些映射指令的组合,这些指令部分是指示性的,部分是抄写性的,但是这么做可能没有任何优点。这些指令的要点是使编译器能够正确有效地处理任何必要的重映射。当前,可能发生重映射的原因可能是下面的一种或几种:

 .使哑实对准一致

  .使哑实分配一致

  .使哑实处理器数组一致

对于大多数机器,这些原因所引起的重映射开销没有实质的不同。因此一个比较好的经验(至少为了可读性)是所建立的映射或者是纯抄写性的,或者是纯指示性的,或者是纯描述性的。

抄写性映射可能在书写库时很有用,他们指出了子程序上的运行时开销。因此应在正常的用户代码中避免使用它们。


Copyright: NPACT BACKWARD FORWARD