【问题标题】:Intel: serializing instructions and branch prediction英特尔:序列化指令和分支预测
【发布时间】:2026-01-24 19:55:01
【问题描述】:

The Intel Architecture's Developer's Manual(Vol3A,第 8-26 节)说:

奔腾处理器和更新的处理器系列使用 分支预测技术,通过预取来提高性能 分支指令之前的分支指令的目的地是 执行。 因此,指令执行不是确定性的 执行分支指令时序列化。

这是什么意思?

听起来真的,真的很糟糕。听起来像 CPUID 这样的序列化指令会破坏分支预测(反之亦然),但这似乎不太可能。任何 ASM 人都可以帮助我理解“非确定性”在这种情况下的含义吗?

*为清晰起见进行了编辑

【问题讨论】:

  • 你为什么在乎?超标量和乱序执行使您的处理器更快!
  • 这取决于您所说的“中断分支预测”是什么意思;它不会产生不正确的结果(您似乎担心);它只是通过丢失投机执行的结果来潜在地减慢速度。
  • breaks = 使其分支到错误的点。我从“非确定性”这个短语中推断出这一点。

标签: assembly intel cpu-architecture branch-prediction


【解决方案1】:

它的措辞非常令人困惑,但我相信它的实际含义很简单:“分支不会(必然)序列化执行”。我们今天认为这是理所当然的,但并非总是如此。

【讨论】:

    【解决方案2】:

    我怀疑你误解了那句话,但我不知道具体是怎么回事。您认为序列化指令和分支预测之间有什么联系?当它说“指令执行不是确定性地序列化”时,它的意思是指令的预取和解码将基于分支预测逻辑来确定,因此它不会每次都以相同的方式工作。但这整件事的重点是让事情变得更快——如果分支预测良好,大多数情况下正确的下一条指令将被获取、解码并准备就绪。

    【讨论】:

    • 知道我误会了,所以发帖! :-D
    【解决方案3】:

    错误预测的分支是序列化指令,正确预测的分支不是。

    因为在执行之前你不知道分支是否被正确预测,所以你无法事先知道它是否会序列化指令流。该行为是非确定性的,因为它取决于分支预测。

    您可能会在条件分支之前和之后构造一个带有内存访问的极端情况,其中代码的行为取决于分支是否被正确预测。 (即分支是否正在序列化。)

    【讨论】:

    • 这实际上是有道理的——“指令执行不是确定性的序列化”意味着序列化可能会发生也可能不会发生,具体取决于分支预测。并不是说序列化会以随机顺序发生……这是我所关心的。
    【解决方案4】:

    现代超标量处理器通常使指令执行看起来是完全确定的,从 CPU 外部的角度来看是有序的。在内部,它提前获取指令,推测性地执行指令,并以最有效的顺序执行它们。但是任何不应该被执行的东西(例如错误预测的分支)都不会被提交,并且内存访问通常会在离开 CPU 之前恢复到正确的顺序。 CPU 流水线的末端称为“重新排序缓冲区”,因为它的工作是跟踪完成的指令,并且仅按程序顺序永久提交它们的结果。这对于正确的程序行为很重要,特别是在面对分支错误预测和异常等情况时;如果发生异常(例如除以零),后续指令可能已被解码并执行,必须从 ROB 中清除这些指令并正确重置程序计数器,然后再将异常移交给操作系统。

    关于内存排序,程序排序的错觉有一些例外,其中读取可以任意重新排序,并且在读取和写入之间可能存在一些(可能是推测性的)重新排序,但您只在谈论时关心这一点到内存映射的 I/O 硬件。有一些指令可以确保特定的顺序,并且 CPU 对访问非缓存内存的顺序非常小心,因为这被认为是 I/O。

    【讨论】: