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

避免管道暂停的MIPS语言

琴宾鸿
2023-03-14

关于pattersson书中提到的MIPS汇编语言,我有一个问题,就是在指令之间插入NOP以避免管道暂停。

考虑以下代码

lw   $s5, -16($s5)
sw   $s5, -16($s5)
add  $s5, $s5, $s5

我们看到在lwsw之间存在$s5的RAW危险。在swadd之间还有$s5的WAW危险。所以我们必须插入两个NOP以避免停顿。换句话说,流水线图是

lw      IF     ID     EX     MEM     WB
sw             IF     ID     ---     EX     MEM     WB
add                   IF     ID      EX     MEM     --     WB

当要执行sw时,必须等待lw将数据放入寄存器。因此,存在一个泡沫。此外,当添加想要写入最终结果时,它必须等待上一条指令的完成(sw)。这是另一个泡沫。

所以修改后的代码是

lw
NOP
sw
NOP
add

但解决方案提出以下代码

lw
NOP
NOP
sw
add

哪一个是正确的?我认为我的!

共有1个答案

岳志义
2023-03-14

假设一个相当标准的管道,WAW危险不存在,它在程序代码中可能看起来有点危险(从某种意义上说,有多次写入同一个寄存器),但是没有机制让ADD可以在LW之前(或期间)完成(这意味着它在输入可用之前计算了结果)。SW不写入寄存器,所以没关系,但ADD也不能在它之前完成。实际上,标准管道中根本不存在WAW危险,因为指令只是按顺序写回。

您对RAW危险的解决方案假设存在WB-

为什么(WB)和(EX)不在一个周期内执行?

因为它不起作用。它在问题a中也不起作用,所以我不确定那里发生了什么。问题的前提是没有转发到EX,所以和以前一样,生成值后最快可以使用它是当您将读取指令的ID与写入指令的WB对齐时。EX只是从ID/EX管道寄存器中读取其输入。

此外,对于(a),我没有看到从I1到I3的任何6美元战争。你…吗??

不,因为I1和I3都不能修改6美元,所以不可能有任何危险。RAR不是一种危险。

 类似资料:
  • 在以下MIPS指令序列中(整个程序未显示): 我想确认两条指令之间所需的暂停次数(在5阶段MIPS管道的上下文中-IF、ID/Reg、EX、MEM、WB),有无转发。 我的理解: (a)如无转发: 在这种情况下,需要2个暂停(在周期5中,可以使用寄存器的分相访问在第二条指令的ID阶段读取R1) (b) 如果有转发: 在这种情况下,不需要暂停(周期4中第二条指令的EX-stage可以从周期3中第一条

  • 我需要多少暂停才能正确执行以下指令。我对我所做的有点困惑,所以我来这里看看专家们的答案。 lw 1,0美元(2美元); 1美元,2美元,标签; 请注意,检查是否会发生分支将在解码阶段完成。但在这种情况下,beq的源寄存器为1美元,将在lw指令的写回阶段后更新。所以,我们需要将新数据从beq指令的内存级转发到解码级。 以下是数据路径图:

  • 我想确认以下时序图是否适用于MIPS 5级管道(*=暂停): 评论: 1)ADDI:ID停滞2个周期,因此之前的WB可以完成 2)SW:2个档位,因为ID无法开始,另外2个档位用于ID以完成之前的WB 3) SUB:如果直到周期#7才能启动,ID必须等到周期10,因为之前的指令 4)BNEZ:IF直到周期#10才能开始,ID有2个档位,因此之前的WB可以完成

  • 我不确定以下属性如何影响5阶段MIPS设计(IF、ID、EX、MEM、WB)的管道执行。我只需要一些清理。 只有1个内存端口 没有数据备份。 分支摊位直到*阶段结束 1个内存端口是否意味着我们在读/写mem时无法提取或写入(即lw上的mem阶段,您无法输入IF或其他mem的软件)?如果没有转发,这是否意味着一条指令要在它所依赖的前一条指令的WB阶段之后或之后才能进入ID阶段?Idk分支失速的含义

  • 我很困惑,在使用相同的$rt的LW之后出现的存储字指令如何导致MIPS中的管道暂停。考虑以下代码块: 这里有三个单词在记忆中来回移动。例如,在前两行中,$s0被加载到中,然后其内容被保存回内存中。我不确定软件指令在EX阶段或MEM阶段是否需要s0美元。如果在MEM阶段需要它,那么不需要暂停管道就可以通过转发来解决吗?

  • 如果我理解正确,管道中的停滞/冻结会导致一个时钟周期浪费。如果几个周期(每秒数十亿个周期)浪费,这可能没什么大不了的,甚至在性能方面也无法衡量。但我很好奇什么操作会导致管道泡沫。负载屏障会导致管道停止吗?因为需要从内存/三级缓存中获取数据,还是因为当前管道依赖于最后一条管道的结果而产生泡沫?类似于: 如果我上面关于内存障碍导致气泡的假设不正确,这是否意味着错误的分支预测、错误的内存共享和加载/存储