GCC、CLANG 和 MSVC 的可视化C++自动矢量化要求

visual C++ auto-vectorization requirements for gcc, clang and msvc

本文关键字:矢量化 C++ 可视化 CLANG MSVC GCC      更新时间:2023-10-16

以下陈述是否正确?

使用
  1. GCC 和 clang,如果我使用 :

    • -O2 -ftree-vectorize -march=XYZ(XYZ是目标指令集:本机,SSE,AVX2等(
    • -O3 -march=XYZ
  2. 使用 MSVC,如果我使用以下方法进行编译,我的代码将被自动矢量化:

    • /O2

此视频似乎表明我不需要使用 MSVC 指定体系结构。这是对的吗?默认情况下,编译器将使用本机体系结构,如果找不到矢量指令,则在运行时回退到标量操作。

我不需要使用 MSVC 指定体系结构。这是对的吗?

是的,这确实是正确的。使用 MSVC,默认情况下,自动矢量化器处于启用状态,并选取适当的指令集以实现最快的矢量化。此外,即使您指定了arch,自动矢量化器也可能生成与/arch开关指定的指令不同的指令 - 如文档所述。例如,当您编译/arch:SSE2时,可能会发出SSE4.2指令。

另一方面,与 gcc 或 clang 相比,VS 矢量化器缺乏相当多的功能。

使用

GCC 和 clang,如果我使用-O2 -ftree-vectorize -march=XYZ编译,我的代码将被自动矢量化?-O3 -march=XYZ ?

不一定,要启用浮点约简的矢量化,您还需要使用-ffast-math-fassociative-math。但是,一般来说,是的,它将被启用。您可能会在文档中找到相同的内容,矢量化由标志 -ftree-vectorize 启用,默认情况下为 -O3

PS:您可以使用 https://godbolt.org 来查看所有这些操作!