如何验证操作系统是否支持avx2指令

Kon*_*pov 4 c intel instruction-set vectorization avx2

我有配置:Intel(R)Core(TM)i7-4702MQ CPU(带Haswell架构),Windows 8,Intel C++ Compiller XE 13.0.我想用avx2优化运行我的程序并放置编译标志:

/ QaxCORE-AVX2,/ QxCORE-AVX2

但是当我运行程序时,我收到错误:

致命错误:此程序未构建为在您的系统中运行.请确认操作系统和处理器均支持Intel(R)AVX2,BMI,LZCNT,HLE,RTM和FMA指令.

我运行avx2 cpu支持测试,该测试在页面上给出:如何在第4代Intel Core处理器系列中检测新的指令支持.结果:

该CPU支持Haswell中引入的ISA扩展.

如何检查我的操作系统是否支持avx2-extensions以及可能导致错误的原因?为了使用avx2扩展,我需要设置两个/QaxCORE-AVX2/QxCORE-AVX2标志?

upd:如果我设置了标志

/QxAVX
Run Code Online (Sandbox Code Playgroud)

该计划已成功启动.

use*_*710 6

如果要检查对特定寄存器集的支持,您基本上有两个选项:

  • 具有CPUid扩展的程序集
  • 内置函数(if)由编译器提供

编写检测支持哪些寄存器集的程序集是一项繁琐,冗长且可能容易出错的任务,更不用说它不能在不同的操作系统,不同的SoC和不同的ABI之间移植的程序集,还有CPUid指令的负担.并不总是在所有CPU中使用相同的模式实现,有不同的方法可以与同一供应商的不同供应商甚至不同的CPU系列达到相同的信息; 但这有一个很大的优势,它不受任何限制,如果你真的需要了解你的CPU/SoC,汇编+ CPUid相关的东西是要走的路.

现在,当您必须以内置函数的形式调查cpu功能时,gcc和其他编译器会为您的基本需求实现一些东西,这意味着这个特殊函数将在汇编中生成等效代码并为您提供所需的答案.

使用时gcc,检查AVX2和写入一样简单

...
if(__builtin_cpu_supports("avx2"))
{
  ...
}
...
Run Code Online (Sandbox Code Playgroud)

docs:http://gcc.gnu.org/onlinedocs/gcc/X86-Built-in-Functions.html

为Visual Studio/MSVC有内部函数,如__cpuid__cpuidex,您可以使用检索相同的信息,这是一个完整的,工作实例的链接.

docs:http://msdn.microsoft.com/en-us/library/hskdteyh.aspx