Intel JCC Erratum - JCC 真的应该分开处理吗?

Intel JCC Erratum - should JCC really be treated separately?

英特尔推送微代码更新以修复名为 "Jump Conditional Code (JCC) Erratum" 的错误。由于在某些情况下禁用将代码放入ICache,更新微码导致某些操作效率低下。

已发布的文档,标题为 Mitigations for Jump Conditional Code Erratum 不仅列出了 JCC,还列出了:无条件跳转、条件跳转、macro-fused 条件跳转、调用和 return。

MSVC 开关 /QIntel-jcc-erratum 文档提到:

Under /QIntel-jcc-erratum, the compiler detects jump and macro-fused jump instructions that cross or end on a 32-byte boundary.

问题是:

宏融合跳跃必须单独提及,因为它意味着整个 cmp/jcc 或任何容易受到这种减速影响的东西,如果 cmp 触及边界而 jcc 本身没有触及边界't。因为对于这两个 x86 机器指令,uop 缓存将有一个 uop,以及非跳转指令的起始地址。

如果每个人都只说“跳跃”,您会认为只有 JCC / JMP / CALL / RET 本身必须避免触及 32B 边界。所以突出与宏观融合的互动是一件好事。


这种减速(对于所有跳转)是微代码缓解措施/针对硬件设计缺陷的解决方法的结果。 无法对触及 32 字节边界的缓存跳转进行 uop-cache 不是原始勘误表,而是治疗的副作用。

最初的勘误描述并没有说明只影响条件分支。即使只有条件分支才是真正的问题,不幸的是,也许英特尔可以找到通过微代码更新使其安全的最佳方法会影响所有跳转。

例如,在 Skylake-Xeon (SKX) 中,原始勘误在 Intel "spec update" errata list for that uarch:

中记录为 SKX102

SKX102. Processor May Behave Unpredictably on Complex Sequence of Conditions Which Involve Branches That Cross 64 Byte Boundaries

Problem: Under complex micro-architectural conditions involving branch instructions bytes that span multiple 64 byte boundaries (cross cache line), unpredictable system behavior may occur.

Implication: When this erratum occurs, the system may behave unpredictably.

Workaround: It is possible for BIOS to contain a workaround for this erratum. [i.e. a microcode update]

Status: No fix.


我怀疑“JCC erratum”这个名字很流行,因为“热”代码路径中的大多数分支都是有条件的。编译器通常可以避免将无条件采用的分支放在快速路径中。因此,很可能人们首先注意到 JCC 指令的性能问题,而这个名称即使不准确也只是停留了下来。

顺便说一句,32-byte aligned routine does not fit the uops cache 有您链接的英特尔 PDF 中相关图表的屏幕截图,以及一些其他链接和有关性能影响的详细信息。