MIPS 流水线阶段

MIPS pipeline stages

我了解到有五个阶段 -> IF、ID、EX、MEM、WB。 并且时钟周期由最长的阶段决定。 我不明白的是当指令没有使用所有阶段时会发生什么, 例如,添加不需要 MEM 阶段的指令,假设时钟周期为 200ps,这意味着对于使用所有阶段的指令,执行需要 1000ps。 执行不使用 MEM stege 的指令是否需要相同的 1000ps(这意味着浪费了 200ps)? 谢谢!

如果一条指令不需要 MEM 阶段,它不会在该阶段驱动任何与内存相关的信号,但它仍然需要经过它
浪费时间,但仍然比非流水线处理有所改进。


使经典 MIPS 5 级机器按需跳过 MEM 的一个想法是添加从 EX 到 WB 的数据路径并添加一些逻辑。
如果 R 型指令出现在 load/store 之后,则会出现冲突:

IF ID EX MEM WB
   IF ID EX  WB <-- Conflict: two instructions in WB

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

如果前面的指令不需要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

附录

值得注意的是,如果第一个示例中的 WB 堆栈发生冲突 link,最好将整个流水线停止一个周期,否则冲突将永远无法解决,所有后续指令将通过 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

如果我们引入一个周期的停顿,我们就可以解决冲突:

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

请注意,从吞吐量的角度来看,这种优化并没有真正带来任何有用的东西。
流水线稳定到较短的长度,但如果将此图与强制执行 MEM 的图进行比较,您会在相同的周期中获得所有 WB 阶段!
如果 A 依赖于 B,则 A 需要等待 B 到达其 WB 阶段(或 EX,如果管道中有转发)并且由于 WB(或 EX)阶段的位置在有或没有此优化的情况下都是相同的,软件不能直接观察到它(即它没有任何好处)。

然而,较短的管道消耗的能量较少,并且在刷新后重新填充的速度更快,但要真正利用跳过阶段的能力,需要超标量 CPU(具有多个执行单元,因此EX 和 MEM 可以重叠)。

想象一条制造汽车的装配线。有些吉普车可能会在后面安装备胎,有些则不会。为了模拟处理器,我们假设装配线正在制造不同的定制车辆,而不是暂时只制造一个功能集。因此,如果没有轮子的吉普车向前跳过,它将 运行 进入下一个地点的吉普车。那么会发生什么,它根本没有安装轮子,而是在管道中前进。

这是流水线或装配线设计的基本部分。您定义步骤,无论是否使用该步骤,所有内容都线性地通过这些步骤。要点是同时处理多个 instructions/vehicles。我的车每分钟从远端开出一辆,这是否意味着制造一辆车需要一分钟?不,我们将流程并行化,这样您就可以同时制造多辆汽车。与指令相同,重点是即使每个步骤不执行功能也要将其并行化。

设计的关键是使管道阶段足够长(如果他们的设计仍然坚持这一点,我不会像你谈论教科书而不是产品化设计那样使用 mips 这个词pipe then 这可能就是为什么 arm 刚刚走过然后并在 mips coulda/shoulda 时接管了世界)没有任何停顿或危险,但没有这样的延迟(100 个阶段总完成一条指令 100 个时钟) ,因此您可以通过管道中的延迟或时间来平衡停顿和其他问题。是时候重新填充分支上的管道了。

因此设计上绝对存在浪费,但就像您可以创建一个基准来显示管道的浪费、缓存的缓慢、由于分支预测而导致的性能损失一样。同样,如果您不喜欢管道并希望一次处理一条指令,那么针对该基准进行基准测试以发现性能缺陷要容易得多,因为即使有浪费的管道也更快。根据你的学位和 类 你正在攻读的如果计算机工程师基本上你可能会负责串行 mips 设计和并行设计并且你可以使用你自己的实现来演示具有相同指令序列的串行与并行.

除特定情况外的简短回答,一般来说,指令不能跳过一个步骤,因为那里有使用该逻辑的东西。该逻辑一次只能处理一个。有很多方法可以帮助解决这个问题。请记住,您正在阅读一本用于教育目的的教科书,以尝试理解基础知识。