You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:42:04