Assembly 用流水线理解MIPS组装

Assembly 用流水线理解MIPS组装,assembly,mips,pipeline,Assembly,Mips,Pipeline,对于MIPS体系结构的标准5级管道,假设某些指令相互依赖,那么管道气泡如何插入到以下汇编代码中 I1: lw $1, 0($0) I2: lw $2, 4($0) I3: add $3, $1, $2 ; I1 & I2 -> I3 I4: sw $3, 12($0) ; I3 -> I4 I5: lw $4, 8($0) I6: add $5, $1, $4 ; I1 & I5 -> I6 I7: sw $

对于MIPS体系结构的标准5级管道,假设某些指令相互依赖,那么管道气泡如何插入到以下汇编代码中

I1: lw   $1, 0($0)
I2: lw   $2, 4($0)
I3: add  $3, $1, $2      ; I1 & I2 -> I3
I4: sw   $3, 12($0)      ; I3 -> I4
I5: lw   $4, 8($0)
I6: add  $5, $1, $4      ; I1 & I5 -> I6
I7: sw   $5, 16($0)      ; I6 -> I7
首先,我们插入一个泡沫,我们

I1:  IF   ID   EX   MEM   WB 
I2:       IF   ID   EX    MEM
I3:            IF   ID    --
I4:                 IF    ID
正如您所看到的,当I3暂停时,I4可以继续解码。对不对?其次,

I1:  IF   ID   EX   MEM   WB 
I2:       IF   ID   EX    MEM   WB
I3:            IF   ID    --    EX   MEM  WB
I4:                 IF    ID    --   --   EX   MEM   WB
I5:                       IF    ID   EX   MEM  WB 
I6:                             IF   ID   --   EX    MEM   WB
I7:                                  IF   ID   --    --    EX   MEM   WB

我认为这在MIPS的标准管道中是可能的,但有人说,只要插入一个气泡,整个管道就会停止。如何计算呢?

在你之前的问题中,你使用的是Patterson的书,所以让我借用其中一个图表:

这里最重要的一点是危险检测装置,它会导致气泡。如果您已经阅读了随附的文本,您就知道它执行此操作的方法是

  • 没有发出控制信号
  • 暂停IF(保持IF/ID缓冲区固定,不推进PC)
这意味着您的管道图不能像这样发生。不会有新指令进入每个周期。同样,如果你有不同的代码,你可以安排硬件危险的发生,正如JISTER所描述的。所以这显然是不好的,如果出现这种情况,解决方案就会停滞

这就是将会发生的事情:

I1:  IF   ID   EX   MEM   WB 
I2:       IF   ID   EX    MEM   WB
I3:            IF   ID    --    --    --
I3:                 IF    ID    --    --    --
I3:                       IF    ID    EX    MEM   WB
I4:                             IF    ID    --    --    --

等等。

在一般情况下,如果只对当前指令进行冒泡,则会将阶段与后续指令重叠,因此也需要对其余的指令进行冒泡。如果出于某种原因,随后的泡沫也需要一个泡沫,那么它可能会起作用,但他们无论如何都会等待。你是如何表示的?您的意思是第五列都是
--
?但是图表有一个小问题。在第4列中,当I3处于ID阶段时,I4处于IF阶段。你忽略了。。。。如果你继续画画,你会发现这是一个奇怪的现象!我的问题是,当管道暂停时,获取和解码的下一条指令会发生什么情况。他们继续吗?@mahmood不,关键是下一条指令没有被提取和解码。同样的指令再次被解码,直到不再需要暂停。在第4列,I1(MEM),I2(EX),I3(ID),还没有暂停。对吗?因此,下一条指令I4被馈送到IF阶段。为什么不去拿?在第四栏中,没有任何stall@mahmood你可以这样看,但是它会锁定IF/ID管道寄存器,所以I3会再次出现。但我不能在这种类型的图中指出I4是“无用的获取”(获取然后丢弃)。我同意你的观点,因为我们是人类,所以我们可以思考。但CPU并没有看到暂停,所以它获取另一条指令I4。然后,我们必须开发一种机制来挤压或停止执行。