关于在pattersson的书中考虑的MIPS汇编语言,我有一个问题,即在指令之间插入NOP以避免流水线停滞。
考虑以下代码
lw $s5, -16($s5)
sw $s5, -16($s5)
add $s5, $s5, $s5
我们发现lw
和sw
之间的$ s5存在RAW危险。 sw
和add
之间的$ s5还存在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
哪一个是正确的?我想我的!
答案 0 :(得分:2)
假设一个相当标准的管道,WAW危险不存在,它可能在程序代码中看起来有点危险(从某种意义上说,对同一个寄存器有多次写入),但是没有机制ADD可以在LW之前(或期间)完成(这意味着它在输入可用之前计算结果)。 SW不会写入寄存器,因此无关紧要,但ADD也无法在其之前完成。实际上,标准管道中根本不存在WAW危险因为指令只是按顺序回写。
您对RAW危险的解决方案假设存在WB-> EX转发,根据其解决方案判断,没有。如果没有转发器,最快可以使用的结果是当读取指令的ID与写入指令的WB对齐时。
为什么(WB)和(EX)不会在一个周期内执行?
因为它不起作用。它在问题a
中也不起作用,所以我不确定那里发生了什么。这个问题的前提是没有转发到EX,所以和以前一样,最快的是你可以在生成后使用一个值,当你用读写指令的WB将读取指令的ID排成一行时。 EX只从ID / EX流水线寄存器读取其输入。
此外,对于(a),我从I1到I3没有看到任何6美元的WAR。你呢??
不,因为I1和I3都没有修改6美元,所以不可能有任何危险。 RAR不是危险因素。