在gcc编译器中,是否有仅启用自动矢量化的方法?我确实知道-ftree-vectorize
标志启用自动矢量化。但它至少需要-O2
个优化级别。有没有一种方法可以在不使用-O2
优化标志的情况下启用自动矢量化?
先谢谢了。
答案 0 :(得分:4)
实际上,您可以结合使用-ftree-vectorize
和-O1
来实现良好的自动矢量化,例如:Godbolt。
但是,对于-O0
,即使对于非常简单的示例,也不会生成矢量化代码。
我怀疑gcc的树矢量化器甚至没有用-O0
调用,也没有被调用并解救,但这必须在gcc源代码中进行验证。
通常,-O0
和自动矢量化不能很好地融合在一起。在编译器中,优化是分阶段进行的,每个优化阶段都为下一个阶段做准备。
为了使自动矢量化发生,至少在不平凡的示例中,编译器必须事先执行一些优化。例如,包含跳转的循环通常无法向量化,除非通过名为 if-conversion 的优化消除分支并用谓词指令替换-导致代码块平坦,可以更方便地对其向量化
脚注-我遇到了关于nice presentation的有关GCC自动矢量化的知识,您可能会发现它很有趣-它很好地介绍了如何使用gcc,编译器标志和基本概念进行自动矢量化。