首页 文章

英特尔:序列化指令和分支预测

提问于
浏览
2

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

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

这是什么意思?

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

*编辑清晰

4 回答

  • 3

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

  • 1

    我怀疑你误解了这个说法,但我无法确切地说明如何 . 您在序列化指令和分支预测之间看到了什么联系?当它说“指令执行没有确定性地序列化”时,意味着指令的预取和解码将基于分支预测逻辑确定,因此每次都不会以相同的方式工作 . 但是这一切的重点是让事情更快 - 如果分支预测是好的,大多数时候正确的下一条指令将被提取,解码并准备好 .

  • 2

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

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

    您可以在条件分支之前和之后构造具有内存访问的边角情况,其中代码的行为取决于分支是否被正确预测 . (即分支机构是否正在序列化 . )

  • 1

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

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

相关问题