2014-09-13 389 views
2

我有配置:Intel(R)Core(TM)i7-4702MQ CPU(具有Haswell架构),Windows 8,Intel C++ Compiller XE 13.0。 我想运行我的AVX2优化方案,并把编译标志:如何验证操作系统是否支持avx2指令

/QaxCORE-AVX2, /QxCORE-AVX2

但是当我运行该程序,我得到错误:

Fatal Error: This program was not built to run in your system. Please verify that both the operating system and the processor support Intel(R) AVX2, BMI, LZCNT, HLE, RTM, and FMA instructions.

我跑这页上给出AVX2 CPU支持测试: How to detect new instruction support in the 4th generation Intel Core processor family。 结果:

This CPU supports ISA extensions introduced in Haswell.

我如何检查我的操作系统支持AVX2扩展,而这可能是错误的原因是什么?对于使用avx2扩展我需要设置/QaxCORE-AVX2/QxCORE-AVX2标志?

UPD:如果我设置标志

/QxAVX 

该程序已成功启动。

+0

也许XSAVE被禁用。我不知道如何启用它,但它可能是一个启动配置。 – Mysticial 2014-09-13 06:41:57

+0

@Mysticial我用函数IsProcessorFeaturePresent(PF_XSAVE_ENABLED)创建简单的win32项目。这个函数返回True。 – 2014-09-13 07:20:35

+0

检查什么时候?在编译时?在运行时?无论如何,这更像是一个与市场相关的问题,例如2955U是赛扬正式基于Haswell架构的产品,但它甚至不提供第一代AVX。 – user2485710 2014-09-13 17:52:26

回答

4

如果你要检查一组特定的寄存器的支持,你基本上有两个选择:

  • 组件,你的编译器提供的CPUID扩展
  • 内建函数(如果)

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

现在当你需要以内建函数的形式调查你的cpu功能时,gcc和其他编译器会为你的基本需求实现一些东西,这意味着这个特殊的函数会在程序集中生成等价的代码,并给你答案想。

使用gcc,对AVX2检查是

... 
if(__builtin_cpu_supports("avx2")) 
{ 
    ... 
} 
... 

文档一样容易写: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