我可以理解“无法预测”的工作方式。它只是在获取PC + 4指令上继续前进。在分支被解析之前,如果采用了分支,则刷新之前获取的所有指令。
但是我不知道“预测采取”是如何工作的。我认为分支指令在处理器可以预测将要采用之前就需要处于解码阶段(并且分支目标地址的计算需要完成),对吧?
那么,如何在MIPS 5级流水线之类的机器上实施“预测”? (分支目标地址的计算和是否采用分支是在ID(指令解码)阶段决定的)
如果分支可以在ID阶段解析,是否意味着在IF(指令提取)阶段进行了预测?
我很困惑,因为有人说“采用预测”或“未采用预测”被称为“静态分支预测”,编译器会做所有的事情。因此,在“采用预测”的情况下,编译器会将分支目标指令插入到分支指令之后的位置。
我的想法正确吗?还是他的话是正确的?
答案 0 :(得分:1)
MIPS具有分支延迟槽,可为简单的5级管道隐藏分支等待时间,对于无条件分支,甚至对于有条件的(如果您在ID阶段处理它们也是如此)(例如实际的MIPS I和/或斯坦福大学MIPS学术版本)显然做到了。
但是,是的,要避免获取气泡,需要在分支被解码之前预测分支的存在性及其目标地址。 (包括无条件的直接分支)。真正的预测变量可以做到这一点。有关现代x86的示例,请参见Slow jmp-instruction。
但这与经典的5级RISC差距很大。
如果将这样的预测变量放入没有分支延迟时隙的5级RISC中,例如一个简单的RISC-V,您可能实际上要先检查当前正在获取的位置,因此可以预测在 next 周期中要获取的内容。
通常,您只对有条件的分支进行静态的,始终采用的预测。(通常只向后移动,例如循环分支)。
如果您没有在ID阶段本身中评估分支条件,那么该预测会将分支等待时间从2个周期(从IF到EX)缩短到1个周期(从IF到ID)。
即您可以将ID阶段设计为在看到向后分支时重新获取,或者如果看到向后条件分支则不重新获取。
因此,您可以针对前向分支和后向分支的失败进行优化,因为它们相对常见。为了做得更好,您可以使用按地址或以各种复杂方式建立索引的动态预测缓存(例如TAGE使用最近的分支历史作为索引的一部分)。