7.6 流水线技术
流水线技术是将一个重复的过程分解为若干个子过程,每个子过程由专门的功能部件来实现。通过让多个任务在时间上重叠,并行处理,从而提高系统吞吐率。
7.6.1 基本概念
定义
流水线技术:将一个重复的过程分解为若干个子过程(段),每个子过程由专门的功能部件来实现,通过让多个任务在时间上重叠执行,实现并行处理。
工作原理
- 将指令执行过程划分为多个独立的阶段
- 不同指令的不同阶段在时间上重叠执行
- 每个阶段由专门的功能部件处理
典型指令流水线阶段
- IF (Instruction Fetch):取指令
- ID (Instruction Decode):译码
- EX (Execute):执行
- MEM (Memory Access):访存
- WB (Write Back):写回
7.6.2 主要性能指标
1. 吞吐率 (Throughput, TP)
定义:单位时间内流水线完成的任务数量
基本公式:
其中:
:任务数量 :完成n个任务的总时间
详细公式推导:
对于
段流水线,设每段的时间为 ,时钟周期为 (瓶颈段时间)。 完成
个任务的总时间为: 因此,吞吐率为:
理想情况:当流水线充满后(
),每个时钟周期完成一个任务 实际吞吐率(考虑流水线建立时间):
当
时, 计算示例:
假设一个5段流水线(IF、ID、EX、MEM、WB),每段时间为:
, , , , 。 - 时钟周期:
(瓶颈在EX段) - 完成10个任务的总时间:
- 吞吐率:
- 理想吞吐率:
- 时钟周期:
2. 加速比 (Speedup, S)
定义:不使用流水线与使用流水线所花时间的比值
基本公式:
详细公式推导:
对于
段流水线,完成一个任务的时间为: - 非流水线:
- 流水线:
(完成 个任务)
因此,加速比为:
其中
。 - 非流水线:
理想情况:当
且各段时间相等( )时 实际加速比(考虑瓶颈段):
当各段时间不相等时,加速比会小于
。 计算示例:
继续使用上面的5段流水线例子:
- 非流水线完成10个任务:
- 流水线完成10个任务:
(已计算) - 加速比:
- 理想加速比(如果各段时间相等为3ns):
可以看出,由于存在瓶颈段(EX段为3ns),实际加速比小于理想值。
- 非流水线完成10个任务:
3. 效率 (Efficiency, E)
定义:流水线中各功能段的设备利用率,反映流水线硬件的利用程度
基本公式:
详细公式推导:
在时空图中:
个任务占用的时空区 = 个段占用的总时空区 =
因此,效率为:
简化公式(当各段时间相等,
): 效率与吞吐率、加速比的关系:
其中
为加速比, 为吞吐率。 理想情况:当
且各段时间相等时 计算示例:
继续使用5段流水线例子:
, , , - 效率:
- 如果各段时间相等为3ns:
可以看出,瓶颈段的存在降低了效率。
4. 流水线性能指标之间的关系
吞吐率、加速比、效率的关系:
其中:
:效率 :加速比 :流水线段数 :吞吐率 :非流水线完成一个任务的时间
综合性能公式:
当
时: 性能优化目标:
- 最大化吞吐率:
(减小瓶颈段时间) - 最大化加速比:
(各段时间相等) - 最大化效率:
(流水线充满且无冲突)
- 最大化吞吐率:
7.6.3 指令流水线的相关性问题(冲突/冒险)
流水线技术虽然能提高性能,但也会带来相关问题(Hazard),需要采用相应的解决方案。
1. 结构相关 (Structural Hazard)
定义
因硬件资源冲突导致流水线无法正常执行。
产生原因
- 多条指令同时访问同一硬件资源
- 例如:指令存储器和数据存储器共享同一物理存储器
示例
| 时钟周期 | 指令₁ | 指令₂ | 指令₃ |
|---|---|---|---|
| 1 | IF | - | - |
| 2 | ID | IF | - |
| 3 | EX | ID | IF |
| 4 | MEM | EX | ID |
| 5 | WB | MEM | EX |
冲突:指令₁和指令₂在第4个时钟周期同时访问存储器(结构相关)
解决方案
插入暂停周期(阻塞/Stall):
- 当发生资源冲突时,暂停后续指令的执行
- 简单但效率低
增加硬件资源:
- 分离的指令存储器和数据存储器(哈佛结构)
- 增加功能部件(如多个ALU)
2. 数据相关 (Data Hazard)
定义
后续指令需要使用前面指令的计算结果,但该结果尚未产生。
类型
RAW (Read After Write):写后读相关
- 后续指令需要读取前面指令写入的数据
- 最常见的数据相关类型
WAR (Write After Read):读后写相关
- 后续指令要写入前面指令读取的数据
- 在乱序执行中可能出现
WAW (Write After Write):写后写相关
- 两条指令都要写入同一寄存器
- 在乱序执行中可能出现
示例(RAW相关)
| 时钟周期 | ADD | SUB |
|---|---|---|
| 1 | IF | - |
| 2 | ID | IF |
| 3 | EX | ID |
| 4 | MEM | EX |
| 5 | WB | MEM |
冲突:SUB在EX阶段需要ADD的结果,但ADD在WB阶段才写回(数据相关:RAW)
解决方案
阻塞流水线(Stall):
- 插入空操作(NOP)或暂停流水线
- 简单但会降低性能
旁路/转发 (Bypassing/Forwarding):
- 将计算结果从其产生的功能单元直接传送到需要它的其他功能单元
- 不需要等待写回阶段
- 这是最常用的解决方案
指令重排序:
- 编译器或硬件重新安排指令顺序
- 在相关指令之间插入无关指令
3. 控制相关 (Control Hazard)
定义
由转移指令(分支、跳转)引起,当流水线无法确定下一条要执行的指令地址时发生。
产生原因
- 转移指令的执行结果(是否跳转、跳转地址)在流水线后期才能确定
- 但流水线已经预取了后续指令
示例
| 时钟周期 | BEQ | ADD |
|---|---|---|
| 1 | IF | - |
| 2 | ID | IF |
| 3 | EX | ID |
| 4 | MEM | EX |
| 5 | WB | MEM |
冲突:BEQ是否跳转在EX阶段才确定,但ADD已经在IF阶段被取入(控制相关)
分支预测性能分析:
设分支指令的预测准确率为
考虑分支预测后的吞吐率:
其中
解决方案
阻塞流水线:
- 等待转移指令结果确定后再继续
- 简单但效率低
分支预测 (Branch Prediction):
- 静态预测:总是预测不跳转(或总是跳转)
- 动态预测:根据历史信息预测(如分支历史表BHT)
- 预测正确时性能好,预测错误时需要清空流水线
延迟槽 (Delay Slot):
- 在转移指令后安排一条总是执行的指令
- 充分利用流水线
多路预测:
- 同时取两条路径的指令
- 确定路径后丢弃错误的路径
7.6.4 流水线性能优化
1. 增加流水线深度
- 将指令执行划分为更多阶段
- 可以提高时钟频率
- 但会增加相关性问题
2. 超标量技术
- 每个时钟周期发射多条指令
- 需要多个功能部件
- 需要更复杂的相关检测和解决机制
3. 乱序执行
- 允许指令不按程序顺序执行
- 需要更复杂的硬件支持
- 可以更好地利用硬件资源
💡 学习要点与重难点标注
性能指标(★必须背公式)
1. 吞吐率 (TP)
- 定义:单位时间完成的任务数
- 公式:
- 最大吞吐率:
(其中 为时钟周期)
2. 加速比 (S)
- 定义:不使用流水线时间 / 使用流水线时间
- 公式:
- 理想情况:
段流水线的加速比趋近于
3. 效率 (E)
- 定义:时空图中任务面积 / 总面积
- 公式:
三大冒险/相关 (Hazards)(★重点分析题)
1. 结构相关
- 原因:资源冲突(如同时访问内存)
- 解决:增加硬件(指令Cache和数据Cache分离)
2. 数据相关
- 类型:
- RAW(写后读):最常见
- WAR(读后写):乱序执行中可能出现
- WAW(写后写):乱序执行中可能出现
- 解决:
- 旁路技术 (Forwarding/Bypassing):最常用
- 暂停 (Stall)
3. 控制相关
- 原因:遇到跳转/分支指令
- 解决:
- 分支预测(静态/动态)
- 延迟槽
- 多路预测
流水线部分的"瓶颈"
老师未明说的"潜台词":
课件中提到"瓶颈段",老师的意思是:木桶效应。流水线的时钟周期取决于最慢的那一段。做计算题时,一定要找那个时间最长的段作为标准周期
。
总结
流水线技术通过将指令执行过程划分为多个阶段并让不同指令的不同阶段重叠执行,显著提高了处理器的吞吐率。主要性能指标包括吞吐率、加速比和效率。流水线技术也会带来结构相关、数据相关和控制相关等问题,需要采用相应的解决方案。现代处理器通过分支预测、旁路技术、超标量技术等多种方法进一步优化流水线性能。