软件设计师 · 高频练习

后一条指令读取前一条尚未写回的寄存器,属于什么流水线冒险?

中级 单选题 第 926 题 中等 软件设计师RAW指令流水线数据冒险数据前递
题目

某处理器采用指令流水线。相邻两条指令依次为 I1:ADD R1,R2,R3;I2:SUB R4,R1,R5。I2 需要读取 I1 尚未完成写回的 R1。该冲突属于()。

A RAW(写后读)数据冒险
B WAR(读后写)数据冒险
C WAW(写后写)数据冒险
D 控制冒险
题目类型:原创高频练习题 用途:用于帮助理解软件设计师相关考点和答案解析,不等同于官方真题。
正确答案
A
答案解析

I1 先写 R1,I2 随后要读 R1;如果 I2 读取时 I1 的结果还没有可用,就形成 Read After Write,即 RAW 数据冒险。处理器可用数据前递缩短等待,无法前递时需要暂停流水线。

选项分析

A

正确。I2 的读操作必须等待 I1 的写结果可用,属于真实数据相关。

B

错误。WAR 是前一条先读、后一条再写同一位置,本题的顺序相反。

C

错误。WAW 要求两条指令都写同一目的位置,而 I2 写的是 R4。

D

错误。控制冒险通常由分支、跳转改变下一条取指地址引起,本题没有分支。

本题为什么容易错

“写后读”容易被读成先读再写。更稳的办法是按程序顺序看:前一条产生 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 数据冒险。数据前递可以提前提供结果,必要时还要暂停流水线,但处理方式不会改变冒险类型。