关于MIPS代码中Line3到Line4无数据依赖的疑问(启用转发)
关于MIPS代码数据依赖的疑问解答
先把题目里的MIPS代码贴出来:
Loop: addi $6, $6, 4 lw $4, 0($6) add $5, $5, $4 rol $2, $5, 1 bne $0, $5, Loop sw $5, 0($6) Exit:
你提到的参考答案标记的数据依赖是:
- Line1到Line2,寄存器$6
- Line2到Line3,寄存器$4
- Line4到Line5和Line6,寄存器$5
你的疑问完全合理!Line3的add $5, $5, $4明明修改了寄存器$5,Line4的rol $2, $5, 1需要读取$5的内容,这两者之间确实存在RAW(写后读)数据依赖,没被参考答案列出来绝对是个疏漏,甚至参考答案里还有另一个错误:Line4的rol指令根本没有修改$5,它只修改了$2,所以Line5的bne和Line6的sw读取的$5其实来自Line3的add,应该是Line3到Line5/6的依赖,而不是Line4到它们的依赖。
那为什么会出现这种情况?大概率是出题人整理答案时的粗心。我们再理清楚所有真实存在的RAW数据依赖(启用转发机制不影响依赖的存在,只是影响是否需要流水线停顿):
- Line1 → Line2:
addi写$6,lw读取$6作为内存地址 - Line2 → Line3:
lw写$4,add读取$4进行运算 - Line3 → Line4:
add写$5,rol读取$5进行循环移位 - Line3 → Line5:
add写$5,bne读取$5判断分支条件 - Line3 → Line6:
add写$5,sw读取$5写入内存
至于转发机制的作用,只是让Line3→Line4这种依赖不需要停顿——add在执行阶段(EX)结束后产生的$5结果,会直接通过转发单元传给rol的EX阶段,不需要等到add写回寄存器堆(WB阶段),所以不会造成流水线停顿,但这并不代表依赖不存在。
内容的提问来源于stack exchange,提问作者user8848592
相关产品推荐
相关产品推荐

