0

是否可以绕过 FORTRAN 中的循环矢量化?我正在为特定项目编写 F77 标准,但 GNU gfortran 通过现代 FORTRAN 编译,例如 F95。有谁知道某些 FORTRAN 标准是否避免了循环矢量化,或者 gfortran 中是否有任何标志/选项可以关闭它?

更新:所以,我认为我的具体问题的最终解决方案必须“DO”与 FORTRAN DO 循环不允许更新迭代变量。可以在@High Performance Mark 对此相关线程的回复中找到对此的提及...循环矢量化以及如何避免它

[进入堡垒,让菜鸟躲避。]

4

4 回答 4

3

Fortran 标准通常对如何实现语言保持沉默,将其留给编译器编写者,他们可以更好地确定在任何芯片架构上实现语言的各种功能的最佳或好的(和坏的)选项(s) 他们正在写作。

当您写要绕过循环矢量化时,您是什么意思?并在下一句中暗示这对 FORTRAN77 程序不可用?如果 CPU 能够服从它们,现代 CPU 的编译器生成向量指令是完全正常的。无论程序是用什么版本的语言编写的,都是如此。

如果您真的不想生成向量指令,那么您必须仔细检查 gfortran 文档——它不是我使用的编译器,所以我无法为您指出特定的选项或标志。您可能想查看其特定于架构的代码生成功能,特别注意 SSE 级别。

如果您的所有循环都是显式的(因此没有整个数组操作)并且如果您使您的代码难以以其他方式矢量化(例如循环迭代之间的依赖关系),您可能能够强制编译器不进行矢量化循环。但是一个好的现代编译器,没有干扰,会为了你自己的利益而尽其所能地向量化循环。

试图强迫编译器违背其本质对我来说似乎是相当不正当的,也许您可​​以更详细地解释为什么要这样做。

于 2010-12-13T14:20:47.103 回答
1

正如高性能标记所写,只要结果符合语言规则,编译器就可以自由选择机器指令来实现您的源代码。由于循环矢量化,您应该无法观察到输出值的任何差异......您的代码应该运行得更快。那你为什么在乎?

有时可以在优化级别之间观察到差异,例如,在某些架构上,寄存器具有额外的精度。

寻找这些编译器优化的地方是 gcc 手册。它们位于那里,因为它们在 gcc 编译器套件中很常见。

于 2010-12-13T14:42:13.443 回答
1

对于大多数现代编译器,命令行选项 -O0 应该关闭所有优化,包括循环向量化。

我有时发现这会导致错误明显消失。然而,通常这意味着我的代码有问题,所以如果你发生这种事情,那么你几乎肯定写了一个有缺陷的程序。

理论上这是可能的,但编译器中存在错误的可能性要小得多,您可以通过在另一个 fortran 编译器中编译代码来轻松检查这一点。(例如 gfortran 或 g95)。

于 2010-12-14T06:39:10.173 回答
1

除非您设置了 -O3 或 -ftree-vectorize,否则 gfortran 不会自动矢量化。所以很容易避免矢量化。您可能需要阅读(略读)gcc 手册以及 gfortran 手册。
35 多年来,自动向量化一直是 Fortran 编译器的一个众所周知的特性,甚至 Fortran 77 对 DO 循环的定义也考虑到了这一点(并且考虑到 F66 标准的一些已知的不可移植的滥用)。您不能指望关闭矢量化作为使不正确代码工作的一种方式,尽管它可能会暴露不正确代码的症状。

于 2015-10-09T13:47:57.200 回答