我正在做一些关于管道的问题。这个我需要帮助。
为什么在加载指令之后会出现管道停顿而不是之后 添加指令?
我知道管道中未使用的插槽称为管道停顿。我的猜测是它可以是加载指令后的管道停顿,因为我们需要等待可能更新的寄存器。但是我无法想出一个为什么add指令不能创建管道停顿的答案。也许是因为在这个阶段我们已经从寄存器中读到了?
答案 0 :(得分:3)
管道停顿用于解决通常由数据依赖性引起的危险。添加实际上可以产生一个管道停顿,但我们首先考虑一个不存在的例子。
SUB r2, r3
ADD r1, r2
即使add指令使用减法的结果,也没有停顿。这是因为EX阶段可以访问前一个EX阶段的数据。
现在让我们考虑一个例子,其中添加可以产生停顿。
LOAD r2, RAM[a]
ADD r1, r2
这里,MEM阶段从加载指令产生的数据需要作为ADD指令的EX阶段的输入。 EX阶段只能访问前一个EX阶段的数据,因此由于写入后读取危险而导致管道停滞。这个图表说明了这个
通过在管道中引入气泡(如NOP)解决了这一问题,该气泡解决了数据依赖性,无需及时向后传播数据(这是不可能的)。
通过阅读hazards,bubbles和forwarding
,您可以更详细地了解详情。