加载指令后流水线停止,但在添加指令后停止

时间:2016-05-23 16:54:45

标签: cpu-architecture

我正在做一些关于管道的问题。这个我需要帮助。

  

为什么在加载指令之后会出现管道停顿而不是之后   添加指令?

我知道管道中未使用的插槽称为管道停顿。我的猜测是它可以是加载指令后的管道停顿,因为我们需要等待可能更新的寄存器。但是我无法想出一个为什么add指令不能创建管道停顿的答案。也许是因为在这个阶段我们已经从寄存器中读到了?

1 个答案:

答案 0 :(得分:3)

管道停顿用于解决通常由数据依赖性引起的危险。添加实际上可以产生一个管道停顿,但我们首先考虑一个不存在的例子。

SUB r2, r3
ADD r1, r2

即使add指令使用减法的结果,也没有停顿。这是因为EX阶段可以访问前一个EX阶段的数据。

现在让我们考虑一个例子,其中添加可以产生停顿。

LOAD r2, RAM[a]
ADD r1, r2

这里,MEM阶段从加载指令产生的数据需要作为ADD指令的EX阶段的输入。 EX阶段只能访问前一个EX阶段的数据,因此由于写入后读取危险而导致管道停滞。这个图表说明了这个

通过在管道中引入气泡(如NOP)解决了这一问题,该气泡解决了数据依赖性,无需及时向后传播数据(这是不可能的)。

enter image description here

通过阅读hazardsbubblesforwarding

,您可以更详细地了解详情。