GCC 自动矢量化
GCC Auto Vectorization
在 gcc 编译器中有没有办法只启用自动矢量化?我知道 -ftree-vectorize
标志启用自动矢量化。但它至少需要 -O2
优化级别。有没有一种方法可以在不使用 -O2
优化标志的情况下启用自动矢量化?
提前致谢。
您实际上可以通过 -ftree-vectorize
结合 -O1
获得不错的自动矢量化,例如:Godbolt.
然而,使用 -O0
,即使是非常简单的示例,也不会生成矢量化代码。
我怀疑 gcc 的树矢量化器甚至没有用 -O0
调用,或者调用并退出,但这必须在 gcc 源代码中验证。
通常,-O0
和自动矢量化不能很好地结合。在编译器中,优化分阶段进行,每个优化阶段都为下一个优化阶段做准备。
为了进行自动矢量化,至少在非平凡的例子中,编译器必须事先执行一些优化。例如,包含跳转的循环通常不能被矢量化,除非通过称为 if-conversion 的优化消除分支并用谓词指令替换 - 导致平坦的代码块,这可能是矢量化更方便。
脚注 - 我遇到了关于 GCC 自动矢量化的 nice presentation,您可能会发现它很有趣 - 它很好地介绍了使用 gcc、编译器标志和基本概念进行自动矢量化。
在 gcc 编译器中有没有办法只启用自动矢量化?我知道 -ftree-vectorize
标志启用自动矢量化。但它至少需要 -O2
优化级别。有没有一种方法可以在不使用 -O2
优化标志的情况下启用自动矢量化?
提前致谢。
您实际上可以通过 -ftree-vectorize
结合 -O1
获得不错的自动矢量化,例如:Godbolt.
然而,使用 -O0
,即使是非常简单的示例,也不会生成矢量化代码。
我怀疑 gcc 的树矢量化器甚至没有用 -O0
调用,或者调用并退出,但这必须在 gcc 源代码中验证。
通常,-O0
和自动矢量化不能很好地结合。在编译器中,优化分阶段进行,每个优化阶段都为下一个优化阶段做准备。
为了进行自动矢量化,至少在非平凡的例子中,编译器必须事先执行一些优化。例如,包含跳转的循环通常不能被矢量化,除非通过称为 if-conversion 的优化消除分支并用谓词指令替换 - 导致平坦的代码块,这可能是矢量化更方便。
脚注 - 我遇到了关于 GCC 自动矢量化的 nice presentation,您可能会发现它很有趣 - 它很好地介绍了使用 gcc、编译器标志和基本概念进行自动矢量化。