我在Patterson&Hennessy的《计算机组织和设计》教科书中阅读了以下声明:
随着处理器同时进入较长的流水线并在每个时钟周期发出多条指令,分支延迟变得更长,并且单个延迟时隙不足。
我可以理解为什么“每个时钟周期发出多个指令”会使单个延迟槽不足,但是我不知道为什么“较长的流水线”会引起延迟。
另外,我不明白为什么更长的管道会导致分支延迟变得更长。即使使用更长的流水线(完成一条指令的步骤),也不能保证周期会增加,为什么分支延迟会增加?
如果您在检测分支的阶段之前添加任何阶段(并评估条件分支的已采用/未采用),则1个延迟槽将不再隐藏进入管道第一级的分支与正确的程序计数器之间的“等待时间” 已知分支后的地址。
第一阶段获取需要的信息,从后面的管道就知道下一步该取,因为它没有自己检测分支。 例如,在具有分支预测功能的超标量CPU中,他们需要预测分支接下来已被解码之后要分开,更早地读取哪个指令块。
1个延迟时隙仅在MIPS中就足够了,因为在正常EX阶段之前在ID阶段评估分支条件。(原始MIPS是经典的5级RISC:IF ID EX MEM WB。)有关更多详细信息,请参阅Wikipedia上的文章,以获取更多详细信息,尤其是“ 控制危害”部分。
这就是为什么MIPS仅限于简单的条件,例如beq(从XOR查找任何不匹配项)或bltz(符号位检查)。它无法执行任何需要加法器进行进位传播的操作(因此blt,两个寄存器之间的常规操作只是伪指令)。
这是非常严格的:较长的前端可以吸收来自更大/更多关联的L1指令高速缓存的等待时间,并且寄存器的获取+评估分支条件都可以在同一周期内完成,因为解码在时序上可能非常严格。
提高时钟速度甚至只是检测数据危险(与原始MIPS不同)可能都需要增加另一个阶段,或者可能将分支评估移至EX。
超标量流水线可能希望在指令获取中进行一些缓冲以避免气泡,并且多端口寄存器文件可能会稍微慢一些。
因此,除了由于超标量执行的本质而使得1个分支延迟时隙不足以外,更长的流水线也使情况变得更糟。
但是,实际的解决方案不是分支预测,而是引入更多的分支延迟时隙来隐藏此分支延迟。