无数据转发及冒险检测时,RISC-V代码流水线停顿优化问询
无需数据转发/冒险检测的RISC-V代码优化方案(无新增语句)
首先梳理原代码的数据依赖链:
add x15, x12, x11(指令1)写寄存器x15,后续ld x13,8(x15)(指令2)、or x13,x15,x13(指令4)、sd x13,0(x15)(指令5)均存在对x15的RAW读依赖ld x13,8(x15)(指令2)写x13,or x13,x15,x13(指令4)存在对x13的RAW读依赖ld x12,0(x2)(指令3)写x12,但所有后续指令均未读取x12,且指令1已在ID阶段完成对x12的读取(指令1仅将x12作为源操作数),因此这条指令是完全独立的无关指令,可用于填充等待窗口。
优化后的指令顺序
1. add x15, x12, x11 2. ld x12, 0(x2) 3. ld x13, 8(x15) 4. or x13, x15, x13 5. sd x13, 0(x15)
停顿减少的核心逻辑
在无数据转发的5级流水线(IF→ID→EX→MEM→WB)中,ALU指令(如add)的写回阶段在第5周期,后续需要读取x15的指令(ld x13)必须等待2个周期才能获取有效数据。原方案中这2个周期只能插入NOP(停顿),现在用独立的ld x12,0(x2)填充该窗口,直接抵消2个停顿。
剩余停顿说明
ld x13的写回在第6周期,or指令的ID阶段需等待1个周期才能读取x13or指令的写回在第9周期,sd指令的ID阶段需等待1个周期才能读取x13- 总停顿数从原有的5个降至3个,全程未新增任何语句,也未启用数据转发或冒险检测。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

