我们最近在讨论单周期和流水线处理器时讨论了电路类中的NOP。如果我们有以下代码:
add $t1, $t2, $t3
sub $t4, $t1, $t0
由于$t1存在数据危险。在没有数据危险检测单元的流水线处理器中,在更新后的值t1写入寄存器之前,子指令使用旧值,因此是数据危险。如果我们添加2个NOP,那么我们可以解决这个问题,或者如果有数据危险检测单元,我们可以在执行阶段后将结果转发给t1。
然而,如果我们有一个分支指令呢?例如:
add $t1, $t2, $t3
beq $t0, $t1, Label
如果我们不能使用转发,我们是否也在这里添加2个NOPS?
如果没有架构上的额外细节,很难肯定地回答。而且有这么多版本的mips架构存在。
但先看看你的索赔
add $t1, $t2, $t3
sub $t4, $t1, $t0
存在数据危险,因为$t1...
正当
如果我们添加2个NOP,那么我们可以解决这个问题
不完全是。如果没有任何数据转发意味着,使用一个NOP,新$t1将在MM/WR管道规则中,使用第二个NOP,它将被写回寄存器组。但不是DI/EX管道规则。因此,要在只有两个NOPS的情况下获得适当的行为,您需要一种将写回寄存器组的数据转发到DI/EX规则的方法,或者使用一些技巧,例如在寄存器组时钟的下降沿写入并在周期的第二部分读取它。
我们将假设您的假设是正确的,并且在注册库的输入和输出之间存在某种转发。
关于分支指令,有几种方法可以实现它们。
最明显的方法是使用EX-stage同时计算条件($t0=?$t1)和ALU以及带有附加加法器的分支地址。但is有一个主要缺点:在完成此计算时,LI阶段正在获取一条新指令(其中一条已经处于解码阶段),这将导致2个周期的分支惩罚。
在经典的mips管道中所做的是在解码阶段处理分支。在此阶段,加法器使用PC immediate计算分支地址,并添加专用比较器以直接比较寄存器组的输出(顺便说一句,这就是为什么您只能对分支指令进行比较eq/neq,以简化此比较器,而ALU比较器可以进行其他类型的比较)。这样,分支惩罚仅为一个周期。
如果我们假设这是您的实际架构,并且我们没有转发手段,除了寄存器库,那么一个NOP就足够了。在一个NOP之后,$t1的新值在MEM/WR管道规则中。在下一个周期,它将在上半周期被写回寄存器库,并可用于下半周期的分支比较。
当然,如果您假设分支在EX阶段被处理(并且您有2个周期的分支惩罚),那么需要第二个NOP。
在没有分支预测的标准流水线MIPS处理器中,beq的相等性测试在ALU中执行,即在EX阶段,这意味着它受相同ALU的约束-
(这与执行分支指令后可能发生的管道重新填充暂停无关,与执行或预测失误的分支无关,而只与显示的数据依赖关系的延迟有关。)
如果理论处理器是流水线的,但没有危险保护(旁路或延迟),则需要与第一个场景相同的2个NOP。
如果不暂停,这怎么安全呢?经典MIPS除了缓存未命中之外,甚至无法做到这一点?(MIPS最初代表的是没有互锁管道级的微处理器,它有一个负载延迟槽,而不是互锁。) 原始MIPS I是一个经典的5级RISC设计,它通过在ID阶段尽早检查分支条件来隐藏其所有分支延迟(更正:这是错误的,去阅读这个答案;不要被问题中基于这个错误前提的其余细节所误导)。这就是为什么它仅限于相等/不相等,或符号位检查,如lit
我想问为什么指令不是MIPS ISA的一部分。相反,他们实际上使其成为汇编程序员的伪指令。从硬件实现的角度来看,我只是无法识别和(这是MIPS ISA的一部分)之间的区别。 顺便说一下,《计算机组织与设计》一书说: 注意到冯·诺依曼关于“设备”简单性的警告,MIPS体系结构不包括分支,因为分支太复杂,要么会延长时钟周期时间,要么每条指令需要额外的时钟周期,因此两条更快的指令更有用。 但我仍然不知道
该功能意味着不执行任何操作。 此命令通常用于if statements 。 语法 (Syntax) nop 参数 (Parameters) 没有 返回值 (Return Value) 没有 例子 (Example) /* Main program */ options arexx_bifs status = 'Yes' if status = 'YES' then nop 输出
我正在研究mips r10000的不同管道阶段。本文指出,处理器每次从指令缓存中获取4条指令。但指令缓存的延迟必须超过一个周期,虽然我不知道指令缓存的准确命中延迟,但Haswell处理器中一级数据缓存的命中延迟大约为4个周期。 因此,如果我们假设一级指令缓存延迟为3-4个周期,那么处理器如何在每个周期提取4条指令?
我的理解是,在处理器流水线的开始,指令指针(指向要执行的下一条指令的地址)在提取之后由分支预测器更新,以便这个新地址可以在下一个周期被提取。 但是,如果在管道的早期修改了指令指针,这是否会影响当前处于执行阶段的可能依赖于旧指令指针值的指令?例如,在进行时,需要将当前 EIP 推送到堆栈中,但是在分支预测期间更新指令指针时,这不会受到影响吗?
二、用伪指令实现的分支结构 为了改善汇编语言源程序的结构,减少显式转移语句所带来混乱,在宏汇编MASM6.11系统中,增加了表达分支结构的伪指令。该伪指令的书写格式与高级语言的书写方式相类似,汇编程序在汇编时会自动增加转移指令和相应的标号。理解并掌握该知识,对将来学习《编译原理》课程也有一定的帮助。 分支伪指令的具体格式如下: 格式1: .IF condition;以英文“句号”开头 指令序列