我对这一点毫无头绪。我在计算机体系结构课程中,我们得到以下汇编代码:
ADDI $S4, $zero, 3
loop: LW $S1, 0($S5)
ADD $S6, $S1, $S6
SW $S6, 0($S5)
ADDI $S5, $S5, 4
ADDI $S4, $S4, -1
BNZ $S4, loop
我们应该使用停顿来描述代码的流水线执行以说明危险,然后绘制它实现转发的图表。该图是一个图表(列为1 2 3 4 ....我认为是循环;行被标记为指令,所以我假设给出了代码的每一行)。
所以我从流水线中得到的是它允许你一次执行多个指令。但是,如果在先前的指令写入该寄存器之前调用寄存器,则必须停止。这遵循IF-> ID-> EX-> MEM-> WB,其中在ID中读取寄存器,并且将其写入WB中。所以我看到的是,每个循环,一个指令移动到该过程的下一步,同时执行下一条指令。对我来说,这听起来像代码必须保持停顿,直到第一条指令完成写入寄存器,然后指令集可以继续。我不知道我是否接近正确的说法,也不知道如何填写图表来显示信息......
话虽如此,看着代码,我认为第4行应该有一个档位(SW $ S6,0($ 55)),因为$ S6仍然会在舞台上...... EX ?,意味着它尚未被写入,并且必须在该阶段停止一次,一次用于MEM,另一次用于WB。
任何有关我应该去的地方的帮助都将非常感激。
由于
答案 0 :(得分:1)
关于你原来的问题,你是对的,在第一个lw和add之间没有非停滞转发选项 - 但你得到你需要添加MEM然后转发;在这个添加和下面的sw之间你得到EX的结果,然后可以转发1档。等
关于评论中的其他问题,循环执行主要在lw阶段停止,因为加载的字仅在WB之后可用;或在MEM之后转发。循环加载/存储4个值;所以不要循环,重命名寄存器并用几个连续的lw启动代码,比如$ t0 - $ tt2。一旦结果被写回或可以转发,添加它,并尽快将其转换。所以,是的,您的代码看起来会更长,但执行速度更快。
顺便说一下,你似乎在使用Patterson / Hennessy。这本书有很好的图解说明这一点。也许看看。