使用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的标准管道是可能的,但有些人说,无论何时插入气泡,整个管道都会停滞不前。怎么能搞清楚?
答案 0 :(得分:3)
在上一个问题中你使用的是Patterson的书,所以让我借一个图表来说:
这里的重要部分是危险检测单元,它会引起气泡。如果您已阅读随附文本,您知道它执行该操作的方法是
这意味着您的管道图不会发生这种情况。每个周期都不会有新指令进入。还要考虑如果你有不同的代码,你可以安排硬件危险发生,正如杰斯特所描述的那样。所以这显然很糟糕,解决方案是停止IF。
这是会发生的事情:
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 -- -- --
等