Intel JCC勘误缓解所用指令前缀的效果及相关问题咨询
为何Intel推荐使用3E前缀方案而非多字节NOP?
JCC Erratum的核心问题是跨32字节边界的条件跳转、宏融合指令无法命中L1指令缓存,需要调整指令位置避免跨边界。
用冗余3E前缀的优势远高于多字节NOP:冗余前缀是附加在有效指令前端的,本身不产生新的执行指令,不会额外占用执行单元资源,也不会打乱原有指令流的排布逻辑。而多字节NOP本质是需要被解码执行的空指令,会占用解码槽,还会把后续指令整体后移,可能导致更多跳转指令触碰边界,需要额外插入更多调整字节。另外受JCC影响的Intel CPU对3E前缀的解码开销极低,比插入NOP带来的性能损耗小得多。
该方案对不受JCC Erratum影响的CPU会产生什么影响?
不受影响的CPU包括AMD全系列处理器、Intel Ice Lake及之后的新架构处理器,这类CPU本身已经在硬件层面修复了该bug,冗余的3E前缀会在解码阶段被直接丢弃,不会进入执行流水线,绝大多数实际场景下完全不会产生性能损耗。只有极端到几乎不存在的场景(比如单条指令的前缀长度刚好顶到CPU支持的15字节上限)才可能多消耗1个解码周期,基本可以忽略。
开启/QIntel-jcc-erratum编译的程序在AMD平台运行速度更快的可能原因有哪些?
- 该选项的核心作用是强制所有条件跳转指令不跨32字节边界,刚好契合了AMD处理器对指令对齐的高敏感特性,大幅减少了指令不对齐带来的解码停顿。
- 冗余3E前缀在AMD CPU上的处理成本极低,远低于插入NOP带来的解码、执行开销,相当于只获得了指令对齐的收益,没有付出额外代价。
- 对齐后的跳转指令能更好适配AMD的分支预测器缓存,在分支密集的场景下可以间接提升分支预测准确率,减少预测失败带来的流水线清空开销。
内容的提问来源于stack exchange,提问作者Alex Guteniev
相关产品推荐
相关产品推荐

