我尝试使用 forall
分配动态数组,但 gfortran 不喜欢那样。我还发现 write
forall
中禁止声明阻止,我怀疑 read
陈述也是。forall
中不允许的其他功能/操作块?
除了有时替换 do
之外,这个构造到底是做什么的当顺序无关紧要时循环?我认为这会使编码更清晰和优雅,尤其是在操作顺序不重要时显示,但似乎对可以在 forall
中完成的操作有很大限制。 .
这些限制的原因是什么,即它们保护/防止用户搞砸的原因是什么?使用 forall
是个好主意吗? ?如果是这样,目的是什么?
现在在我正在处理的代码中只有一个 forall
阻止,如果我把它全部翻译出来 do
循环它会给出四个嵌套循环。哪种方式更好?
最佳答案
FORALL
的需求不大和 WHERE
当今建筑。它们是作为 Fortran 95(Fortran 90 的次要扩展)的一部分引入的,主要是为了优化,当时代码矢量化是 HPC 中的主要内容。原因FORALL
应用如此有限,正是因为它是为循环优化而设计的。另请注意,FORALL
不是循环结构,而是赋值。因此,块内只允许赋值语句。理论上,DO
循环给出关于处理器将要循环的索引顺序的明确指令。 A FORALL
构造允许编译器根据数组在内存中的存储方式选择最佳顺序。然而,随着时间的推移,这已经失去了意义,因为现代编译器非常擅长 DO
循环矢量化,您不太可能注意到使用 FORALL
有任何改进。 .
在 FORALL
上看到一个很好的讨论和 WHERE
here
如果您担心代码性能,您可能更愿意考虑不同的编译器 - PGI或 ifort .根据我自己的经验,gfortran 适合开发,但并不适合 HPC。您会注意到使用 pgf90 或 ifort 编译的代码执行速度提高了数倍。
关于loops - Fortran forall 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8602596/