为什么更长的流水线会使单个延迟槽不够用?
Why do longer pipelines make a single delay slot insufficient?
我在 Patterson & Hennessy 的 Computer Organization and Design 教科书中读到以下陈述:
As processors go to both longer pipelines and issuing multiple instructions per clock cycle, the branch delay becomes longer, and a single delay slot is insufficient.
我能理解为什么"issuing multiple instructions per clock cycle"会导致单个延迟槽不足,但我不知道为什么"longer pipelines"会导致它。
另外,我不明白为什么更长的流水线会导致分支延迟变长。即使是更长的流水线(step to finish one instruction),也不能保证周期会增加,那么为什么分支延迟会增加?
如果在 之前添加任何阶段 检测分支的阶段(并为条件分支评估 taken/not-taken ),1 个延迟槽不再隐藏之间的“延迟”进入管道第一阶段的分支和正确的 program-counter 地址 在 分支已知之后。
第一个提取阶段需要来自管道后期的信息以了解接下来要提取的内容,因为它自身检测分支。 例如,在具有分支预测的超标量 CPU 中,他们需要预测下一个要获取的指令块,分别和更早地预测分支已经解码后的走向。
1 个延迟槽仅在 MIPS I 中足够,因为分支条件在 , in time to forward to the 2nd half of IF which doesn't need a fetch address until then. (Original MIPS is a classic 5-stage RISC: IF ID EX MEM WB.) See Wikipedia's article on the classic RISC pipeline for much more details, specifically the control hazards section.
中计算
这就是为什么 MIPS 仅限于简单条件,例如 beq
(从 XOR 中查找任何不匹配)或 bltz
(符号位检查)。它不能做任何需要加法器进行进位传播的事情(因此两个寄存器之间的一般 blt
是 only a pseudo-instruction)。
这是非常严格的:较长的 front-end 可以吸收来自 larger/more 关联 L1 指令缓存的延迟,该缓存需要半个以上的周期来响应命中。 (我解码的 MIPS 非常 简单,但是,有意设计的指令格式因此 machine-code 位可以直接连接为内部控制信号。所以你也许可以解码“半周期”阶段,获取 1 个完整周期,但即使 1 个周期仍然很低,时钟速度越高,周期时间越短。)
提高时钟速度可能需要添加另一个提取阶段。解码确实必须检测数据危害并设置旁路转发;最初的 MIPS 通过不检测 load-use 危险来保持简单,相反,在 MIPS II 之前,软件必须遵守 load-delay 插槽。超标量 CPU 有更多可能的危险,即使有 1 个周期的 ALU 延迟,所以检测什么必须转发到什么需要更复杂的逻辑来匹配旧指令中的目标寄存器与较新指令中的源。
超标量流水线甚至可能需要在指令获取中进行一些缓冲以避免出现气泡。 multi-ported 寄存器文件的读取速度可能稍慢,可能需要额外的解码流水线阶段,尽管可能仍然可以在 1 个周期内完成。
因此,除了由于超标量执行的本质而使 1 个分支延迟槽不足外,如果额外的阶段位于获取和分支解析之间,则更长的流水线还会增加分支延迟。例如一个额外的获取阶段和一个 2 宽的流水线可以在分支之后有 4 条指令运行而不是 1 条。
但是与其引入更多的分支延迟slots来隐藏这个分支延迟,实际的解决方案是分支预测。 (然而,一些 DSP 或高性能微控制器确实有 2 个甚至 3 个分支延迟槽。)
Branch-delay 插槽使异常处理变得复杂;你需要一个 fault-return 和 一个 next-after-that 地址,以防故障发生在已采取分支的延迟槽中。
我在 Patterson & Hennessy 的 Computer Organization and Design 教科书中读到以下陈述:
As processors go to both longer pipelines and issuing multiple instructions per clock cycle, the branch delay becomes longer, and a single delay slot is insufficient.
我能理解为什么"issuing multiple instructions per clock cycle"会导致单个延迟槽不足,但我不知道为什么"longer pipelines"会导致它。
另外,我不明白为什么更长的流水线会导致分支延迟变长。即使是更长的流水线(step to finish one instruction),也不能保证周期会增加,那么为什么分支延迟会增加?
如果在 之前添加任何阶段 检测分支的阶段(并为条件分支评估 taken/not-taken ),1 个延迟槽不再隐藏之间的“延迟”进入管道第一阶段的分支和正确的 program-counter 地址 在 分支已知之后。
第一个提取阶段需要来自管道后期的信息以了解接下来要提取的内容,因为它自身检测分支。 例如,在具有分支预测的超标量 CPU 中,他们需要预测下一个要获取的指令块,分别和更早地预测分支已经解码后的走向。
1 个延迟槽仅在 MIPS I 中足够,因为分支条件在
这就是为什么 MIPS 仅限于简单条件,例如 beq
(从 XOR 中查找任何不匹配)或 bltz
(符号位检查)。它不能做任何需要加法器进行进位传播的事情(因此两个寄存器之间的一般 blt
是 only a pseudo-instruction)。
这是非常严格的:较长的 front-end 可以吸收来自 larger/more 关联 L1 指令缓存的延迟,该缓存需要半个以上的周期来响应命中。 (我解码的 MIPS 非常 简单,但是,有意设计的指令格式因此 machine-code 位可以直接连接为内部控制信号。所以你也许可以解码“半周期”阶段,获取 1 个完整周期,但即使 1 个周期仍然很低,时钟速度越高,周期时间越短。)
提高时钟速度可能需要添加另一个提取阶段。解码确实必须检测数据危害并设置旁路转发;最初的 MIPS 通过不检测 load-use 危险来保持简单,相反,在 MIPS II 之前,软件必须遵守 load-delay 插槽。超标量 CPU 有更多可能的危险,即使有 1 个周期的 ALU 延迟,所以检测什么必须转发到什么需要更复杂的逻辑来匹配旧指令中的目标寄存器与较新指令中的源。
超标量流水线甚至可能需要在指令获取中进行一些缓冲以避免出现气泡。 multi-ported 寄存器文件的读取速度可能稍慢,可能需要额外的解码流水线阶段,尽管可能仍然可以在 1 个周期内完成。
因此,除了由于超标量执行的本质而使 1 个分支延迟槽不足外,如果额外的阶段位于获取和分支解析之间,则更长的流水线还会增加分支延迟。例如一个额外的获取阶段和一个 2 宽的流水线可以在分支之后有 4 条指令运行而不是 1 条。
但是与其引入更多的分支延迟slots来隐藏这个分支延迟,实际的解决方案是分支预测。 (然而,一些 DSP 或高性能微控制器确实有 2 个甚至 3 个分支延迟槽。)
Branch-delay 插槽使异常处理变得复杂;你需要一个 fault-return 和 一个 next-after-that 地址,以防故障发生在已采取分支的延迟槽中。