我想确认以下时序图是否适用于MIPS 5级管道(*=暂停):
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
LW R1, 0(R4) | IF | ID | EX | M | W | | | | | | | | | | | |
LW R2, 400(R4) | | IF | ID | EX | M | W | | | | | | | | | | |
ADD1 R3,R1,R2 | | | IF | ID | * | * | EX | M | W | | | | | | | |
SW R3, 0(R4) | | | | IF | * | * | ID | * | * | EX | M | W | | | | |
SUB R4,R4,#4 | | | | | | | IF | * | * | ID | EX | M | W | | | |
BNEZ R4, L1 | | | | | | | | | | IF | ID | * | * | EX | M | W |
评论:
1)ADDI:ID停滞2个周期,因此之前的WB可以完成
2)SW:2个档位,因为ID无法开始,另外2个档位用于ID以完成之前的WB
3) SUB:如果直到周期#7才能启动,ID必须等到周期10,因为之前的指令
4)BNEZ:IF直到周期#10才能开始,ID有2个档位,因此之前的WB可以完成
如果指令结果仅通过寄存器文件传递(没有转发/绕过)并且寄存器仅在EX之前读取,那么您的图表看起来是正确的。(您可能会认为SUB和BNEZ IF之前的空阶段是失速周期,因为通常下一条指令的IF会立即跟随上一条指令的IF阶段。另一方面,这可能会被视为使图表混乱。)
然而,通常对5级管道进行优化,以避免上述大多数暂停,方法是将结果直接从产生结果的指令的EX级末尾(或加载的M级末尾)转发到从属指令的EX级开头。(对于存储指令,存储在内存中的值可能只有M级甚至W级才需要,因此设计者可能会考虑在这种情况下添加转发。对于这个简单的管道,这只对提供内存移动的一对指令有影响,因为加载是唯一延迟大于1的指令。对于两个超标量,这可能会允许ike“添加R3、R2、R1;SW R3、0(R4);”在同一周期内开始执行。)
使用这种优化的流水线,通过将结果从“LW R2,400(R4)”的M阶段结束转发到ADD的EX开始,ADD只有一个失速周期(在ID之后)。
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | LW R1, 0(R4) | IF | ID | EX | M | W | | | | | | | LW R2, 400(R4) | | IF | ID | EX | M | W | | | | | | ADD1 R3,R1,R2 | | | IF | ID | * | EX | M | W | | | | SW R3, 0(R4) | | | | IF | * | ID | EX | M | W | | | SUB R4,R4,#4 | | | | | * | IF | ID | EX | M | W | | BNEZ R4, L1 | | | | | | | IF | ID | EX | M | W |
此类优化增加了设计的复杂性,但避免不必要的暂停可以显著提高性能。
我不确定以下属性如何影响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阶段需要它,那么不需要暂停管道就可以通过转发来解决吗?
在以下MIPS指令序列中(整个程序未显示): 我想确认两条指令之间所需的暂停次数(在5阶段MIPS管道的上下文中-IF、ID/Reg、EX、MEM、WB),有无转发。 我的理解: (a)如无转发: 在这种情况下,需要2个暂停(在周期5中,可以使用寄存器的分相访问在第二条指令的ID阶段读取R1) (b) 如果有转发: 在这种情况下,不需要暂停(周期4中第二条指令的EX-stage可以从周期3中第一条
关于pattersson书中提到的MIPS汇编语言,我有一个问题,就是在指令之间插入NOP以避免管道暂停。 考虑以下代码 我们看到在和之间存在$s5的RAW危险。在和之间还有$s5的WAW危险。所以我们必须插入两个NOP以避免停顿。换句话说,流水线图是 当要执行sw时,必须等待lw将数据放入寄存器。因此,存在一个泡沫。此外,当添加想要写入最终结果时,它必须等待上一条指令的完成()。这是另一个泡沫。
我正在学习MIPS procesor体系结构。 根据本教程,它指出:没有互锁管道级的微处理器http://en.wikipedia.org/wiki/MIPS_architecture 流水线的一个主要障碍是,某些指令(如除法)需要更长的时间才能完成,因此CPU必须等待下一条指令进入流水线 该问题的一个解决方案是使用一系列联锁装置,允许各阶段指示它们正忙,从而暂停上游的其他阶段<轩尼诗的团队将这些
无状态管道是纯粹的功能,通过输入数据流动而不记住任何东西或引起可检测的副作用。 大多数管道是无状态的。 我们使用的CurrencyPipe和我们创建的长度管是无状态管的示例。 状态管道是能够管理它们转换的数据的状态的管道。 创建HTTP请求,存储响应并显示输出的管道是有状态的管道。 有状态管道应谨慎使用。 Angular 2提供 ,这是有状态的。 View Example 实现有状态管道 // n