GCC 自动矢量化

GCC Auto Vectorization

在 gcc 编译器中有没有办法只启用自动矢量化?我知道 -ftree-vectorize 标志启用自动矢量化。但它至少需要 -O2 优化级别。有没有一种方法可以在不使用 -O2 优化标志的情况下启用自动矢量化?

提前致谢。

您实际上可以通过 -ftree-vectorize 结合 -O1 获得不错的自动矢量化,例如:Godbolt.

然而,使用 -O0,即使是非常简单的示例,也不会生成矢量化代码。 我怀疑 gcc 的树矢量化器甚至没有用 -O0 调用,或者调用并退出,但这必须在 gcc 源代码中验证。

通常,-O0 和自动矢量化不能很好地结合。在编译器中,优化分阶段进行,每个优化阶段都为下一个优化阶段做准备。 为了进行自动矢量化,至少在非平凡的例子中,编译器必须事先执行一些优化。例如,包含跳转的循环通常不能被矢量化,除非通过称为 if-conversion 的优化消除分支并用谓词指令替换 - 导致平坦的代码块,这可能是矢量化更方便。

脚注 - 我遇到了关于 GCC 自动矢量化的 nice presentation,您可能会发现它很有趣 - 它很好地介绍了使用 gcc、编译器标志和基本概念进行自动矢量化。