GCC、Clang和MSVC的C++自动向量化要求

3
以下陈述是否正确?
1. 如果我使用GCC和clang,并使用以下编译选项进行编译,则我的代码将自动向量化:-O2 -ftree-vectorize -march=XYZ(XYZ是目标指令集:本机,SSE,AVX2等)或-O3 -march=XYZ。 2. 如果我使用MSVC编译器并使用/O2选项进行编译,则我的代码将自动向量化。 此视频似乎表明我不需要使用MSVC指定体系结构。这是正确的吗?编译器将默认使用本机架构,并在运行时回退到标量操作,如果找不到矢量指令。

2
你是否查阅了文档?在谷歌搜索“visual studio vectorisation”的第一个结果会带你到解释这个问题的页面。 - Lightness Races in Orbit
1
我支持:3. 依赖编译器自动向量化我的代码是错误的。 - user7860670
自动向量化器可能会生成与 /arch 开关指定的不同指令。这些指令受到运行时检查的保护,以确保代码仍然正确运行。例如,当您编译 /arch:SSE2 时,可能会发出 SSE4.2 指令。运行时检查验证目标处理器上是否可用 SSE4.2,并在处理器不支持这些指令时跳转到非 SSE4.2 版本的循环。基本上,它生成多个版本,并在运行时决定使用哪个版本。 - ChrisMM
这是文档中让我感到困惑的部分。它暗示着我的二进制文件非常臃肿,因为它们包含了两个或三个不同版本的程序。这让我感到惊讶,这也是我首先发布这个问题的原因。 - Touloudou
您可以查看反汇编以了解它的确切操作。同时请记住,大多数代码实际上无法进行矢量化处理,因此不会添加太多代码。 - ChrisMM
请注意,我正在处理一个包含大量可向量化循环的大型科学代码。由于代码库非常庞大,查看生成的汇编代码相当困难...我现在正在尝试使用Intel Advisor来找出问题所在。 - Touloudou
1个回答

4

我不需要在MSVC中指定架构,这是正确的吗?

是的,这是正确的。默认情况下,使用MSVC时,自动向量化器已启用,并选择最快的向量化指令集。此外,即使您指定了arch,自动向量化器可能会生成与/arch开关指定的不同的指令 - 如documentation所述。例如,当您编译/arch:SSE2时,可能会发出SSE4.2指令。

另外,与gcc或clang相比,VS向量化程序缺少很多功能。

如果我使用-O2 -ftree-vectorize -march=XYZ编译,我的代码是否会自动向量化?-O3 -march=XYZ ?

不一定,要启用浮点约简的矢量化,您还需要使用 -ffast-math -fassociative-math 。但是,通常情况下是启用的。您可以在documentation中找到同样的内容,矢量化由标志- ftree-vectorize 启用,并默认为- O3

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接