循环向量化是在开始时计算所有右侧表达式。我刚刚发现我的循环正在被矢量化(在 FORTRAN 77 中......不要问)。我需要在每次迭代中更新循环条件变量,但是如何重写以解决这个向量化?
在相关帖子中,我正在寻找一种方法来专门禁用 FORTRAN 中的此优化“功能”,但在这里我正在寻找针对一般情况的更算法解决方案。
循环向量化是在开始时计算所有右侧表达式。我刚刚发现我的循环正在被矢量化(在 FORTRAN 77 中......不要问)。我需要在每次迭代中更新循环条件变量,但是如何重写以解决这个向量化?
在相关帖子中,我正在寻找一种方法来专门禁用 FORTRAN 中的此优化“功能”,但在这里我正在寻找针对一般情况的更算法解决方案。
这不是循环矢量化对我的意义。对我来说,这句话意味着编译器将生成可以利用硬件的任何向量计算能力的代码。在简单的 Intel Xeon 上,这可能意味着生成 SSE4 指令以同时操作几个相邻的数组元素,在 Cray 上,在向量寄存器上同时执行相同操作方面可能有更多的可用空间。
您如何认为所有 RHS 表达式都是“一开始就计算出来的”?我不确定你的意思。你能发布一些代码来解释吗?如果您的意思是在进入第一次迭代时计算通过循环的次数,那么这是正确的。在优化代码时,这是一项非常有用的功能,而且大多数 Fortran 程序都不会从避免中受益。
如果您在 Fortran 中编写 DO 循环,则标准禁止更新迭代变量,并且我记得一直如此。您的编译器可能会让您侥幸逃脱,但我不相信发生这种情况的 Fortran 程序。