循环矢量化以及如何避免它

Posted

技术标签:

【中文标题】循环矢量化以及如何避免它【英文标题】:Loop vectorization and how to avoid it 【发布时间】:2011-05-24 16:47:28 【问题描述】:

循环向量化是在开始时计算所有右侧表达式。我刚刚发现我的循环正在被矢量化(在 FORTRAN 77 中......不要问)。我需要在每次迭代中更新循环条件变量,但是如何重写以解决这个向量化问题?

在related post 中,我正在寻找一种方法来专门禁用 FORTRAN 中的此优化“功能”,但在这里我正在寻找针对一般情况的更算法解决方案。

【问题讨论】:

我不确定您发布两个相关问题是否有助于您获得对潜在问题的明确答案。这让我很困惑! 我很抱歉。我认为向一般情况和一般观众提出问题可能是一件好事,并且将 FORTRAN 特定的细节保留在 FORTRANnies 的另一个线程中也可能是件好事。不过,我会从那里交叉引用这个线程。 你说的是循环展开吗? 无循环展开和矢量化不是一回事,尽管有时矢量化用于实现循环展开。 【参考方案1】:

这不是循环矢量化对我的意义。对我来说,这句话意味着编译器将生成可以利用硬件的任何向量计算能力的代码。在简单的 Intel Xeon 上,这可能意味着生成 SSE4 指令以同时操作几个相邻的数组元素,在 Cray 上,在向量寄存器上同时执行相同操作方面可能有更多的可用空间。

您认为所有 RHS 表达式都是如何“在开始时计算的”?我不确定你的意思。你能发布一些代码来解释吗?如果您的意思是在进入第一次迭代时计算通过循环的次数,那么这是正确的。在优化代码时,这是一项非常有用的功能,而且大多数 Fortran 程序都不会从避免中受益。

如果您在 Fortran 中编写 DO 循环,则标准禁止更新迭代变量,而且我记得一直是这样。你的编译器可能会让你侥幸逃脱,但我不相信发生这种情况的 Fortran 程序。

【讨论】:

都很受欢迎,是的,这些都是 DO 循环,所以这一定是我的问题!我想我可以做一个 IF/THEN/GOTO 组合。 如果您发布一些代码,我们也许可以帮助您解开依赖关系。如果可能的话,避免使用条件总是好的,如果没有其他的优化。如果你曾经写过 GOTO 语句,我也允许你在另一只脚上开枪:-)

以上是关于循环矢量化以及如何避免它的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Microsoft Visual Studio 2017 或 2019 中启用或使用自动矢量化以及自动并行化?

量化如何以及何时在 TFLite 图中起作用?

究竟啥是现场注入以及如何避免它?

如何有效的管理:组织,目标,团队以及量化

如何对 Matlab 流程进行基准测试?

为啥 Delphi IBX TWideMemoField 转换 UTF8 字符串中的字节顺序以及如何避免它?