【发布时间】:2014-10-09 08:35:11
【问题描述】:
我有一个 Windows x64 C++ 程序,它由 MSVC 12 编译,不支持 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?
【问题讨论】:
-
但是 4700MQ 确实支持 AVX,对吧?
-
@Mysticial 是的,操作系统是一个原因。该用户运行的是早于 SP1 的 Win7 版本,并且仅在 SP1 中添加了 AVX 支持。不知何故,我在想 MSVC 12 正在使代码与 Vista 兼容。但看起来最低规格是 Win7 SP1。
-
Mysticial 的第二个链接使用的是 Win7 SP1 并且有类似的问题。