R_K*_*app 5 gcc simd auto-vectorization
使用GCC编译器时,该-ftree-vectorize选项会启用自动矢量化,并且在使用时会自动设置此标志-O3。它可以向量化到什么水平?即,我将获得SSE2,SSE4.2,AVX或AVX2指令吗?我知道mavx,mavx2标志等的存在,但是我想知道没有那些特定标志来强制进行特定类型矢量化的编译器在做什么。
所有 x86 64 位处理器至少具有 SSE2。GCC 编译器将默认使用 64 位模式的 SSE2 代码,除非您告诉它使用其他硬件选项。
对于 32 位模式,GCC 可能使用非 SIMD 指令的 x87 指令,因此要启用矢量化,请确保至少启用带有-mfpmath=sse -msse2.
如果启用更高的 SIMD 选项,则编译器可能(并且在许多情况下)在向量化时使用这些新指令。
我相信 Clang 也是如此。然而,ICC 和 MSVC 的做法不同。ICC 可以创建一个 CPU 调度程序来选择最佳硬件(或否决 AMD 硬件)。MSVC 仅具有在 64 位模式下启用 AVX 和 AVX2 的选项(假定为 SSE2)。无法使用 MSVC 显式启用例如 SSE4.1。相反,在某些情况下,自动矢量化器将添加代码来检查 SSE4.1(但不是 AVX)并使用这些指令。如果您告诉 GCC 使用-msse4.1或更高版本(例如 ), GCC 将仅使用 SSE4.1 -mavx。