以下陈述是否正确?
使用 GCC 和 clang,如果我使用以下代码编译,我的代码将自动矢量化:
-O2 -ftree-vectorize -march=XYZ
(XYZ 为目标指令集:native、SSE、AVX2 等)-O3 -march=XYZ
使用 MSVC,如果我使用以下代码编译,我的代码将自动矢量化:
/O2
该视频似乎表明我不需要使用 MSVC 指定架构。那是对的吗?默认情况下,编译器将使用本机架构,如果找不到向量指令,则在运行时回退到标量操作。
以下陈述是否正确?
使用 GCC 和 clang,如果我使用以下代码编译,我的代码将自动矢量化:
-O2 -ftree-vectorize -march=XYZ
(XYZ 为目标指令集:native、SSE、AVX2 等)-O3 -march=XYZ
使用 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
or -fassociative-math
。但是,一般来说,是的,它会被启用。您可能会在文档中找到相同的内容,矢量化由标志 -ftree-vectorize 启用,默认情况下在 -O3
PS:您可以使用https://godbolt.org查看所有这些操作!