MIPS流水线无转发/全转发/延迟加载的时钟周期计算疑问
MIPS指令流水线周期计算疑问解答
给定MIPS指令序列:
lw $4, 0($1) addi $5, $4, 10 add $2, $2, $3 lw $1, 20($2) add $1, $1, $5
以下基于经典5段MIPS流水线(IF取指、ID译码/读寄存器、EX执行、MEM访存、WB写回),解释标准答案与你的计算差异:
(a) 无转发流水线:15周期
无转发时,所有RAW数据冒险必须通过插入stall等待寄存器写回完成,具体依赖与stall分析:
lw $4与addi $5:lw的WB在周期5,addi需stall 2个周期(周期3、4)才能在ID阶段读到$4的新值。add $2与lw $1:add的WB在周期7,lw需stall 2个周期(周期6、7)才能读到$2的新值。lw $1与add $1:lw的WB在周期11,add需stall 3个周期(周期9、10、11)才能读到$1的新值。
逐周期排布后,最后一条指令的WB阶段落在周期15,总周期为15。你之前的12周期结果,大概率是忽略了后续指令间的多级依赖导致的stall。
(b) 全转发流水线:11周期
全转发支持EX→EX、MEM→EX的数据转发,仅lw后的指令因结果需MEM阶段生成,需插入1个stall:
lw $4后addi $5需stall 1个周期(周期4),通过MEM→EX转发获取$4的值。add $2的结果可通过EX→EX转发给lw $1的EX阶段,无需stall。lw $1的结果需MEM→EX转发给add $1,同时addi $5的结果需等WB写回后add $1才能在ID阶段读到,因此需额外stall 1个周期(周期7)。
最终最后一条指令的WB阶段落在周期11,总周期为11。你之前的5周期结果明显错误,是未考虑流水线的重叠执行规则(单周期只能推进一个阶段,指令无法在5个周期内完成全部阶段的重叠)。
(c) 延迟加载优化:9周期
延迟加载利用lw的延迟槽,将不依赖lw结果的指令插入lw之后,消除stall:
调整后的指令序列:
lw $4, 0($1) add $2, $2, $3 # 延迟槽指令,无$4依赖 addi $5, $4, 10 lw $1, 20($2) add $1, $1, $5
优化后:
lw $4的延迟槽填充add $2,消除原addi $5前的stall。- 全转发机制下,
add $2的结果直接转发给lw $1的EX阶段,lw $1的结果转发给add $1的EX阶段,无额外stall。
最终最后一条指令的WB阶段落在周期9,总周期为9。你之前的10周期结果,是未正确利用延迟槽消除初始的stall。
内容的提问来源于stack exchange,提问作者eswcs
相关产品推荐
相关产品推荐

