在高性能Fortran(HPF)中,我可以使用DISTRIBUTE
指令指定并行计算中涉及的数组的分布。例如,以下最小子例程将对两个数组进行并行求和:
subroutine mysum(x,y,z)
integer, intent(in) :: y(10000), z(10000)
integer, intent(out) :: x(10000),
!HPF$ DISTRIBUTE x(BLOCK), y(BLOCK), z(BLOCK)
x = y + z
end subroutine mysum
我的问题是DISTRIBUTE
指令必需吗?我知道实际上没有什么兴趣,但是我很好奇一个未经修饰的,无指令的Fortran程序是否也可以是有效的HPF程序?
我不认为有必要使用DISTRIBUTE语句,并且我从未使用过它。
您可以通过使用FORALL语句而不是在适用的情况下使用DO循环来隐式实现。最初,DO循环将对数组元素给出明确的操作顺序,而FORALL将允许处理器在运行时确定最佳顺序。我认为现在这没有太大区别,因为现代编译器能够在可能的情况下优化/矢量化/并行化DO循环。对于其他编译器,我无法确定,但是我记得使用Intel Fortran编译器在不使用DISTRIBUTE的情况下在2和4个处理器上并行编译和运行程序。
但是,最好根据处理器的体系结构和编译器,尝试一下所拥有的,然后看看能为您带来最佳结果或效率。