是否有可能绕过FORTRAN中的循环向量化?我正在为特定项目编写F77标准,但GNU gfortran通过现代FORTRAN编译,例如F95。有没有人知道某些FORTRAN标准是否避免了循环矢量化,或者gfortran中是否有任何标志/选项可以关闭它?
更新:所以,我认为我的具体问题的最终解决方案必须“DO”与FORTRAN DO循环不允许更新迭代变量。提及这个问题可以在@High Performance Mark的回复中找到... Loop vectorization and how to avoid it
[进入FORT,RAN用于避难所的新手。]
答案 0 :(得分:3)
Fortran标准通常没有说明如何实现语言,而是将其留给编译器编写者,他们可以更好地确定实现语言各种功能的最佳或好(和坏)选项。无论他们为什么编写芯片架构。
当你写下你想要绕过循环矢量化时,你是什么意思?并在下一句中建议FORTRAN77程序无法使用它?如果CPU能够遵守它们,则现代CPU的编译器生成向量指令是完全正常的。无论编写该程序的语言版本都是如此。
如果你真的不想生成向量指令,那么你必须仔细检查gfortran文档 - 它不是我使用的编译器所以我不能指向你特定的选项或标志。您可能希望了解其特定于体系结构的代码生成的功能,特别注意SSE级别。
如果你的所有循环都是显式的(所以没有全数组操作),并且如果你的代码难以以其他方式进行矢量化(例如循环迭代之间的依赖关系),那么你可能能够强制编译器不进行矢量化循环。但是一个好的现代编译器,在没有干扰的情况下,会尝试最好地为你自己设计好的回路。
对我来说,试图强迫编译器违背其性质似乎是不正常的,也许你可以解释为什么你想要更详细地做到这一点。
答案 1 :(得分:1)
正如High Performance Mark所写,只要结果符合语言规则,编译器就可以自由选择机器指令来实现源代码。由于循环向量化,您不应该观察到输出值的任何差异...您的代码应该运行得更快。那你为什么要关心?
有时可以在优化级别上观察到差异,例如,某些体系结构寄存器具有额外的精度。
寻找这些编译器优化的地方是gcc手册。它们位于那里,因为它们在gcc编译器套件中很常见。
答案 2 :(得分:1)
对于大多数现代编译器,命令行选项-O0应该关闭所有优化,包括循环向量化。
我有时发现这会导致错误显然消失。但通常这意味着我的代码有问题,所以如果发生这种事情,那么你几乎肯定写了一个错误的程序。
理论上可行,但编译器中存在错误的可能性要小得多,您可以通过在另一个fortran编译器中编译代码来轻松检查这一点。 (例如gfortran或g95)。
答案 3 :(得分:1)
除非你设置-O3或-ftree-vectorize,否则gfortran不会自动矢量化。所以很容易避免矢量化。您可能需要阅读(浏览)gcc手册以及gfortran手册 自动矢量化已经成为Fortran编译器的一个众所周知的功能超过35年,甚至Fortran 77定义的DO循环也是考虑到这一点(并且考虑到一些已知的非便携式滥用F66标准)。你不能指望关闭矢量化作为一种使代码工作不正确的方法,尽管它可能会暴露出错误代码的症状。