当前位置: 首页 > 知识库问答 >
问题:

使用流水线理解MIPS程序集

严曜文
2023-03-14

对于MIPS架构的标准5级管道,并假设一些指令相互依赖,如何将管道气泡插入到以下汇编代码中?

I1: lw   $1, 0($0)
I2: lw   $2, 4($0)
I3: add  $3, $1, $2      ; I1 & I2 -> I3
I4: sw   $3, 12($0)      ; I3 -> I4
I5: lw   $4, 8($0)
I6: add  $5, $1, $4      ; I1 & I5 -> I6
I7: sw   $5, 16($0)      ; I6 -> I7

首先我们插入一个气泡,我们

I1:  IF   ID   EX   MEM   WB 
I2:       IF   ID   EX    MEM
I3:            IF   ID    --
I4:                 IF    ID

如您所见,当I3暂停时,I4可以继续解码。对不对?下一个

I1:  IF   ID   EX   MEM   WB 
I2:       IF   ID   EX    MEM   WB
I3:            IF   ID    --    EX   MEM  WB
I4:                 IF    ID    --   --   EX   MEM   WB
I5:                       IF    ID   EX   MEM  WB 
I6:                             IF   ID   --   EX    MEM   WB
I7:                                  IF   ID   --    --    EX   MEM   WB

我认为这在MIPS的标准管道中是可能的,但有人说,每当插入气泡时,整个管道都会停顿。如何才能解决这个问题?

共有1个答案

柯凯旋
2023-03-14

在你之前的问题中,你使用了帕特森的书,所以让我借用其中一个图表:

这里最重要的一点是危险检测单元,它导致了气泡。如果您阅读了随附的文本,您就会知道它执行此操作的方法是

  • 不输出控制信号,
  • 暂停IF(保持IF/ID缓冲区固定,不推进PC)

这意味着您的管道图不能像这样发生。不会有新指令进入每个周期。还需要考虑的是,如果您有不同的代码,您可以安排硬件危险的发生,正如Jester所描述的那样。所以这显然很糟糕,如果出现这种情况,解决方案就会停滞。

这就是会发生的事情:

I1:  IF   ID   EX   MEM   WB 
I2:       IF   ID   EX    MEM   WB
I3:            IF   ID    --    --    --
I3:                 IF    ID    --    --    --
I3:                       IF    ID    EX    MEM   WB
I4:                             IF    ID    --    --    --

 类似资料:
  • 问题内容: 我正在使用rub redis宝石。想知道我是否例如: 这样的执行顺序得到保证吗? 问题答案: 当然可以保证顺序,否则流水线将毫无用处。您可以随时查看代码。例如,此测试明确假定命令是按顺序执行的:https : //github.com/redis/redis- rb/blob/master/test/pipelining_commands_test.rb#L32

  • 流水线功能提供给用户统一的视图来管理应用自动发布规则,您可通过此功能来自动发布自有主机或DCE混合云环境下的应用 设置自动发布规则 进入构建项目页,选择流水线 点击右侧 development 面板中的添加一个新应用, 输入应用的名字,我们可以搜索到使用该项目的应用 点击应用的“设置发布规则”来设置自动部署规则。 根据此规则,当源码的 master 分支更新时会自动触发CI与构建,并自动发布新版本

  • 主要内容:实例,实例,实例,实例,实例,实例关键词:流水线,乘法器 硬件描述语言的一个突出优点就是指令执行的并行性。多条语句能够在相同时钟周期内并行处理多个信号数据。 但是当数据串行输入时,指令执行的并行性并不能体现出其优势。而且很多时候有些计算并不能在一个或两个时钟周期内执行完毕,如果每次输入的串行数据都需要等待上一次计算执行完毕后才能开启下一次的计算,那效率是相当低的。流水线就是解决多周期下串行数据计算效率低的问题。 流水线 流水线的基

  • 问题内容: 我必须用Java实现HTTP客户端,并且出于我的需要,似乎最有效的方法是实现HTTP管道(按照RFC2616)。 顺便说一句,我想管道POST。(我也不在谈论多路复用。我在谈论流水线,即在接收到任何HTTP请求的响应之前,通过一个连接发送许多请求) 我找不到明确声明其支持流水线的第三方库。但是我可以使用例如Apache HTTPCore 来构建这样的客户端,或者如果需要的话,可以自己构

  • 我的服务器将响应发送到客户端或将消息转发到另一个客户端取决于消息内容。我需要使用8字节的消息:大括号之间的6个加密字节,例如: 其中0x3c表示<符号作为开始帧标记,0x3e表示>符号作为结束帧标记。 所以我得到4字节的有效负载(0x02,0x03,0x04,0x05)。 我已经编写了一个FrameDecoder,但现在我不能决定是否删除大括号字节: 我想写干净的代码,大括号只是框架标记,所以它们

  • 问题内容: 我试图在尽可能短的时间内插入大量(-ish)元素,并且尝试了以下两种选择: 1)流水线: 2)批处理: 我没有注意到任何明显的时差(实际上,我希望批处理方法会更快):对于大约250K的插入,流水处理大约需要7秒,而批处理大约需要8秒。 阅读有关流水线的文档, “使用流水线使我们能够立即将两个请求都发送到网络上,从而消除了大部分延迟。此外,它还有助于减少数据包碎片:单独发送20个请求(等