Appearance
题目
下列选项中,不会引起指令流水线阻塞的是( )。
错因
B
把"数据相关"和"数据旁路"混了——可能误读为"数据相关 = 数据通路相关 = 旁路"。但数据相关(data dependency)就是数据冒险的源头——前一条指令写某寄存器、后一条指令读它,没有转发的情况下后者必须等前者写回完成,会阻塞。题问"不会引起阻塞",B 反了。
C
条件转移属于控制冒险——分支条件要到 EX(甚至 MEM)阶段才能判定,在那之前 CPU 不知道下一条指令的地址。无延迟槽 / 无分支预测时,后续指令必须阻塞等待分支决议;即使有预测,预测错了也要把推测执行的指令清掉重发,本质上仍是阻塞。
D
资源冲突 = 结构冒险——多条指令在同一周期争用同一硬件单元(如单端口存储器同时被取指和取数访问),无法并行通过,必然有一条要阻塞或停顿。比如经典的"IF 和 MEM 都要访问主存"冲突。
总解析
核心区分:
流水线阻塞的来源就是经典三大冒险:
| 冒险类型 | 触发原因 | 是否阻塞 |
|---|---|---|
| 数据冒险 | 前后指令对同一寄存器的"写后读 / 写后写 / 读后写" | 会(无转发时) |
| 控制冒险 | 分支/跳转的目标地址要等到执行阶段才确定 | 会(无预测时) |
| 结构冒险 | 同一周期多个流水段争用同一硬件资源 | 会 |
而数据旁路(forwarding/bypass)不是冒险,是解决冒险的技术——把 ALU/MEM 输出直接接回到下一条指令的 EX 输入,绕过寄存器堆的"写回-读取"延迟。它的存在就是为了让上一条指令的结果能尽快被下一条用到,消除或减少阻塞。
逐项判定:
| 选项 | 性质 | 是否引起阻塞 |
|---|---|---|
| A. 数据旁路(转发) | 解决方案 | 否(反而消除阻塞) |
| B. 数据相关 | 数据冒险源头 | 是 |
| C. 条件转移 | 控制冒险源头 | 是 |
| D. 资源冲突 | 结构冒险 | 是 |
例外提醒:转发并非万能。load-use 冒险(load 指令的结果立刻被下一条用作 EX 输入)连转发都救不了——load 的数据要到 MEM 阶段末才有效,下一条指令的 EX 阶段开始时还没拿到——这种情况仍要插入 1 个 stall。但这个 stall 是"数据冒险无法被转发完全消除"导致的,不是转发本身引起的。题面问"哪种会引起阻塞"——转发本身的作用方向是消除阻塞,所以仍然是 A。
最终答案是 A(数据旁路转发)。
记忆要点:流水线题里看到"会引起阻塞"四字,先把答案往冒险源头(数据/控制/结构相关)找;看到"减少/避免阻塞",往优化技术(转发、分支预测、动态调度、超标量)找。两类正好相反。