使用GCC编译器,-ftree-vectorize
选项可开启自动向量化功能,当使用-O3
时,此标志会自动设置。它的向量化程度是什么?例如,我是否会得到SSE2、SSE4.2、AVX或AVX2指令?我知道存在mavx
、mavx2
等标志,但我想知道编译器在没有这些特定标志强制执行特定类型的向量化时正在做什么。
使用GCC编译器,-ftree-vectorize
选项可开启自动向量化功能,当使用-O3
时,此标志会自动设置。它的向量化程度是什么?例如,我是否会得到SSE2、SSE4.2、AVX或AVX2指令?我知道存在mavx
、mavx2
等标志,但我想知道编译器在没有这些特定标志强制执行特定类型的向量化时正在做什么。
所有的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
。
-ftree-slp-vectorize
被_O3_打开,而不是-ftree-vectorize
。文档 - Romeo ValentinO2
级别下,-ftree-loop-vectorize
和-ftree-slp-vectorize
都被启用了,这似乎与-ftree-vectorize
的定义是一致的。 - malat