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

时间:2014-09-13 05:58:08

标签: c vectorization intel instruction-set 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支持测试,该测试在页面上给出:How to detect new instruction support in the 4th generation Intel Core processor family。 结果:

  

此CPU支持Haswell中引入的ISA扩展。

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

upd :如果我设置了标志

/QxAVX

该计划已成功启动。

1 个答案:

答案 0 :(得分:6)

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

  • 使用CPUid扩展程序进行程序集
  • 编译器提供的内置函数(if)

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

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

使用gcc,检查AVX2就像写

一样简单
...
if(__builtin_cpu_supports("avx2"))
{
  ...
}
...

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