我可以理解"预测未采取"是如何工作的。它只是继续获取PC + 4指令。在分支解析之前,如果分支被占用,则刷新之前获取的所有指令。
但我不明白"预测采取"是如何工作的。我认为分支指令需要处于解码阶段(并且需要完成分支目标地址计算(,然后处理器才能预测它会被采用,对吧?
那么,如何在像MIPS 5级流水线这样的机器上实现"预测"呢?(分支目标地址计算和分支是否采取在ID(指令解码(阶段决定(
如果分支可以在ID阶段解析,是否意味着预测是在IF(指令提取(阶段完成的?
我很困惑,因为有人说"预测采取"或"预测未采取"被称为"静态分支预测",编译器会做所有的事情。因此,在"预测采取"的情况下,编译器会将分支目标指令插入到分支指令之后的位置。
我的想法是正确的吗?还是他的话是正确的?
MIPS 具有分支延迟槽,可以隐藏简单 5 阶段流水线的分支延迟,对于无条件分支(在 ID 中检测到,获取后的阶段(,甚至通过在 EX 的前半部分评估条件分支,及时转发到 IF 的后半部分。(MIPS I R2000做到了(。
但是,是的,完全避免获取气泡需要在解码之前预测分支的存在及其目标地址。 (包括无条件的直接分支机构(。 真正的预测者就是这样做的。 有关现代 x86 的示例,请参阅慢速 jmp 指令。
但这与经典的 5 级 RISC 相去甚远。
如果你把这样一个动态预测器放到一个没有分支延迟槽的5阶段RISC,例如一个简单的RISC-V,你可能会让它在获取当前获取的位置之前进行检查,这样你就有一个预测下一个周期要获取的内容。
您只会对条件分支使用静态始终采用的预测。(通常只有向后位移,因为这些通常是循环分支;预测前向分支不被采用在实践中效果很好,特别是当编译器/程序员相应地布置他们的代码时,所以if()
类型分支的常见情况不被采用(。 当你能检测到有一个分支时,你已经知道它是否是无条件的,在这种情况下不需要任何预测。
如果您尚未使用分支条件的 MIPS I 早期评估等技巧,则条件分支的分支延迟将为 2 个周期(IF 到 EX(。静态始终采用的预测会将其缩短到 1 个周期(IF 到 ID(。正如您所说,不是 0,因为在解码分支指令本身时仍在获取未采用的路径。
即,您可以设计 ID 阶段,以便在看到条件分支时重新获取下一个周期。 (可能是在检查前进/后退的位移之后,即只是 2 补码值的高位。
因此,您可以针对前向分支的分支和循环后向分支进行优化,因为它们相对常见。 为了做得更好,您可以使用按地址或以各种复杂方式编制索引的动态预测缓存(例如,TAGE使用最近的分支历史记录作为索引的一部分,并查看从非常简单到不太简单的预测因子的历史进展 https://danluu.com/branch-prediction/(。