GNU 中的 -ftree-vectorize 选项

-ftree-vectorize option in GNU

对于 GCC 编译器,-ftree-vectorize 选项会打开自动矢量化,并且在使用 -O3 时会自动设置此标志。它矢量化到什么水平?即,我会得到 SSE2、SSE4.2、AVX 或 AVX2 指令吗?我知道 mavxmavx2 标志等的存在,但我想知道编译器在没有这些特定标志的情况下正在做什么以强制执行特定类型的矢量化。

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

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

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

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