为什么VS C/C++AVX512编译的软件在我的系统上工作,而我的CPU没有AVX512



我最近看到Visual Studio 2019预览版添加了一个使用AVX512编译的选项。好的,我试过了,效果很好。但是,为什么我的CPU没有这样的能力,它却能工作呢?

我正在使用以下C/C++脚本来检测CPU功能:https://learn.microsoft.com/en-us/cpp/intrinsics/cpuid-cpuidex?view=vs-2019年

运行此脚本时,我的系统上的所有AVX512标志(AVX512F、AVX512CD、AVX512 PF和AVX512 ER(都不可用。

Visual Studio 2019预览版具有以下选项[AVX、AVX2、AVX512、SSE和SSE2]。AVX、AVX2、SSE和SSE2编译的软件在我的电脑上运行,上面列出的脚本表明我的电脑支持这四种软件(AVX、AVX2、SSE、SSE2(。

正如您现在所理解的,唯一的问题似乎是AVX512的功能。它在我的电脑上运行,但我运行的每个脚本都说我没有AVX512。

谢谢!

推测编译器在自动向量化时选择不实际使用任何AVX512指令或者只在测试用例中未被调用的函数中调用。

启用AVX512意味着编译器可以选择使用AVX512指令,而不是说它一定会。如果没有,那么在没有AVX512的CPU上就没有任何会出错的指令。


我不知道MSVC的默认调优选项是什么,但使用512位矢量并不总是有利可图的,尤其是对于那些将大部分时间花在标量代码中的程序。(在当前支持AVX512的Skylake-X CPU上,运行512位uop可以在接下来的几毫秒内降低最大turbo。(

对于256位矢量,有时使用AVX512VL指令(EVEX编码(很有用,比如将多个布尔运算与vpternlogd组合,或者使用一个新的混洗(比如vpermt2d(。或者AVX2或更早版本中可用的指令的EVEX编码,仅用于使用更多寄存器(ymm16..31(或屏蔽操作。

或者你的循环没有自动向量化,或者你没有使用足够高的优化级别来尝试自动向量化。

MSVC的编译器是一个多版本自动矢量器。在中,当您指定AVX-512代码生成时,它还将生成AVX2、AVX、SSE、MMX和纯缩放器回退代码,并且它将为可用的最高指令集添加运行时检查。

请参阅自动矢量器部分:https://learn.microsoft.com/en-us/cpp/parallel/auto-parallelization-and-auto-vectorization?view=msvc-160

请注意,对于诸如之类的内在函数,这种情况不会发生

_mm256_add_ps(float*, float*); //AVX2 floating point add

最新更新