2014-09-13 50 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

相關問題