使用 Intel Core i7 的 AVX 上的非法指令

Posted

技术标签:

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

【问题讨论】:

可能相关:connect.microsoft.com/VisualStudio/Feedback/Details/987093, connect.microsoft.com/VisualStudio/Feedback/Details/981479 但是 4700MQ 确实支持 AVX,对吧? @Mysticial 是的,操作系统是一个原因。该用户运行的是早于 SP1 的 Win7 版本,并且仅在 SP1 中添加了 AVX 支持。不知何故,我在想 MSVC 12 正在使代码与 Vista 兼容。但看起来最低规格是 Win7 SP1。 Mysticial 的第二个链接使用的是 Win7 SP1 并且有类似的问题。 【参考方案1】:

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

vmovd r9,xmm0

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

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

【讨论】:

以上是关于使用 Intel Core i7 的 AVX 上的非法指令的主要内容,如果未能解决你的问题,请参考以下文章

笔记本参数求鉴定 主板芯片组 Intel HM86 CPU系列 英特尔 酷睿i7 4代系列 CPU型号 Intel 酷睿i7 4700HQ

Test2

Centos 7.7 上的 Vscode 无法识别 Intel AVX 功能,关于 __mm256i 的错误

研究开源gpt-2-simple项目,跑一个简单的模型,然后生成一段对话。用的是 Intel(R) Core(TM) i7-9700,8核8线程,训练最小的模型200次跑1个小时20分钟

在 intel 内部函数 (AVX) 中使用混合指令

Intel的AVX2指令集解读