sty*_*ylo 3 assembly pipeline mips cpu-architecture
我知道有五个阶段 -> IF、ID、EX、MEM、WB。并且时钟周期由最长的阶段决定。我不明白的是,当有一条指令未使用所有阶段时会发生什么,例如添加不需要 MEM 阶段的指令,并假设时钟周期为 200ps,所以它意味着对于使用所有阶段的指令,执行需要 1000ps。执行不使用 MEM stege 的指令是否需要同样的 1000ps(这意味着浪费了 200ps)?谢谢!
如果一条指令不需要 MEM 阶段,它不会驱动该阶段中的任何与内存相关的信号,但它仍然需要经过它。
这是浪费时间,但仍然比非流水线处理有所改进。但 IF/ID 阶段在我们考虑的管道中只有 1 条指令宽,因此它只会消耗延迟(用于早期转发),而不消耗吞吐量。但旁路转发解决了这个问题,数据能够在到达 WB 之前转发到后续指令。
使经典 MIPS 5 级机器按需跳过 MEM 的一个想法是添加一条从 EX 到 WB 的数据路径并添加一些逻辑。
如果 R 类型指令出现在加载1之后,则会出现冲突:
IF ID EX MEM WB
IF ID EX WB <-- Conflict: two instructions in WB
Run Code Online (Sandbox Code Playgroud)
CPU 可以将 EX 的输出发送到 MEM 和 WB,此外,MEM 级会在需要该级时屏蔽从 EX 到 WB 的数据路径,并在不需要时屏蔽 MEM - WB 数据路径。
这样,当 MEM 中已经有一条指令时,EX 中的下一条指令将在下一个周期中进入 MEM(而不是 WB):
IF ID EX MEM <-- Here EX-WB is masked (since MEM is used) and MEM-WB is allowed
IF ID EX <-- Can go to both MEM and WB but EX-WB is masked off
IF ID EX MEM WB <-- So this instruction's next stage is WB (as usual)
IF ID EX MEM <-- This goes to MEM instead, so the pipe keeps flowing
Run Code Online (Sandbox Code Playgroud)
如果上一条指令不需要 MEM,则可以跳过一个阶段:
IF ID EX <-- Here EX-WB is allowed (assume no prev instructions) and MEM-WB is not since (MEM was not used)
IF ID
IF ID EX WB <-- Instruction skips MEM stage since EX-WB was allowed
IF ID EX <-- Next instruction, again, EX-WB is allowed since MEM was not used
IF ID EX WB <-- Done
IF ID EX WB <-- Stage MEM skipped
Run Code Online (Sandbox Code Playgroud)
脚注 1:存储不会写入任何寄存器(程序计数器更新除外),因此如果您不需要更新任何内容以进行中断处理或释放任何资源,则可以跳过 WB。在具有存储缓冲区的 CPU 中,其条目通常会在提交到 L1d 缓存后取消分配,而 L1d 缓存不依赖于管道阶段之一。但加载会写入寄存器,因此无法跳过 WB 并且会产生回写冲突。
附录
值得注意的是,如果第一个示例中的 WB 堆栈链接发生冲突,最好将整个流水线停止 1 个周期,否则冲突将永远不会解决,并且所有后续指令都将通过 MEM 阶段,无论它们的指令如何类型。
没有摊位:
mem = Useless MEM stage but necessary to avoid a WB confict
MEM = Instruction uses the MEM stage
IF ID EX MEM WB
IF ID EX mem WB
IF ID EX mem Wb
Run Code Online (Sandbox Code Playgroud)
如果我们引入一个周期的停顿,我们就可以解决冲突:
Lowercase names means stalled cycles
IF ID EX MEM WB
IF ID EX ex WB
IF ID id EX WB
IF if ID EX WB
IF ID EX WB
IF ID EX WB
Run Code Online (Sandbox Code Playgroud)
请注意,从吞吐量的角度来看,这种优化并没有真正带来任何有用的东西。
管道稳定到较短的长度,但如果将此图与强制使用 MEM 的图进行比较,您将在同一周期中获得所有 WB 阶段!
如果 A 依赖于 B,则 A 需要等待 B 到达其 WB 阶段(如果管道中有转发,则为 EX),并且由于无论是否进行此优化,WB(或 EX)阶段的位置都是相同的,软件无法直接观察到它(即它没有任何好处)。
然而,较短的管道消耗的能量较少,并且刷新后重新填充的速度更快,但要真正利用跳过阶段的能力,需要一个超标量 CPU(具有多个执行单元,以便 EX 和 MEM 可以重叠)。