我最近看到Visual Studio2019预览版增加了一个用AVX512编译的选项。好的,我试过了,它起作用了。但是为什么它能工作,而我的CPU没有这样的能力呢?
我正在使用下面的C/C++脚本来检测CPU功能:https://docs.microsoft.com/en-us/cpp/intrinsics/cpuid-cpuidex?view=vs-2019
运行此脚本时,所有AVX512标志(AVX512F、AVX512CD、AVX512PF和AVX512ER)在我的系统上都不可用。
Visual Studio 2019预览版有以下选项: AVX、AVX2、AVX512、SSE和SSE2。AVX、AVX2、SSE和SSE2编译软件在我的PC上运行,上面列出的脚本表明我的PC支持所有这四个(AVX、AVX2、SSE和SSE2)。
正如您现在所理解的,唯一的问题似乎是AVX512功能。它可以在我的PC上运行,但我运行的每个脚本都显示我没有AVX512。
谢谢!
发布于 2019-11-06 22:51:33
大概是编译器在自动向量化.时选择不实际使用任何AVX512指令,或者只在测试用例中没有调用的函数中使用。
启用AVX512意味着编译器可以选择使用AVX512指令,但这并不意味着它一定会这样做。如果没有,那么它就没有任何在没有AVX512的CPU上出错的指令。
我不知道MSVC的默认调优选项是什么,但使用512位向量并不总是有利的,特别是对于大多数时间都花在标量代码上的程序。(在当前支持AVX512的Skylake-X CPU上,运行512位uop可以在接下来的几毫秒内减少最大加速时间。)
对于256位的向量,有时使用AVX512VL指令(EVEX编码)很有用,比如将多个布尔操作与vpternlogd组合在一起,或者使用像vpermt2d这样的新混洗方法。或者AVX2或更早版本中可用的指令的EVEX编码,以便使用更多的寄存器(ymm16..31)或用于屏蔽操作。
或者你的循环没有一个是自动向量化的,或者你没有使用足够高的优化级别来尝试自动向量化。
发布于 2021-07-30 01:51:37
MSVC的编译器是一个多版本的自动向量器。因为当您指定AVX-512代码生成时,它还将生成AVX2、AVX、SSE、MMX和纯定标器回退代码,并且它将为可用的最高指令集添加运行时检查。
请注意,这种情况不会发生在内部函数中,例如:
_mm256_add_ps(float*, float*); //AVX2 floating point add
https://stackoverflow.com/questions/58731940
复制相似问题