第三节 INDEPENDENT及相关指令 |
HPF的INDEPENDENT指令允许程序员向编译器提供有关并行执行机会的信息。用户可以声明不存在任何数据对象在DO循环的一个迭代内被定义而在另一个迭代内被使用(读或写);还可以在FORALL语句中提供关于索引值组合的类似信息。这种信息有时对于编译器的优化很有价值,但可能需要一些仅被程序员利用的应用知识。HPF因此允许用户作这些声明,同时编译器可以在转换处理中依赖它们。如果此声明是真的,则程序的语义不改变;若它是假的,则程序不符合HPF标准并失去了定义的意义。
对比于HPF 1.0,HPF 2.0的INDEPENDENT声明允许在INDEPENDENT循环中执行归约,并假定此归约操作符是一个内嵌的,可交换的Fortran操作符(如.AND.)或函数(如MAX)。在HPF 1.0中经常有这样的情况,由于在几个的迭代中更改了一个或更多的变量,使得一个数据并行计算不能被解释为INDEPENDENT循环。在这种情况下,由于更改的次序对于最后的结果无关紧要,因此并行是可能的和可行的。累加是最常见的情形,例如下面的循环:
DO I=1, 1000000000
X=X+COMPLICATED_FUNCTION(I)
END DO
只要这个循环的迭代能够以一个自动的方式对共享变量X作修改,它就可以并行执行。另外,还可以通过更改临时本地累加变量实现循环的并行执行,只须在最后阶段将这些变量的值同X的初始值合并在一起。无论哪种情况,此计算在概念上都是可并行的,但是由于HPF 1.0中对INDEPENDENT的严格定义使得它在该版本下不能并行执行。
在这里有必要提到Fortran现在包含了一些方式来解释数据并行计算:
.数组赋值,包括WHERE语句
.内部和用户定义函数基本引用
.FORALL语句和结构,包括PURE函数的元素方面的引用
.转换内部函数如SUM和TRANSPOSE
(Fortran采纳了HPF 1.0中的FORALL和PURE)由于这些现在都是Fortran的一部分,在本文档中不再对它们单独讨论。
Copyright: NPACT |