GNU中的-ftree-vectorize选项

11

使用GCC编译器,-ftree-vectorize选项可开启自动向量化功能,当使用-O3时,此标志会自动设置。它的向量化程度是什么?例如,我是否会得到SSE2、SSE4.2、AVX或AVX2指令?我知道存在mavxmavx2等标志,但我想知道编译器在没有这些特定标志强制执行特定类型的向量化时正在做什么。


我假设你只对x86指令集感兴趣?你的问题也可能适用于其他架构,比如ARM的Neon。 - Z boson
2
我认为实际上只有-ftree-slp-vectorize被_O3_打开,而不是-ftree-vectorize文档 - Romeo Valentin
2
@RomeoValentin 在O2级别下,-ftree-loop-vectorize-ftree-slp-vectorize都被启用了,这似乎与-ftree-vectorize的定义是一致的。 - malat
1个回答

4

所有的x86 64位处理器都至少支持SSE2。GCC编译器默认在64位模式下使用SSE2代码,除非您告诉它使用其他硬件选项。

对于32位模式,GCC可能使用x87指令,这些指令不是SIMD指令,因此要启用矢量化,请确保至少启用SSE:-mfpmath=sse -msse2

如果启用了更高的SIMD选项,则编译器可能(在许多情况下)在矢量化时使用那些新指令。

我认为Clang也是如此。但是,ICC和MSVC的做法不同。ICC可以创建一个CPU分发器来选择最佳硬件(或否决AMD硬件)。MSVC仅在64位模式下有启用AVX和AVX2的选项(SSE2被假定)。没有办法明确地启用例如SSE4.1等选项。相反,在某些情况下,自动向量化程序将添加代码以检查SSE4.1(但不是AVX)并使用这些指令。GCC仅在您告诉它使用SSE4.1时才会使用SSE4.1,例如:-msse4.1或更高版本的-mavx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接