我具有以下配置:Intel Core i7-4702MQ CPU(具有Haswell架构),Windows 8,Intel C++ Compiller XE 13.0。
我想通过avx2优化运行我的程序,并放置编译标志:



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



我运行在页面How to detect new instruction support in the 4th generation Intel Core processor family上给出的avx2 cpu支持测试。
结果:



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

更新:如果我设置了标志

/QxAVX

该程序已成功启动。

最佳答案

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

带有CPUid扩展的

  • 程序集
  • 编译器提供的内置函数

  • 编写检测支持哪些寄存器集的程序集是一项繁琐,冗长且可能容易出错的任务,更不用说该程序集不能跨不同的OS,不同的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

    关于c - 如何验证操作系统支持avx2指令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25820290/

    10-11 20:49
    查看更多