2014-10-09 28 views
1

我有一個Windows x64 C++程序,由MSVC 12編譯而沒有AVX支持(no/arch:AVX in compile options)。AVX上的非法指令與Intel Core i7

我在Win7上有一個Core i7 4700MQ客戶的崩潰報告。異常代碼是c000001d(非法指令),異常偏移指向sin()函數內的「vmovd r9,xmm0」指令。我已經與這個用戶嘗試了兩種不同的構建,並且在這兩種情況下都指向了這個相同的指令。

看起來像sin()的msvc庫版本內在特殊的AVX代碼路徑即使編譯沒有AVX支持。此代碼在沒有AVX的舊版i3處理器上運行良好。

那麼,在這個特定的i7上可能會導致這種異常?對於廣泛使用CPU的許多客戶來說,相同的代碼運行沒有任何問題。

也許AVX可能在操作系統設置/ BIOS中以某種方式被禁用,並且sin()代碼無法檢查?或者,也許有些操作系統更新增加了AVX支持,沒有任何AVX代碼觸發器c000001d?

+2

也許相關:https://connect.microsoft.com/VisualStudio/Feedback/Details/987093,https://connect.microsoft.com/VisualStudio/Feedback/Details/981479 – Mysticial 2014-10-09 17:58:43

+0

但4700MQ * *支持AVX,對嗎? – harold 2014-10-09 17:59:03

+1

@Mysticial是的,操作系統是一個原因。此用戶在SP1之前運行Win7版本,並且僅在SP1中添加了AVX支持。不知何故,我認爲MSVC 12使代碼兼容到Vista。但看起來像min spec是Win7 SP1。 – 2014-10-10 07:01:54

回答

0

如果這是動態鏈接庫中的代碼,那麼代碼的編譯選項無關緊要。該dll很可能會根據cpuid的返回值對不同的實現進行調度,以確定avx是否可用,如果不是,則返回到sse版本。

vmovd R9,XMM0

看起來像一個corei7給我一個合法的指令。

http://www.felixcloutier.com/x86/MOVD:MOVQ.html