某处理器采用指令流水线。相邻两条指令依次为 I1:ADD R1,R2,R3;I2:SUB R4,R1,R5。I2 需要读取 I1 尚未完成写回的 R1。该冲突属于()。
I1 先写 R1,I2 随后要读 R1;如果 I2 读取时 I1 的结果还没有可用,就形成 Read After Write,即 RAW 数据冒险。处理器可用数据前递缩短等待,无法前递时需要暂停流水线。
选项分析
正确。I2 的读操作必须等待 I1 的写结果可用,属于真实数据相关。
错误。WAR 是前一条先读、后一条再写同一位置,本题的顺序相反。
错误。WAW 要求两条指令都写同一目的位置,而 I2 写的是 R4。
错误。控制冒险通常由分支、跳转改变下一条取指地址引起,本题没有分支。
本题为什么容易错
“写后读”容易被读成先读再写。更稳的办法是按程序顺序看:前一条产生 R1,后一条消费 R1,所以是 RAW。
简短答案
后一条指令读取前一条尚未写回的寄存器,属于什么流水线冒险,正确答案是 A(RAW(写后读)数据冒险)。I1 先写 R1,I2 随后要读 R1;如果 I2 读取时 I1 的结果还没有可用,就形成 Read After Write,即 RAW 数据冒险。处理器可用数据前递缩短等待,无法前递时需要暂停流水线。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| RAW(写后读)数据冒险 | 本题正确答案 | 正确。I2 的读操作必须等待 I1 的写结果可用,属于真实数据相关。 | 看到题干核心场景时优先联想到它 |
| WAR(读后写)数据冒险 | 本题干扰项 | 错误。WAR 是前一条先读、后一条再写同一位置,本题的顺序相反。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| WAW(写后写)数据冒险 | 本题干扰项 | 错误。WAW 要求两条指令都写同一目的位置,而 I2 写的是 R4。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 控制冒险 | 本题干扰项 | 错误。控制冒险通常由分支、跳转改变下一条取指地址引起,本题没有分支。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- WAR(读后写)数据冒险:错误。WAR 是前一条先读、后一条再写同一位置,本题的顺序相反。
- WAW(写后写)数据冒险:错误。WAW 要求两条指令都写同一目的位置,而 I2 写的是 R4。
- 控制冒险:错误。控制冒险通常由分支、跳转改变下一条取指地址引起,本题没有分支。
知识点详解
RAW 又称真实相关,后一条指令必须使用前一条指令产生的数据。简单顺序流水线中最常见的就是 RAW;WAR 和 WAW 更多出现在允许乱序执行或并行写回的结构中。数据前递会绕过尚未完成的寄存器写回,把中间结果送到后续执行单元;若结果产生得太晚,例如某些 load-use 组合,控制逻辑仍要插入气泡。
备考速记
前写后读是 RAW;前读后写是 WAR;两次都写才是 WAW。
RAW 在数据前递场景中的作用
RAW在本题中的核心价值,是解决“某处理器采用指令流水线。相邻两条指令依次为 I1:ADD R1,R2,R3;I2:SUB R4,R1,R5。I2 需要读取 I1 尚未完成写回的 R1。该冲突属于()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。
同类题怎么考
- 给出两三条汇编指令,判断 RAW、WAR 或 WAW。
- 比较前递、流水线暂停和分支预测分别处理哪类问题。
RAW 在软件设计师软考中的考法
软考选择题通常不会只考概念定义,还会把RAW放到数据前递场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。
解题思路
老师做这类题一般先圈寄存器:I1 把结果写进 R1,I2 马上把 R1 当源操作数读取。也就是说,后面的读依赖前面的写,顺序正好是 Read After Write。若硬件能从执行阶段或访存阶段把结果直接前递给 I2,就不必等到寄存器正式写回;但前递只是处理手段,不会改变它属于 RAW 的事实。
考点定位
判断 RAW、WAR、WAW 时不要按中文简称猜,先给两条指令标出读集合和写集合,再看依赖发生的先后顺序。
易错提醒
- 只看两条指令都出现 R1,没有区分源寄存器和目的寄存器。
- 把数据前递当成冒险类型,而不是解决冒险的硬件机制。
- 看到流水线停顿就误选控制冒险。
备考提示
- 草稿上给每条指令写 R={...}、W={...},交叉比较比背缩写可靠。
- 继续复习 load-use 场景:即使有前递,紧邻使用装载结果时也可能仍需暂停。
你可能还想了解
- RAW、WAR、WAW 数据冒险怎么区分?
- 数据前递为什么不能消除所有流水线停顿?
- load-use 冒险为什么常要暂停一个周期?
本文小结
I1 写 R1、I2 随后读 R1,属于 RAW 数据冒险。数据前递可以提前提供结果,必要时还要暂停流水线,但处理方式不会改变冒险类型。