Appearance
流水线数据冒险模拟器使用指南
大纲定位
五(六)3 结构冒险、数据冒险和控制冒险的处理
要求:能判断数据冒险的发生位置,并比较阻塞与转发两种处理方式的代价。
这个模拟器帮你看清什么
时空图画在纸上是静态的,气泡插在哪、转发线从哪连到哪,只能靠脑补。这个模拟器让同一段指令序列在三种处理方式下各跑一遍,总周期数就显示在那里——阻塞的代价和转发的收益是两个能直接读出来的数字。
概念本身别在这里学,见文末链接。
界面速览
| 位置 | 控件 | 作用 |
|---|---|---|
| 顶部 | 无处理 / 阻塞(气泡)/ 数据转发 | 切换处理方式,时空图重画 |
| 中部 | 5 级流水线时空图 | 每格是一条指令在某周期所处的段 |
| 中部 | 图例 | 五个流水段各一色;阻塞模式多一条气泡图例,转发模式多一条转发线图例 |
| 中下 | 性能对比卡 | 总周期数——三种模式对比的关键读数 |
| 底部 | ◀ | ▶/⏸ | ▶ | 上一步 | 播放暂停 | 下一步 |
| 底部 | N / 总数 | 当前第几个时钟周期 |
| 底部 | 速度下拉 |「重新播放」 | 0.5x / 1x / 2x | 跑到末尾才出现 |
模式一:无处理(看冒险在哪)
操作:选顶部「无处理」,速度调 0.5x,用 ▶ 单步走到第 3 个周期停住。
盯哪里:I2 那一行的 ID 格子——它被标红了。
该看到:I2(sub $t3, $t0, $t4)在 CC3 进入 ID 读 $t0,而 I1(add $t0, $t1, $t2)要到 CC5 的 WB 才把结果写回 $t0。读在写之前发生了,这就是 RAW(写后读)冒险。
不处理冒险的后果
如果不做任何处理,I2 读到的 $t0 是旧值,计算结果错误。这就是为什么必须用阻塞或转发来解决数据冒险。
模式二:阻塞(插入气泡)
操作:点「阻塞(气泡)」,先看一眼性能对比卡上的总周期数,再单步走。
盯哪里:I2 那一行出现的灰色虚线框——那就是气泡。
该看到:I2 在进入 ID 之前被暂停(stall),插入 2 个气泡,直到 I1 的 WB 完成后才进入 ID 读到正确的 $t0。总周期数从 9 变成 11。
关键数字:
- 无冒险时总周期 = 9
- 插入 2 个气泡后总周期 = 11
- 性能损失 = 2 个时钟周期(约 22%)
阻塞周期数怎么算?
相邻指令的 RAW 冒险(距离 = 1):需要等待 WB - ID = 3 个阶段,但流水线本身就有 1 个周期的自然间隔,所以需要 stall 2 个周期。
通用公式:stall 周期数 = max(0, WB 所在阶段编号 - ID 所在阶段编号 - 指令间距离)
模式三:数据转发(Forwarding)
操作:点「数据转发」,注意图例里多出来的那条转发线说明,然后单步走到 I1 的 EX 结束那一拍。
盯哪里:从 I1 的 EX 格子伸出的橙色箭头,看它落在哪里。
该看到:I1 的 EX 算完 $t0 的新值后,通过旁路直接送到 I2 的 EX 输入端。I2 不必等 I1 的 WB,总周期数回到 9——与无冒险时完全一样,气泡全部消失。
转发路径:
- EX→EX 转发:I1.EX → I2.EX(相邻指令,距离 = 1)
- MEM→EX 转发:I1.MEM → I3.EX(间隔 1 条,距离 = 2)
Load-Use 冒险:转发也救不了
如果 I1 是 lw(Load 指令),数据要到 MEM 阶段结束才可用。即使有转发,I2 仍需 1 个 stall。这就是为什么编译器会尝试在 lw 后面插入一条无关指令(指令调度)。408 选择题常考这个区别!

(袁春风《计算机组成与系统结构》第 3 版,见文末教材出处)
转发能救大部分数据冒险,但救不了 load-use:lw 要到 Mem 段结束才拿到数据,而下一条指令在 Ex 段就要用——时间上是往回传,转发线做不到。所以 load-use 必须至少阻塞一个周期,这是这一块的硬边界。
三个动手任务
- 把三种模式的总周期数抄成一行:9 / 11 / 9。 第二个数减第一个是阻塞的代价,第三个回到第一个说明转发把代价清零了。这一行数字就是这个模拟器的全部结论。
- 在无处理模式下停在 CC3,用手指顺着 I1 那一行往右数到 WB。 数出 I2 要读的值在第几拍才写好,再减去它实际读的拍数——差几拍,就得插几个气泡。用这个方法验算"stall 2 个周期"是怎么来的。
- 在转发模式下找出所有橙色箭头,记下每条的起点段和终点段。 应该只有两类:EX→EX(相邻指令)和 MEM→EX(隔一条)。没有任何一条是往回指的——这正是转发救不了 load-use 的原因。
做题应用
遇到数据冒险的题时:
- 先标出所有 RAW 依赖关系
- 计算指令间距离
- 根据是否有转发,确定 stall 周期数
- 如果有 Load-Use,即使有转发也要加 1 个 stall
概念去哪里学
本文只讲怎么用这个模拟器。它演示到的知识点都有专文,别在这里学概念:
真题练习
相关真题(13题)
教材出处
- load-use 数据冒险(图 6.17):袁春风《计算机组成与系统结构》第 3 版 §6.3 流水线冒险及处理,印刷页 p181