2015-11-06 104 views
3

使用GCC编译器时,-ftree-vectorize选项会启用自动矢量化,并且在使用-O3时会自动设置此标志。它矢量化的级别是什么?也就是说,我会得到SSE2,SSE4.2,AVX或AVX2指令吗?我知道mavx,mavx2标志等的存在,但我想知道编译器在没有这些特定标志的情况下如何强制执行特定类型的矢量化。GNU中的-ftree-vectorize选项

+0

我假设你只对x86指令集感兴趣?您的问题也可以应用于其他架构,例如带ARM的Neon。 –

回答

1

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

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

如果启用更高级别的SIMD选项,则编译器可能会(并且在很多情况下会)在向量化时使用这些新指令。

我相信Clang也是如此。但是,ICC和MSVC以不同的方式做事。 ICC可能会创建一个CPU调度程序来选择最佳硬件(或否决AMD硬件)。 MSVC只有用于在64位模式下启用AVX和AVX2的选项(假定为SSE2)。没有办法明确地启用例如SSE4.1与MSVC。相反在某些情况下,自动矢量化器将添加代码来检查SSE4.1(但不是AVX)并使用这些指令。 GCC只会使用SSE4.1,如果你告诉它例如-msse4.1或更高的东西,如-mavx