关于MIPS汇编语言,这是在模式森的书,我有一个问题,插入NOP之间的指令,以避免管道档。
考虑以下代码
lw $s5, -16($s5)
sw $s5, -16($s5)
add $s5, $s5, $s5
我们看到,$s5在lw
和sw
之间存在着原始的危险。$s5在sw
和add
之间也存在WAW危险。因此,我们必须插入两个NOPs,以避免摊位。换句话说,管道图是
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
哪一个是对的?我想是我的!
发布于 2015-11-26 04:54:57
假设一个相当标准的管道,WAW危险不存在,它在程序代码中可能看起来有点危险(在同一寄存器上有多个写操作),但没有任何机制可以在(或在) LW之前(或在)LW期间完成添加(这意味着它在输入可用之前计算结果)。SW没有写到寄存器,所以这并不重要,但是添加也不能在它之前完成。实际上,标准管道中根本不存在WAW危险,因为指令只是按顺序写回。
您对于原始危险的解决方案假定存在WB->EX转发,根据它们的解决方案判断没有。没有转发器,您最快可以使用的结果是读取指令的ID与写指令的WB成直线。
为什么(WB)和(EX)不在一个周期内执行?
因为它不管用。它也不起作用,a
,所以我不知道那里发生了什么。这个问题的前提是没有转发给EX,所以和以前一样,产生后你能尽快使用一个值是当你把阅读指令的ID和写指令的WB连起来的时候。EX只是从ID/EX管道寄存器读取它的输入。
另外,对于(a)项,我没有看到从I1到I3的6美元的战争。是吗??
不,因为I1和I3都不修改$6,所以不可能有任何危险。RAR不是一种危险。
https://stackoverflow.com/questions/33935604
复制