MIPS语言,以避免管道停滞



关于patternsson的书中提到的MIPS汇编语言,我有一个问题是在指令之间插入NOP以避免管道停滞。

考虑以下代码

lw   $s5, -16($s5)
sw   $s5, -16($s5)
add  $s5, $s5, $s5

我们看到lwsw之间存在$5的RAW危害。在swadd之间也存在$5的WAW危险。因此,我们必须插入两个NOP以避免停滞。换句话说,管线图是

lw      IF     ID     EX     MEM     WB
sw             IF     ID     ---     EX     MEM     WB
add                   IF     ID      EX     MEM     --     WB

当要执行sw时,必须等待lw将数据放入寄存器。因此,存在一个泡沫。此外,当add想要写入最终结果时,它必须等待前一条指令(sw)的完成。这是另一个泡沫。

所以修改后的代码是

lw
NOP
sw
NOP
add

但是解决方案提出了以下代码

lw
NOP
NOP
sw
add

哪一个是正确的?我想是我的!

假设一个相当标准的管道,WAW危害不存在,它在程序代码中可能看起来有点危险(从某种意义上说,对同一寄存器有多个写入),但ADD没有在LW之前(或期间)完成的机制(这意味着它在输入可用之前计算结果)。SW不写入寄存器,所以这并不重要,但ADD也不能在此之前完成。事实上,在标准管道中根本不存在WAW危险,因为说明只是按顺序写回。

你的RAW危害解决方案假设有WB->EX转发,根据他们的解决方案判断,没有。如果没有转发器,最快可以使用结果的是读取指令的ID与写入指令的WB一致。


为什么(WB)和(EX)不在一个周期内执行?

因为它不起作用。它在a问题中也不起作用,所以我不确定那里发生了什么。这个问题的前提是没有转发到EX,所以和以前一样,在生成值后,最快可以使用的值是将读取指令的ID与写入指令的WB对齐。EX只是从ID/EX流水线寄存器中读取其输入。

此外,对于(a),我没有看到从I1到I3的6美元有任何战争。你呢??

不,因为I1和I3都没有修改$6,所以不可能有任何危险。RAR不是危险因素。

最新更新