Mips 在哪个管道阶段做出分支决策?

Mips 在哪个管道阶段做出分支决策?,mips,cpu-architecture,Mips,Cpu Architecture,在哪个RISC管道阶段做出分支决策?是否处于“解码”或“执行”或其他阶段?假设管道有5个阶段——“IF”、“ID”、“EX”、“MEM”和“WB”。一般来说,在经典的5阶段RISC中,有几种方法可以实现这一点。对于无条件直接(非注册)分支,显然您可以在ID中检测它们,并让目标PC为下一个IF周期做好准备(有1个分支延迟周期,即如果您不以某种方式隐藏该延迟(例如,或分支预测),则浪费1个IF周期) 一些玩具管道做最简单的事情,并在EX中的ALU中进行评估,转发到PC+4和PC+4+rel_偏移量之

在哪个RISC管道阶段做出分支决策?是否处于“解码”或“执行”或其他阶段?假设管道有5个阶段——“IF”、“ID”、“EX”、“MEM”和“WB”。

一般来说,在经典的5阶段RISC中,有几种方法可以实现这一点。对于无条件直接(非注册)分支,显然您可以在ID中检测它们,并让目标PC为下一个IF周期做好准备(有1个分支延迟周期,即如果您不以某种方式隐藏该延迟(例如,或分支预测),则浪费1个IF周期)

一些玩具管道做最简单的事情,并在EX中的ALU中进行评估,转发到PC+4和PC+4+rel_偏移量之间的muxer,最终以3个周期的分支延迟转发到IF。(EX结束至IF开始)

实际商业MIPS I(R2000)在EX的前半个周期中评估了分支条件,在后半个周期中转发给只需要地址的IF。请参阅,这给出了1个周期的分支延迟,短到足以被1个分支延迟槽完全隐藏,即使是有条件的或间接的
jr$reg
分支

这种半周期速度就是MIPS分支条件简单的原因,只检查整个寄存器是否为非零,或者检查MSB(符号位)是否为非零。带有标志/状态寄存器的简单RISC(如PowerPC或ARM)可以使用类似的策略快速检查标志状态

(请注意,RISC-V允许一整套分支条件;如RISC-V的设计原理所述,在现代CMOS设计中检查整个寄存器的所有零显然不比使用好的比较器比较两个寄存器的相等或甚至>或<短多少门延迟,可能比使用纹波进位进行减法更聪明。 RISC-V假设分支预测将隐藏分支延迟。)


此答案的早期版本错误地声称MIPS I在ID本身中评估了分支条件。中的玩具管道会这样做,但这将要求输入比平常更早准备好。它引入了在等待先前ALU的EX结果时指令暂停的问题指令,如普通序列中的
slt$at,$t1,$t2
/
bnez$at,target
,即伪指令的扩展,如
blt$t1,$t2

Wikipedia经典的RISC(5阶段管道)文章充其量只是误导,但已经修复。它现在说“分支条件是在之后的周期中计算的(在读取寄存器文件之后)”-我认为这是一个错误修复,而不仅仅是澄清:这都在ID部分中描述,这意味着它发生在那里,没有明确的相反措辞。此外,仍然存在的说法是“一些体系结构在执行阶段使用算术逻辑单元(ALU),而以稍微降低指令吞吐量为代价。”如果不在前面讨论对它们进行评估,那就没有意义了,因为在此期间,在标量顺序管道中没有其他任何东西可以使用ALU


其他来源(如这些幻灯片:)说,“分支结果和分支目标地址在前一阶段(第三阶段)结束时准备好了”,用于经典的MIPS
beq
指令。这不是商业R2000的工作方式,但可能是从教科书或课程材料中描述了一个简单的MIPS实现

很多关于MIPS的讨论实际上都是关于假设的MIPS,比如通常的5级RISC管道,而不是真正的MIPS R2000,或者R2000所基于的经典斯坦福MIPS CPU(但它确实是)。因此很难知道关于“MIPS”的内容是否适用于R2000(
gcc-march=mips1
)或者如果是简化的MIPS教学版本

一些“MIPS”实现甚至不是相同的ISA,例如没有分支延迟槽(这会使异常处理变得非常复杂)


这本来根本不是一个MIPS问题,只是一个普通的经典问题 5级RISC。早期有多个RISC ISA,其中许多最初是围绕5级管道()设计的。我对其内部结构了解不多:

不同的体系结构可以做出不同的选择,例如,在等待分支结果从产生分支结果的任何阶段准备就绪时,如果需要,暂停或使用分支预测+推测性提取/解码


即使使用诸如forward not Take/backward Take之类的静态预测,也可以执行推测。如果仍然正常,则可以在错误推测到达写回或MEM之前捕获错误推测。您不希望将任何推测存储写入缓存,但在分支到达EX时,您肯定可以捕获它。所有指令ich对分支的控制依赖性较年轻,因此处于早期管道阶段(如果存在;如果可能在I-cache中丢失)。

通常有几种方法在经典的5阶段RISC中实现这一点。对于无条件直接(非注册)分支,显然,您可以在ID中检测它们,并让目标PC为下一个IF周期做好准备(如果您不以某种方式隐藏该延迟,例如分支预测,则为1个分支延迟周期,即1个浪费的IF周期)

一些玩具管道做最简单的事情,并在EX中的ALU中进行评估,转发到PC+4和PC+4+rel_偏移量之间的muxer,最终以3个周期的分支延迟发送到IF。(EX结束到IF开始)

实际商业MIPS I(R2000)在EX的前半个周期中评估的分支条件,转发到仅在后半个周期中需要地址的IF。请参阅,这给出了1个周期的分支延迟,短到足以被1个分支延迟槽完全隐藏,即使是有条件的或间接的
jr$reg
分支

这半个周期的速度就是为什么MIPS分支条件很简单,只检查整个re