我在问一些关于管道的问题。这个我需要帮助。
为什么在加载指令之后会出现管道失速,而在添加指令之后就不会出现管道失速?
我知道,管道中的一个未使用的槽称为管道失速。我的猜测是,在加载指令之后,它可能是一个管道阻塞,因为我们需要等待一个可能被更新的寄存器。但我不能给出一个答案,为什么一个添加指令不能创建一个管道失速。也许是因为在这个阶段,我们已经从登记册上读到了?
发布于 2016-05-23 19:33:20
管道失速用于解决通常由数据依赖引起的危险。add实际上可以产生管道失速,但是让我们首先考虑一下它没有的例子。
SUB r2, r3
ADD r1, r2即使add指令使用减法的结果,也没有停顿。这是因为EX阶段可以访问来自前一个EX阶段的数据。
现在,让我们考虑一个例子,其中添加可以产生一个失速。
LOAD r2, RAM[a]
ADD r1, r2这里,从load指令产生的MEM阶段产生的数据需要作为ADD指令的EX阶段的输入。EX阶段只能访问来自前一个EX阶段的数据,因此,由于写入后出现读取危险,管道将处于停滞状态。这个图说明了这一点。

这是通过在管道中引入一个气泡来解决的(比如NOP),它解决了数据依赖,而不需要向后传播数据(这是不可能的)。

https://stackoverflow.com/questions/37396533
复制相似问题