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 支持测试:如何检测第 4 代英特尔酷睿处理器系列中的新指令支持。结果:

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

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

更新:如果我设置标志

/QxAVX

该计划已成功启动。

4

1 回答 1

9

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

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

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

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

使用gcc,检查 AVX2 就像编写一样简单

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

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

对于 Visual Studio / msvc,有一些内在函数,例如__cpuid__cpuidex,您可以使用它们来检索相同的信息,这里是一个完整且有效的示例的链接。

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

于 2014-09-14T12:17:10.977 回答