13

我试图用它forall来分配动态数组,但 gfortran 不喜欢这样。我还发现write语句在块中是被禁止的forall,我怀疑read语句也是。

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

do除了有时在顺序无关紧要时替换循环之外,这个构造究竟是什么?我认为它会使编码更加清晰和优雅,尤其是在操作顺序不重要时显示出来,但是对于可以在forall.

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

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

4

2 回答 2

18

现在没有太多需要FORALLWHERE建设。它们是作为 Fortran 95(Fortran 90 的小扩展)的一部分引入的,主要是为了优化,当时代码向量化是 HPC 中的主要内容。应用如此受限的原因FORALL正是因为它是为循环优化而设计的。另请注意,FORALL它不是循环构造,而是赋值。因此,块内只允许赋值语句。理论上,DO循环给出了关于处理器将要循环的索引顺序的明确说明。构造允许编译器根据FORALL数组在内存中的存储方式选择最佳顺序。然而,随着时间的推移,这已经失去了意义,因为现代编译器非常擅长DO循环矢量化,您不太可能注意到使用FORALL.

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

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

于 2011-12-22T15:57:06.033 回答
8

Forall事实证明,construct 过于严格,并且仅对数组​​操作有用。有关确切的限制,请参阅IBM Fortran-FORALL。限制较少的是do concurrentFortran 2008 的构造。即使readwrite语句在那里也被允许。请参阅Intel Fortran-DO CONCURRENTFortran 2008 的新功能

于 2011-12-22T11:01:09.017 回答