使用流水线理解 MIPS 汇编
understanding MIPS assembly with pipelining
对于 MIPS 架构的标准 5 级流水线,假设一些指令相互依赖,如何将流水线气泡插入到以下汇编代码中?
I1: lw , 0([=10=])
I2: lw , 4([=10=])
I3: add , , ; I1 & I2 -> I3
I4: sw , 12([=10=]) ; I3 -> I4
I5: lw , 8([=10=])
I6: add , , ; I1 & I5 -> I6
I7: sw , 16([=10=]) ; 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 的标准流水线是可能的,但有人说每当插入一个气泡时,整个流水线就会停滞。怎么算出来的?
在你之前的问题中,你使用的是帕特森的书,所以让我借用其中一张图表:
这里重要的一点是危险检测单元,它导致了气泡。如果您阅读了随附的文本,您就会知道这样做的方法是
- NOP 输出控制信号,
- 暂停 IF(保持 IF/ID 缓冲区固定,不要推进 PC)
这意味着你的管道图不能那样发生。每个周期不会有新的指令进入。还要考虑,如果您有不同的代码,您可能已经安排了硬件危险的发生,正如 Jester 所描述的那样。所以这显然很糟糕,解决方案是拖延 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 -- -- --
等等
对于 MIPS 架构的标准 5 级流水线,假设一些指令相互依赖,如何将流水线气泡插入到以下汇编代码中?
I1: lw , 0([=10=])
I2: lw , 4([=10=])
I3: add , , ; I1 & I2 -> I3
I4: sw , 12([=10=]) ; I3 -> I4
I5: lw , 8([=10=])
I6: add , , ; I1 & I5 -> I6
I7: sw , 16([=10=]) ; 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 的标准流水线是可能的,但有人说每当插入一个气泡时,整个流水线就会停滞。怎么算出来的?
在你之前的问题中,你使用的是帕特森的书,所以让我借用其中一张图表:
这里重要的一点是危险检测单元,它导致了气泡。如果您阅读了随附的文本,您就会知道这样做的方法是
- NOP 输出控制信号,
- 暂停 IF(保持 IF/ID 缓冲区固定,不要推进 PC)
这意味着你的管道图不能那样发生。每个周期不会有新的指令进入。还要考虑,如果您有不同的代码,您可能已经安排了硬件危险的发生,正如 Jester 所描述的那样。所以这显然很糟糕,解决方案是拖延 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 -- -- --
等等