Fortran forall限制

Sam*_*Tan 7 fortran loops fortran95

我试图用来forall分配动态数组,但gfortran并不喜欢这样.我还发现write一个forall块中禁止使用语句,我怀疑read语句也是如此.

forall块中不允许哪些其他功能/操作?

究竟什么是这个结构,除了有时do在顺序无关紧要时更换循环?我认为它会使编码更清晰,更优雅,尤其是在操作顺序不重要的时候显示,但是对于可以在内部进行的操作而言似乎相当严格forall.

这些限制的原因是什么,即它们保护/防止用户搞砸了什么?使用它是个好主意forall吗?如果是这样,为了什么目的?

现在在我正在处理的代码中只有一个forall块,如果我将它全部翻译成do循环,它将提供四个嵌套循环.哪种方式更好?

mil*_*cic 12

现在没有太多的需要FORALLWHERE构造.它们作为Fortran 95的一部分(Fortran 90的次要扩展)引入,主要是为了优化,当代码矢量化是HPC中的一个主要内容时.FORALL应用程序如此受限的原因正是因为它是为循环优化而设计的.还要注意,FORALL它不是循环结构,而是赋值.因此,块内只允许赋值语句.理论上,DO循环给出了关于处理器将要循环的索引顺序的明确指令.甲FORALL构建体允许编译器选择基于阵列如何存储在存储器中的最优化的顺序.然而,随着时间的推移,这已经失去了意义,因为现代编译器非常擅长DO循环向量化,并且您不太可能注意到使用的任何改进FORALL.

看到一个很好的讨论FORALL,并WHERE 在这里

如果您担心代码性能,您可能更愿意考虑使用不同的编译器 - PGIifort.根据我自己的经验,gfortran适合开发,但不适合HPC.使用pgf90或ifort编译的代码,您会发现执行速度提高了几倍.


Vla*_*r F 6

Forall结构被证明是非常严格的,并且主要用于阵列操作.有关确切的限制,请参阅IBM Fortran - FORALL.限制性较小的是do concurrentFortran 2008 的构造.偶数readwrite语句是允许的.请参阅英特尔Fortran - DO CONCURRENTFortran 2008的新功能.