CPU不支持程序包含的指令时,程序运行会出现什么问题?
x86 CPU不支持程序所用专用指令时的运行逻辑
分两种完全不同的情况:
- 程序未做指令集兼容适配,直接固定编译了AVX-512等CPU不支持的指令
这种情况程序会直接报错终止。CPU在指令解码阶段碰到不识别的操作码时,会直接抛出#UD(无效指令)硬件异常,操作系统捕获该异常后会终止对应进程:Linux环境下进程会收到SIGILL信号,Windows环境下会弹出非法指令相关的错误提示。比如Haswell架构最高仅支持AVX2指令集,没有AVX-512的解码和执行单元,根本不可能识别AVX-512的指令编码,自然也不存在自动转用其他指令执行的可能。 - 程序提前做了多指令集兼容设计
这种情况可以正常运行,仅损失对应指令的性能增益。绝大多数面向通用环境发布的高性能程序、计算库都会在启动阶段通过CPUID指令检测当前CPU的指令集支持情况,动态选择匹配的代码路径:检测到支持AVX-512就调用AVX-512优化的实现,不支持就自动降级到AVX2、SSE甚至通用x86指令的实现。所有的降级逻辑都是软件层面预先实现的,和CPU本身无关。
注意:CPU本身没有自动翻译/替换不支持指令的能力,所有兼容场景都是软件提前做的适配,只要程序执行流走到了CPU不支持的指令,就一定会触发异常终止。
内容的提问来源于stack exchange,提问作者Deank
相关产品推荐
相关产品推荐

