如何验证操作系统支持AVX2指令

6
我有以下配置: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扩展?出现错误的原因是什么?为了使用AVX2扩展,我需要同时设置/QaxCORE-AVX2/QxCORE-AVX2标志吗? 更新:如果我设置了标志
/QxAVX

该程序已经成功启动。


可能XSAVE被禁用了。我不确定如何启用它,但很可能是引导配置的问题。 - Mysticial
@Mysticial 我创建了一个简单的Win32项目,并使用函数IsProcessorFeaturePresent(PF_XSAVE_ENABLED)。该函数返回True。 - Konstantin Isupov
检查时间是什么时候?编译时?运行时?不管怎样,这更像是一个市场相关的问题,例如2955U是一款基于Haswell架构的Celeron,但它甚至没有提供第一代AVX。 - user2485710
@user2485710 在运行时。在 http://ark.intel.com/products/75119 上说支持AVX2。在 http://ark.intel.com/products/75608/Intel-Celeron-Processor-2955U-2M-Cache-1_40-GHz 上说Celeron只支持SSE。 - Konstantin Isupov
1
可能你正在运行一个未向客户机公开 AVX2 的虚拟机。i7-4702MQ 绝对支持 AVX 和 AVX2(以及错误消息所抱怨的其他扩展)。 - Peter Cordes
显示剩余2条评论
1个回答

9
如果您想检查特定一组寄存器的支持情况,基本上有两个选项:
  • 使用具有CPUid扩展的汇编
  • 由您的编译器提供的内置函数(if)
编写检测所支持的寄存器集的汇编是一项繁琐、漫长且可能出错的任务,更不用说汇编在不同操作系统、不同SoC和不同ABI之间不具备可移植性,还有CPUid指令的负担,这些指令并不总是以所有CPU中相同的模式实现,有不同的方法可以使用来获得来自不同供应商甚至来自同一供应商的不同CPU系列的相同信息位;但这有一个很大的优点,它没有任何限制,如果您真的需要了解有关您的CPU / SoC的任何信息,汇编+ CPUid相关内容就是最好的选择。
现在,gcc和其他编译器为您的基本需求实现了一些内置函数,这意味着这些特殊函数将生成等效的汇编代码,并给出您想要的答案。
使用gcc,检查AVX2就像编写以下内容一样简单:
...
if(__builtin_cpu_supports("avx2"))
{
  ...
}
...

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

对于Visual Studio / msvc,有内置函数(Intrinsics)如__cpuid__cpuidex,可以用来获取相同的信息。这里提供一个包含完整有效示例的链接。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接