2

我对这个有点不知所措。我正在上计算机体系结构课程,我们得到以下汇编代码:

      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。

任何关于我应该去哪里的帮助将不胜感激。

谢谢

4

1 回答 1

1

至于你原来的问题,你是对的,在第一个 lw 和 add 之间没有非停滞转发选项 - 但是你得到了你在 MEM 中添加所需的东西,然后可以转发;在该添加和以下 sw 之间,您会在 EX 中获得结果,然后可以将其转发 1 个档位。等等。 

至于您在评论中的其他问题,循环执行主要在 lw 阶段停止,因为加载的字仅在 WB 之后可用;或在 MEM 之后转发。循环加载/存储 4 个值;所以不要循环,而是重命名寄存器并用几个连续的 lw 开始你的代码,比如 $t0 - $tt2。一旦结果被写回,或者可以被转发,添加它,并尽快切换它。所以是的,你的代码看起来会更长,但执行得更快。 

顺便说一句,您似乎正在使用 Patterson/Hennessy。那本书中有很好的图表说明了这一点。也许看看。 

于 2013-10-29T00:19:08.327 回答