为什么更长的流水线使单个延迟槽不足?

3
我在Patterson和Hennessy的《计算机组成与设计》教材中读到了以下声明:
"随着处理器管道越来越长和每个时钟周期发出多条指令,分支延迟时间变长,单个延迟槽不足以满足需求。"
我可以理解为什么“每个时钟周期发出多条指令”会使单个延迟槽不足够,但我不知道为什么“更长的管道”会导致这种情况。
此外,我不明白为什么更长的管道会导致分支延迟时间变长。即使有了更长的管道(完成一条指令的步骤),也不能保证周期会增加,所以为什么分支延迟时间会增加呢?
1个回答

5
如果在检测分支(并评估条件分支的取/不取)之前添加任何阶段,1个延迟槽将不再隐藏分支进入流水线第一阶段和分支被知道后正确的程序计数器地址之间的“延迟”。
第一个提取阶段需要来自管道后面的信息才能知道下一个要提取的内容,因为它本身不能检测分支。例如,在具有分支预测的超标量CPU中,它们需要预测要提取的指令块,而在分支解码之前单独预测分支的走向。

在MIPS I中,1个延迟槽已经足够了,因为分支条件是在EX的时钟周期的前半段中评估的,这样就有足够的时间转发到不需要提取地址的IF的第二个时钟周期。 (原始MIPS是一个经典的5级RISC:IF ID EX MEM WB。)请参见Wikipedia关于经典RISC流水线的文章以获取更多详细信息,特别是控制风险部分


这就是为什么MIPS仅限于像beq(从XOR中查找任何不匹配项)或bltz(符号位检查)这样的简单条件。它不能执行需要加法器进行进位传递的任何操作(因此两个寄存器之间的一般blt只是伪指令)。
这非常严格:更长的前端可以吸收来自需要超过半个周期才能响应命中的更大/更关联的L1指令缓存的延迟。(MIPS I解码非常简单,指令格式有意设计为机器代码位可直接连接到内部控制信号。因此,您可以将解码作为“半周期”阶段,获取1个完整周期的提取,但即使1个周期在更高的时钟速度下也仍然很低。)
提高时钟速度可能需要添加另一个提取阶段。解码必须检测数据危险并设置旁路转发;原始的MIPS通过不检测负载使用危险来保持简单,而是要求软件尊重负载延迟槽直到MIPS II。即使在1个周期ALU延迟下,超标量CPU仍具有许多可能的危险,因此需要更复杂的逻辑来匹配旧指令中的目标寄存器与年轻指令中的源。
超标量流水线甚至可能希望在指令提取中添加一些缓冲以避免气泡。多端口寄存器文件可能读取稍慢,可能需要额外的解码流水线阶段,尽管可能仍然可以在1个周期内完成。
因此,除了由于超标量执行的本质使1个分支延迟槽不足之外,更长的流水线还会增加分支延迟,如果额外的阶段位于提取和分支决议之间。例如,在分支后,额外的提取阶段和2个宽流水线可以有4条指令在运行,而不是1条。
但是,与其引入更多的分支延迟插槽来隐藏这个分支延迟,实际解决方案是分支预测。(然而,一些DSP或高性能微控制器确实有2甚至3个分支延迟插槽。)
分支延迟插槽会使异常处理变得复杂;您需要一个故障返回和一个接下来的地址,在情况下,故障在已经采取的分支的延迟槽中发生。

谢谢您的回复,但我仍然无法得到答案“更长的流水线使分支延迟变长”。 - Steven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接