MIPS管线阶段

时间:2018-09-15 11:07:03

标签: assembly mips pipeline

我知道有五个阶段-> IF,ID,EX,MEM,WB。 时钟周期由最长的阶段决定。 我不明白的是,如果某条指令没有使用所有阶段,会发生什么情况, 举例来说,添加不需要MEM级的指令,并假设时钟周期为200ps,因此这意味着对于使用所有级的指令,其执行时间为1000ps。 执行不使用MEM指令的指令将花费相同的1000ps的时间(这意味着浪费了200ps)吗? 谢谢!

2 个答案:

答案 0 :(得分:3)

如果一条指令不需要MEM阶段,那么该阶段将不会驱动任何与存储器相关的信号,但是它仍然需要通过该指令
浪费时间,但仍比非流水线处理要好。


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

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堆栈链接发生冲突,最好将整个管道停顿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

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

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可以重叠)

答案 1 :(得分:1)

想象一下一条装配线正在制造一辆汽车。有些吉普车恐怕不会在后面安装备用轮胎,有些则不会。为了模仿处理器,我们假设装配线正在制造不同的定制车辆,而不是仅仅制造一个功能集。因此,如果没有车轮的吉普车向前跳,它将在下一个位置碰到吉普车。所以发生了什么,它根本没有安装好轮子,而是沿着管道前进。

这是管道或装配线设计的基本部分。您定义步骤,无论是否使用该步骤,所有内容都线性地遍历这些步骤。 POINT将同时处理多个指令/车辆。我的汽车每分钟一分钟从远端推出,这是否意味着制造汽车需要一分钟?不,我们需要平行进行这一过程,以便您一次制造多辆汽车。与指令相同,关键是即使每个步骤都不执行功能,也要对其并行化。

设计的关键是使足够多的管道级足够长(如果您谈论的是教科书而不是产品化设计,那么我不会像您所说的那样使用mips一词,如果他们的设计仍然坚持该管道,那么这可能就是为什么手臂刚走过去然后在mips maya / shoulda出现时接管世界的原因),没有任何停顿或危险,但没有这样的延迟(100个阶段共完成一条指令100个时钟),所以您可以保持平衡停顿以及管道中延迟或时间的其他问题。是时候在分支上重新填充管道了。

因此,从设计上来说绝对是浪费,但是就像您可以创建一个基准来显示管道的浪费,缓存的缓慢性,由于分支预测而导致的性能损失一样。同样,如果您不喜欢管道并想一次处理一条指令,那么对于该基准而言,建立基准以查找性能缺陷要容易得多,因为在这种情况下,即使有浪费的管道也较快。如果您基本上是计算机工程师,那么根据您的学位和学习的课程而定,您可能需要承担串行mips设计和并行设计的任务,并且可以使用自己的实现方式以相同的指令序列来演示串行与并行。

除了特定情况外的简短答案,一般而言,该指令无法跳过某个步骤,因为那里存在使用该逻辑的内容。该逻辑一次只能处理一个。有并且已经有很多方法可以帮助解决这个问题。记住,您正在阅读一本教科书,目的是为了理解基础。