首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管道在加载指令之后停止,而不是在添加指令之后停止。

管道在加载指令之后停止,而不是在添加指令之后停止。
EN

Stack Overflow用户
提问于 2016-05-23 16:54:44
回答 1查看 1.6K关注 0票数 0

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

为什么在加载指令之后会出现管道失速,而在添加指令之后就不会出现管道失速?

我知道,管道中的一个未使用的槽称为管道失速。我的猜测是,在加载指令之后,它可能是一个管道阻塞,因为我们需要等待一个可能被更新的寄存器。但我不能给出一个答案,为什么一个添加指令不能创建一个管道失速。也许是因为在这个阶段,我们已经从登记册上读到了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-23 19:33:20

管道失速用于解决通常由数据依赖引起的危险。add实际上可以产生管道失速,但是让我们首先考虑一下它没有的例子。

代码语言:javascript
复制
SUB r2, r3
ADD r1, r2

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

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

代码语言:javascript
复制
LOAD r2, RAM[a]
ADD r1, r2

这里,从load指令产生的MEM阶段产生的数据需要作为ADD指令的EX阶段的输入。EX阶段只能访问来自前一个EX阶段的数据,因此,由于写入后出现读取危险,管道将处于停滞状态。这个图说明了这一点。

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

您可以通过阅读公害泡泡转发来更详细地了解这方面的内容。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37396533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档