一 真题2010-19
2010-19. 下列选项中,不会引起流水线阻塞的是( )。
A. 数据旁路(转发)
B. 数据相关
C. 条件转移
D. 资源冲突
二 题目要素解析
核心考点:指令流水线的阻塞原因与优化技术,属于计算机组成原理指令流水线模块的基础必考题,重点区分 “引发阻塞的原因” 和 “解决阻塞的手段”。
考查知识点
- 指令流水线阻塞的三大核心诱因:资源冲突(结构相关)、数据相关、控制相关。
- 各类相关的产生场景、对流水线的影响。
- 数据旁路(转发)的工作原理与作用。
- 条件转移指令与控制相关的关联关系。
题型特征:反向选择题,要求选出不会造成阻塞的选项。考查对流水线核心概念的辨析,无复杂计算,重点区分 “阻塞诱因” 和 “阻塞解决方案”。
易错点
- 混淆数据旁路和数据相关,误认为数据旁路会引发阻塞。
- 不清楚条件转移是控制相关的典型场景,误判其不会造成阻塞。
- 混淆资源冲突与其他相关问题,无法区分阻塞原因和优化手段。
三 哔哔详解
先明确流水线阻塞、流水线相关和优化技术的核心边界,再逐一分析选项。
核心概念铺垫
流水线阻塞
指令流水线将指令执行拆分为取指、译码、执行、访存、写回等多个阶段,实现多条指令重叠执行。当后续指令无法按时进入下一流水段,必须停顿等待时,就会发生流水线阻塞,会直接降低流水线的吞吐率和加速比。
流水线相关(阻塞诱因)
是导致流水线阻塞的根本原因,主要分为三类:
- 资源冲突(结构相关):多条指令同一时钟周期竞争同一硬件资源。
- 数据相关:指令间存在数据依赖,后续指令需要等待前序指令的计算结果。
- 控制相关:转移指令、中断等改变指令执行顺序,无法提前确定下一条指令地址。
流水线优化技术
用于缓解、消除流水线阻塞,提升流水线效率,本身不会引发阻塞,数据旁路就是典型的优化方案。
逐项分析
✅ A. 数据旁路(转发)
-
是什么?
一种硬件机制:将前一条指令在 EX 或 MEM 阶段产生的结果,直接转发给后一条需要该数据的指令,避免等待写回寄存器。 -
作用?
解决数据相关引起的流水线阻塞! -
是否会阻塞流水线
?
❌
不会!它恰恰是为了 避免 阻塞而设计的
。
例如:
add r1, r2, r3→sub r4, r1, r5
若无旁路:sub需等add写回 → 插入气泡(阻塞)
若有旁路:sub直接从add的 ALU 输出取r1→ 无阻塞
✅ 所以,数据旁路不仅不引起阻塞,反而消除阻塞!
❌ B. 数据相关
-
指后序指令依赖前序指令的运算结果,但结果尚未写回。
-
在未采用转发技术时,必须插入停顿周期(气泡) → 引起阻塞
-
是流水线三大冒险之一
-
例如
ADD R1, R2, R3 ; R1 = R2 + R3 SUB R4, R1, R5 ; SUB指令依赖ADD指令的R1结果若无数据旁路等优化,SUB 指令必须等待 ADD 指令完成写回,流水线会插入空泡,产生阻塞。
❌ C. 条件转移
- 属于控制相关的典型表现。
- 在基本流水线中,需等到MEM 阶段才能确定是否跳转,导致 IF/ID 阶段取了错误指令 → 必须清空流水线 → 引起阻塞
- 即使采用分支预测,预测失败仍会阻塞
❌ D. 资源冲突
- 又称结构相关,指多条指令同时争用同一功能部件(如只有一个乘法器,两条乘法指令同时进入 EX 阶段)
- 必须让其中一条等待 → 插入气泡 → 引起阻塞
- 例如:一条指令处于访存阶段,另一条指令同时需要访问主存取指,二者竞争主存总线。此时必须暂停其中一条指令的执行,导致流水线停顿。
四 参考答案
A ✅
五 考点精析
5.1 流水线三大阻塞
5.1.1 流水线阻塞(冒险 Hazard)
指令流水线把一条指令的执行拆分为取指(IF)、译码(ID)、执行(EX)、访存(MEM)、写回(WB) 等多个阶段,实现多条指令重叠执行。当后续指令无法按时进入下一流水段,必须停顿、插入空泡(NOP)、清空流水线时,就发生了流水线阻塞,会直接降低流水线的吞吐率、加速比,增大 CPI。
5.1.2 资源冲突(结构冒险)
5.1.2.1 核心概念
多条指令在同一个时钟周期,竞争使用同一个硬件资源,导致无法同时推进,必须让部分指令等待。硬件资源数量不足是根本原因。
5.1.2.2 性质特征
- 根源:硬件资源数量有限,不满足并发执行需求。
- 影响:必须暂停部分指令,插入流水线空泡,造成阻塞。
- 解决方向:增加硬件冗余、分时复用、指令重排。
- 特点:和指令逻辑无关,纯硬件层面的冲突。
5.1.2.2 典型场景举例
- 主存总线 / 存储体冲突:一条指令处于取指阶段访问主存,另一条指令处于访存阶段也访问主存,同时竞争存储总线。
- 运算单元冲突:两条指令同时需要使用 ALU 进行算术 / 逻辑运算,仅有一个 ALU 时发生冲突。
- 寄存器端口冲突:多条指令同时读写同一个寄存器的端口。
5.1.3 数据相关(数据冒险)
5.1.3.1 核心概念
多条指令之间存在数据依赖关系,后续指令需要使用前序指令的运算结果 / 写入的数据,但前序指令尚未完成写回,导致后续指令无法正常执行。
5.1.3.2 性质特征
- 根源:指令间存在数据依赖,属于指令逻辑层面的冲突。
- 影响:未做优化时,必须等待前序指令完成写回,造成阻塞。
- 解决方向:数据旁路(转发)、编译器指令重排、插入空泡。
- 关键细分:408 重点考查三种依赖类型。
5.1.3.3 数据相关的三种类型(408 必背)
设指令i在前,指令j在后:
| 类型 | 英文 | 含义 | 考场优先级 |
|---|---|---|---|
| 写后读 | RAW | j 读 i 写入的数据 | 最高,最常考 |
| 读后写 | WAR | j 写 i 读取的数据 | 较少考,有序流水线可规避 |
| 写后写 | WAW | j 和 i 写入同一寄存器 | 较少考,有序流水线可规避 |
5.1.3.4 典型场景举例(RAW,最常考)
# 指令i
ADD R1, R2, R3 ; EX阶段运算,WB阶段将结果写入R1
# 指令j
SUB R4, R1, R5 ; ID阶段需要读取R1的值
指令j译码时,指令i还未完成写回,若没有数据旁路,j必须阻塞等待。
5.1.4 控制相关(控制冒险)
5.1.4.1 核心概念
由改变程序执行流程的指令或事件引发,CPU 无法提前确定下一条要执行的指令地址,已经进入流水线的后续指令无效,需要清空流水线、重新取指。
5.1.4.2 性质特征
- 根源:指令执行顺序发生改变,属于程序控制流层面的冲突。
- 影响:阻塞最严重,往往需要清空整条流水线,损失多个时钟周期。
- 解决方向:转移预测、延迟转移、预取目标指令。
- 核心诱因:转移指令、子程序调用、中断、异常。
5.1.4.3 典型场景举例
- 条件转移指令:执行到 EX 阶段才能判断条件是否成立,此前流水线已取多条后续指令,均无效。
- 无条件转移指令:会改变 PC 值,导致原顺序指令失效。
- 函数调用与返回、中断响应:强制跳转到新的执行地址。
5.1.5 三种阻塞区别和联系
5.1.5.1 核心区别对比表
| 对比维度 | 结构冒险(资源冲突) | 数据冒险(数据相关) | 控制冒险(控制相关) |
|---|---|---|---|
| 产生根源 | 硬件资源不足,并发指令竞争同一功能部件 | 指令间存在真数据依赖(主要是 RAW) | 程序执行流程跳变(分支/跳转/中断) |
| 冲突层面 | 硬件微架构层面 | 指令语义/逻辑层面 | 程序控制流层面 |
| 是否与程序有关 | ❌ 否(由 CPU 设计决定) | ✅ 是(由指令序列依赖关系决定) | ✅ 是(由分支语句、循环等结构决定) |
| 能否通过软件避免 | ❌ 否 | ⚠️ 部分(编译器可重排指令) | ⚠️ 部分(减少分支、循环展开) |
| 阻塞程度 | 中等(通常停顿 1 周期) | 中等(RAW 未转发时停顿;lw 后用必停 1 周期) | 严重(常需清空 IF/ID/EX,损失 2~3 周期) |
| 典型诱因 | - 单端口主存(取指+访存冲突) - 单 ALU/MUL | - add r1, r2, r3 → sub r4, r1, r5(RAW)- lw r1, 0(r2) → add r3, r1, r4 | - 条件转移(beq, bne)- 函数调用/返回 - 中断 |
| 主要解决方案 | - 增加硬件资源(如双端口存储器) - 分时复用 | - 数据旁路(转发) - 插入气泡(stall) - 编译器调度 | - 分支预测(静态/动态) - 延迟槽(MIPS) - 提前计算分支条件 |
| 是否可彻底消除 | ✅ 可通过增加资源基本消除 | ⚠️ RAW 可大幅缓解,但 lw 类依赖仍需停顿 | ❌ 无法完全消除,只能降低预测失败损失 |
| 408 考查重点 | - 概念辨析(是否属于三大冒险) - 资源冲突判断 | - 数据旁路机制 - lw 后立即使用的阻塞- RAW 判断 | - 分支导致的流水线清空周期数 - 控制相关 vs 条件转移辨析 |
| 考场优先级 | ⭐⭐ | ⭐⭐⭐⭐(最高) | ⭐⭐⭐ |
5.1.5.2 联系
均会造成流水线阻塞:三者都是流水线效率下降的核心原因,都会导致流水线停顿、插入空泡或清空,降低系统性能。
可同时存在:一个流水线程序中,可能同时出现数据相关和控制相关,资源冲突也可能叠加出现,需要综合解决方案。
优化手段相互独立:数据旁路只能解决数据相关,无法处理资源冲突和控制相关;转移预测只针对控制相关,对另外两类阻塞无效。
5.2 数据旁路
5.2.1 基本概念
数据旁路(Data Forwarding),也称作数据直通、数据转发,是指令流水线中专门用于解决数据相关(主要是 RAW 写后读)阻塞的硬件优化技术。
它的核心原理:不等待前序指令完成写回(WB)阶段,直接将执行单元(EX/MEM)的运算结果,通过专用硬件通路,转发给后续需要该数据的指令,从而避免流水线插入空泡、消除因 RAW 数据相关带来的阻塞。
数据旁路不会改变指令的执行结果,仅优化流水线的执行时序,是现代 CPU 流水线的标配硬件机制,也是 408 选择题的高频考点。
5.2.2 性质特征
-
硬件层面的优化技术
旁路是依靠 CPU 内部新增的专用数据通路、多路选择器实现的,属于硬件方案,无需修改程序或汇编代码,对汇编程序员完全透明。
-
针对性解决 RAW 型数据相关
数据旁路的主要、核心适用场景是解决RAW(写后读)数据相关。对于 WAR(读后写)、WAW(写后写)相关,在经典有序发射、顺序写回的流水线中,本身不会产生实际阻塞,旁路技术一般不做针对性处理。
-
无法消除所有流水线阻塞
数据旁路仅能解决数据相关,完全不能处理资源冲突(结构冒险)和控制相关(控制冒险)。条件转移、硬件资源竞争导致的阻塞,无法通过旁路技术缓解。
-
存在无法处理的特殊场景
当数据依赖的延迟过大时,数据旁路也无法完全消除阻塞。
- 典型场景:后续指令需要的结果来自访存(MEM)阶段(如 Load 指令从内存读取数据),而不是 ALU 的执行(EX)阶段。此时受限于硬件时序,仍可能需要插入 1 个周期的阻塞。
-
不会引发流水线阻塞
旁路是消除阻塞的方案,而非阻塞的诱因。这是 408 最经典的命题陷阱,也是 2010-19 题的核心考点。任何情况下,数据旁路都不会导致流水线停顿、插入空泡。
5.2.3 工作原理(以五级流水线为例)
标准五级流水线阶段:
IF(取指) → ID(译码) → EX(执行) → MEM(访存) → WB(写回)
🔁 典型场景:add → sub
ADD R1, R2, R3 ; R1 = R2 + R3
SUB R4, R1, R5 ; R4 = R1 - R5
❌ 无旁路时:
ADD在 WB 阶段才将 R1 写回寄存器SUB在 ID 阶段需读 R1,但此时 R1 仍是旧值 → 必须停顿 2 周期
✅ 有旁路时:
- 控制单元在 ID 阶段检测到
SUB依赖ADD的结果 - 在 EX 阶段,
ADD的 ALU 输出(即 R1 新值)不写回寄存器,而是直接通过旁路通路送入SUB的 ALU 输入端 - → 无需停顿,流水线连续执行
💡 旁路路径示例:
- EX/MEM.ALUOutput → EX 阶段 ALU 输入(解决 EX→EX 依赖)
- MEM/WB.ALUOutput → EX 阶段 ALU 输入(解决 MEM→EX 依赖)
5.2.4 典型场景与例外
✅ 可被旁路解决的场景
| 指令序列 | 是否可旁路 | 说明 |
|---|---|---|
add r1, r2, r3 → sub r4, r1, r5 | ✅ 是 | ALU 结果在 EX 阶段可用,可直接转发 |
and r1, r2, r3 → or r4, r1, r5 | ✅ 是 | 同上 |
❌ 无法旁路的场景(408 高频考点!)
| 指令序列 | 是否可旁路 | 原因 |
|---|---|---|
lw r1, 0(r2) → add r3, r1, r4 | ❌ 否 | lw 的数据在 MEM 阶段末才从内存读出,而 add 在 EX 阶段就需要操作数 → 必须插入 1 个气泡 |
lw r1, 0(r2) → beq r1, r3, label | ❌ 否 | 分支判断需 r1 值,但 r1 尚未加载 → 需 stall |
📌 口诀:
“ALU 指令可转发,Load 之后必停顿!”
六 考点跟踪
| 年份 | 题号 | 考查内容 | CSDN 参考链接 | VX参考链接 |
|---|---|---|---|---|
| 2010 | 第19题 | 流水线阻塞 | ||
| 2016 | 第19题 | 数据冒险 | ||
| 2019 | 第18题 | 数据冒险 | ||
| 2023 | 第19题 | 流水线阻塞 | ||
| 2024 | 第19题 | 数据冒险 |
说明:本文内容基于公开资料整理,参考了包括但不限于《数据结构》(严蔚敏)、《计算机操作系统》(汤小丹)、《计算机网络》(谢希仁)、《计算机组成原理》(唐朔飞)等国内高校经典教材,以及其他国际权威著作。同时,借鉴了王道、天勤、启航等机构出版的计算机专业考研辅导系列丛书中的知识体系框架与典型题型分析思路。文中所有观点、例题解析及文字表述均为作者结合自身理解进行的归纳与重述,未直接复制任何出版物原文。内容仅用于学习交流,若有引用不当或疏漏之处,敬请指正。
975

被折叠的 条评论
为什么被折叠?



