请考虑以下代码序列,该代码序列在不支持停顿且仅支持ALU-ALU转发的处理器上执行:
I1: lw $1, 40($6)
I2: add $6, $2, $2
I3: sw $6, 50($1)
I4: lw $5, -16($5)
I5: sw $5, -16($5)
I6: add $5, $5, $5
现在在此处理器上运行此代码的唯一方法是插入nops。解决方法是:
I1: lw $1, 40($6)
I2: add $6, $2, $2
I22: nop
I3: sw $6, 50($1)
I4: lw $5, -16($5)
I44: nop
I45: nop
I5: sw $5, -16($5)
I6: add $5, $5, $5
我的问题是,为什么在说明I2和I3(Alu-Store危险)之间我们仅插入了一个nop?为什么这里一个点子就足够了?根据我的理解,由于无法通过ALU-ALU转发来支持此危害,因此这对于该处理器是一个危害,这意味着添加必须首先通过WB阶段写入结果,然后SW指令从寄存器文件中读取结果,因此需要两次nop,因为在这种情况下,add指令处于WB阶段,SW处于ID阶段,并且通过转发寄存器文件,SW可以读取所需的寄存器。