loops - Fortran forall 限制

标签 loops fortran fortran95

我尝试使用 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

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

关于loops - Fortran forall 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8602596/

相关文章:

r - 在 R 中循环一组数字生成命令

variables - Fortran 模块和全局变量

fortran - gfortran 的 get_environment_variable 的意外行为

fortran - Windows 7 64 位上的 compaq visual fortran?

Fortran:将相同的数组作为两个虚拟参数传递给子例程

javascript - JS - 比较 2 个对象数组

JavaScript:For 循环无法正常工作

Java:用户输入整数的循环未正确总计条目

matrix - 求解受约束的线性方程组

fortran - Fortran 95 : 中的数值精度