【问题标题】:Illegal instruction on AVX with Intel Core i7使用 Intel Core i7 的 AVX 上的非法指令
【发布时间】: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?

【问题讨论】:

标签: c++ 64-bit avx msvc12


【解决方案1】:

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

vmovd r9,xmm0

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

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

【讨论】:

    猜你喜欢
    • 2019-11-20
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多