2014-10-09 75 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