You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

流水线架构数据依赖识别请求:分析给定MIPS指令的所有数据依赖

没问题,我来帮你把这些MIPS指令里的所有数据依赖梳理清楚,先快速明确下数据依赖的三种核心类型,方便我们对应分析:

  • RAW(写后读):这是最常见的「真依赖」——指令B需要读取指令A刚写入的寄存器或内存地址,必须等A写完才能执行B;
  • WAR(读后写):属于「反依赖」——指令B要写入的寄存器/内存,是指令A接下来要读取的,乱序执行时可能会破坏A的读取结果;
  • WAW(写后写):属于「输出依赖」——两条指令先后写入同一个寄存器/内存,乱序执行时可能会覆盖掉正确的结果。

一、RAW(写后读)依赖(必须等待的真依赖)

这些是顺序执行时流水线必须暂停等待的依赖,也是最直观的:

  • I1I2I1通过addi $t1, $t10, -10写入寄存器$t1I2lw $t2, 0($t1)需要读取$t1的值作为内存地址,属于寄存器RAW依赖
  • I2I3I2写入$t2I3lw $t3, 0($t2)$t2作为内存地址读取数据到$t3,是寄存器RAW依赖
  • I3I4I3写入$t3I4sw $t3, 0($t4)$t3的值存入内存,属于寄存器RAW依赖
  • I3I5I3写入$t3I5sub $t3, $zero, $t3需要读取$t3的值来做减法运算,是寄存器RAW依赖
  • I5I6I5写入$t3(把原$t3取反),I6addi $t3, $t3, 1需要读取这个新的$t3值做加1操作,属于寄存器RAW依赖

二、WAW(写后写)依赖(约束乱序执行的输出依赖)

在你的指令序列里,没有WAR依赖(因为所有指令是顺序执行的,不存在后指令先写、前指令后读的情况),但存在多组WAW依赖:

  • I3I5I3I5都向$t3写入数据,如果流水线允许乱序执行,I5提前完成写入会覆盖I3的结果,导致后续指令拿到错误的值,所以这是寄存器WAW依赖
  • I3I6I3I6都写入$t3,同理属于寄存器WAW依赖
  • I5I6I5I6都对$t3执行写入操作,属于寄存器WAW依赖

针对你困惑的$t3依赖细节

你纠结的I3I4I5I6之间的$t3依赖,可以拆成两部分看:

  1. 读取链路的RAW依赖I3是第一个给$t3赋值的指令,I4要把这个值存到内存,I5要拿这个值做取反运算,所以I3I4I5之间都是RAW依赖;I5$t3赋了新值后,I6要基于这个新值加1,所以I5I6也是RAW依赖;
  2. 写入链路的WAW依赖I3I5I6都在修改$t3的值,两两之间都存在WAW依赖——这种依赖在顺序流水线里不会有问题,但在乱序流水线中必须被检测并处理,保证写入的顺序和指令序列一致。

另外要提一句:这里没有内存相关的依赖,因为只有I4执行了写内存操作,其他指令没有访问0($t4)这个地址,所以不存在内存层面的RAW/WAR/WAW依赖。

内容的提问来源于stack exchange,提问作者Hyun seo

火山引擎 最新活动