首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么VS C/C++ AVX512编译软件可以在我的系统上运行,而我的CPU没有AVX512?

为什么VS C/C++ AVX512编译软件可以在我的系统上运行,而我的CPU没有AVX512?
EN

Stack Overflow用户
提问于 2019-11-06 22:05:27
回答 2查看 730关注 0票数 0

我最近看到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。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 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)或用于屏蔽操作。

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

票数 4
EN

Stack Overflow用户

发布于 2021-07-30 01:51:37

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

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

请注意,这种情况不会发生在内部函数中,例如:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58731940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档