1

我有一个由 MSVC 12 编译的 Windows x64 C++ 程序,没有 AVX 支持(编译选项中没有 /arch:AVX)。

我收到了一位客户在 Win7 上使用 Core i7 4700MQ 的崩溃报告。异常代码为 c000001d(非法指令),异常偏移量指向 sin() 函数内的“vmovd r9,xmm0”指令。我已经与该用户尝试了两种不同的构建,并且在这两种情况下它都指向相同的指令。

看起来 msvc 库版本的 sin() 内在函数具有特殊的 AVX 代码路径,即使在没有 AVX 支持的情况下编译也是如此。这段代码在没有 AVX 的旧 i3 处理器上运行良好。

那么在这个特定的 i7 上,什么会导致这个异常呢?对于具有广泛 CPU 的许多客户来说,相同的代码运行没有任何问题。

也许可以在操作系统设置/BIOS 中以某种方式禁用 AVX 并且 sin() 代码无法检查这一点?或者也许有一些操作系统更新增加了 AVX 支持,没有它,任何 AVX 代码都会触发 c000001d?

4

1 回答 1

0

如果这是动态链接库中的代码,那么代码的编译选项并不重要。dll 很可能会根据 cpuid 的返回值分派到不同的实现,以确定 avx 是否可用,如果不可用,则回退到 sse 版本。

vmovd r9,xmm0

对我来说,这看起来像是关于 corei7 的法律指令。

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

于 2014-10-10T00:24:42.810 回答