The Intel Architecture's Developer's Manual(Vol3A,第8-26节)说:
奔腾处理器和更新的处理器系列使用 分支预测技术通过预取来提高性能 分支指令之前的分支指令的目的地 执行。 因此,指令执行不是确定性的 执行分支指令时序列化。
这是什么意思?
这听起来非常非常糟糕。这听起来像CPUID打破分支预测(或反之亦然)的序列化指令,但这似乎不太可能。任何ASM人员都可以帮助我理解“非确定性”在这种情况下的含义。
*为清晰起见而编辑
答案 0 :(得分:3)
措辞非常令人困惑,但我相信它的实际含义很简单:"分支机构不必(必然)序列化执行"。我们今天认为这是理所当然的,但并非总是如此。
答案 1 :(得分:2)
我怀疑你误解了这个陈述,但我不知道究竟是怎么回事。您在序列化指令和分支预测之间看到了什么联系?当它说“指令执行没有确定性地序列化”时,意味着指令的预取和解码将基于分支预测逻辑确定,因此每次都不会以相同的方式工作。但这一切的重点是让事情变得更快 - 如果分支预测是好的,大多数时候正确的下一条指令将被提取,解码并准备就绪。
答案 2 :(得分:1)
错误预测的分支是序列化指令,正确预测的分支不是。
因为在执行之前你不知道分支是否被正确预测,所以你不能事先知道它是否会序列化指令流。行为是非确定性的,因为它取决于分支预测。
你可能在条件分支之前和之后构造一个具有内存访问的角落案例,其中代码的行为取决于分支是否被正确预测。 (即分支机构是否正在序列化。)
答案 3 :(得分:1)
现代超标量处理器通常使指令执行看起来完全是确定性的,并且从CPU外部的某些角度来看是有序的。在内部,它提前获取指令,推测性地执行指令,并以最有效的顺序执行它们。但是任何不应该执行的(例如错误预测的分支)都不会被提交,并且内存访问通常在离开CPU之前被放回正确的顺序。 CPU管道的尾端称为“重新排序缓冲区”,因为它的工作是跟踪完成指令并仅按程序顺序永久提交其结果。这对于正确的程序行为很重要,特别是在分支错误预测和异常等方面;如果发生异常(例如,除以零),则后续指令可能已被解码并执行,并且必须从ROB中清除这些指令并在将异常移交给OS之前正确地重置程序计数器。
关于内存排序,程序排序的错觉有一些例外,其中读取可以任意重新排序,并且在读取和写入之间可能存在一些(可能是推测性的)重新排序,但是在谈话时你只关心它到内存映射的I / O硬件。有一些指令可以确保特定的顺序,并且CPU对访问未缓存的内存的顺序非常小心,因为这被认为是指I / O.