MIPS64程序优化咨询:解决div.d与sub.d间的RAW停顿问题
MIPS64 浮点指令 RAW 停顿优化方案
问题分析
原代码中div.d f7,f9,f10与sub.d f7,f7,f4存在RAW(写后读)数据依赖:sub.d需要等待div.d完成对f7的写入才能执行,直接插入NOP会浪费流水线周期;而把sub.d移到末尾会破坏运算逻辑——sub.d依赖f4的原始值,add.d会覆盖f4,导致结果错误。
优化方案:指令重排填充延迟周期
利用MIPS64的指令级并行特性,将不依赖f7且不影响sub.d操作数的指令插入到div.d和sub.d之间,填充div.d的长运算延迟周期,避免空等。优化后的代码如下:
.text div.d f7,f9,f10 # 启动除法运算(长延迟指令) mul.d f2,f4,f3 # 无数据依赖,并行执行 ld r1,78(r0) # 无浮点依赖,并行执行 sub.d f7,f7,f4 # 此时div.d已完成运算,无RAW停顿 add.d f4,f5,f6 # 修改f4,不影响sub.d(已使用原始f4值) halt
优化逻辑说明
mul.d和ld既不读取f7,也不修改sub.d需要的f4原始值,完全可以在div.d的运算周期内并行执行,完美填充RAW停顿的空周期。add.d必须放在sub.d之后,因为sub.d依赖f4的初始值,提前执行会覆盖f4,导致运算结果错误。- 该方案无需插入NOP,通过指令重排充分利用CPU流水线,同时保证程序运行结果与原代码完全一致。
内容的提问来源于stack exchange,提问作者Magnesis
相关产品推荐
相关产品推荐

