9

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

4

1 回答 1

4

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

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

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

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

于 2015-11-10T09:44:02.863 回答