我们最近在电路课上讨论单周期和流水线处理器时讨论了 NOP。如果我们有以下代码:
add $t1, $t2, $t3
sub $t4, $t1, $t0
由于$t1
,存在数据危险。在没有数据危险检测单元的流水线处理器中,在$t1
的更新值被写回寄存器之前,子指令使用旧值——因此存在数据危险。如果我们添加 2 个 NOPS,那么我们就可以解决这个问题,或者,如果有数据危险检测单元,我们可以在执行阶段之后将结果转发给 $t1
。
但是如果我们有分支指令怎么办?例如:
add $t1, $t2, $t3
beq $t0, $t1, Label
如果我们不能使用转发,我们是否还要在此处添加 2 个 NOPS?
最佳答案
在没有分支预测的标准流水线 MIPS 处理器中,beq
的相等性测试是在 ALU 中执行的,即在 EX 阶段 — 这意味着它受到相同的 ALU 的约束 -> ALU 危险和相同的旁路可以减轻这种危险。
(这并没有说明分支指令之后可能发生的管道重新填充停顿,来自已采取或错误预测的分支,而只是说明了您所显示的数据依赖性的延迟。)
如果理论上的处理器是流水线式的,但没有危险保护(旁路或延迟),则需要与第一个场景相同的 2 个 nop。
关于assembly - MIPS 中分支指令的 NOPS 数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60366393/