我有一个由 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?