gcc – GNU中的-ftree-vectorize选项

使用GCC编译器,-ftree-vectorize选项打开自动向量化,并在使用-O3时自动设置此标志.它的矢量化水平是多少?即,我会获得SSE2,SSE4.2,AVX或AVX2指令吗?我知道mavx,mavx2标志等的存在,但我想知道编译器在没有那些特定标志的情况下做什么来强制特定类型的矢量化. 最佳答案 所有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)并使用这些指令.如果您使用-msse4.1或更高级别的内容(如-mavx)告知GCC,GCC将仅使用SSE4.1.

点赞