CPU流水线
CPU 流水线
1. 指令流水线基本概念
流水线原理
基本思想:
- 将指令执行分解为多个阶段
- 不同指令的不同阶段可以并行执行
- 提高 CPU 的吞吐量
流水线优势:
- 提高吞吐量:多条指令并行执行
- 提高 CPU 利用率:减少空闲时间
- 提高性能:在相同主频下提高性能
流水线阶段
五级流水线:
- 取指(IF):从内存取指令
- 译码(ID):分析指令,读取操作数
- 执行(EX):执行运算
- 访存(MEM):访问内存
- 写回(WB):写回结果
流水线寄存器:
- IF/ID 寄存器:存储取指和译码间的数据
- ID/EX 寄存器:存储译码和执行间的数据
- EX/MEM 寄存器:存储执行和访存间的数据
- MEM/WB 寄存器:存储访存和写回间的数据
2. 流水线实现
基本流水线结构
数据通路:
- 各阶段独立的数据通路
- 流水线寄存器连接各阶段
- 控制信号协调各阶段工作
控制逻辑:
- 流水线控制单元
- 冒险检测单元
- 流水线暂停和刷新逻辑
流水线时序
时钟同步:
- 所有流水线寄存器同步更新
- 每个时钟周期推进一个阶段
- 保证数据一致性
流水线填充:
- 流水线启动时需要多个周期
- 流水线排空时也需要多个周期
- 影响短程序的性能
3. 流水线冒险
数据冒险
基本概念:
- 后续指令需要前面指令的结果
- 但结果还未写回寄存器
- 导致数据依赖冲突
类型:
- RAW(读后写):最严重的数据冒险
- WAR(写后读):在乱序执行中可能出现
- WAW(写后写):在乱序执行中可能出现
解决方法:
- 数据转发:将结果直接转发给后续指令
- 流水线暂停:暂停后续指令直到数据就绪
- 寄存器重命名:避免假的数据依赖
控制冒险
基本概念:
- 分支指令改变程序执行顺序
- 流水线中已取出的指令可能无效
- 需要清空流水线重新取指
影响:
- 性能损失:清空流水线造成性能损失
- 预测错误:分支预测错误时损失更大
- 延迟槽:某些架构使用延迟槽减少损失
解决方法:
- 分支预测:预测分支方向
- 延迟槽:在分支指令后填充有用指令
- 投机执行:按预测方向执行指令
结构冒险
基本概念:
- 多个指令需要同一硬件资源
- 资源冲突导致流水线暂停
- 硬件资源不足
常见冲突:
- 内存访问冲突:多个指令同时访问内存
- ALU 冲突:多个指令同时使用 ALU
- 寄存器端口冲突:多个指令同时访问寄存器
解决方法:
- 增加资源:增加 ALU、内存端口等
- 流水线暂停:暂停冲突的指令
- 资源调度:合理安排指令执行顺序
4. 流水线优化
数据转发技术
基本概念:
- 将运算结果直接转发给后续指令
- 避免等待写回阶段
- 减少数据冒险的影响
转发路径:
- EX/MEM → EX:执行阶段转发
- MEM/WB → EX:访存阶段转发
- MEM/WB → ID:写回阶段转发
转发条件:
- 源寄存器与目标寄存器相同
- 前一条指令会写回该寄存器
- 后续指令需要读取该寄存器
分支预测
静态预测:
- 总是预测不跳转:适用于循环结构
- 总是预测跳转:适用于条件分支
- 基于方向的预测:根据分支方向预测
动态预测:
- 一位预测器:记录上次预测结果
- 两位饱和计数器:更稳定的预测
- 全局历史预测器:考虑全局分支历史
高级预测:
- 分支目标缓冲器(BTB):缓存分支目标地址
- 返回地址栈(RAS):预测函数返回地址
- 混合预测器:结合多种预测方法
乱序执行
基本概念:
- 指令不按程序顺序执行
- 根据数据依赖关系执行
- 提高指令级并行度
实现方式:
- 保留站:存储等待执行的指令
- 重排序缓冲区(ROB):维护指令执行顺序
- 寄存器重命名:避免假的数据依赖
优势:
- 提高并行度:充分利用硬件资源
- 减少停顿:减少数据冒险的影响
- 提高性能:显著提高 CPU 性能
5. 超标量流水线
基本概念
超标量:
- 每个时钟周期发射多条指令
- 多个功能单元并行工作
- 提高指令级并行度
发射宽度:
- 每个周期可以发射的指令数
- 2 发射、4 发射、8 发射等
- 影响硬件复杂度和性能
实现技术
多发射:
- 静态多发射:编译器安排指令发射
- 动态多发射:硬件动态调度指令
- 混合多发射:结合静态和动态方法
功能单元:
- 多个 ALU:并行执行算术运算
- 多个内存单元:并行访问内存
- 专用单元:浮点运算、向量运算等
指令调度:
- 寄存器重命名:避免假的数据依赖
- 保留站调度:动态调度指令执行
- 乱序执行:不按程序顺序执行
6. 流水线性能分析
性能指标
吞吐量:
- 每个时钟周期完成的指令数
- 理想情况下等于流水线级数
- 实际受冒险影响
CPI(每条指令时钟周期数):
- 平均每条指令需要的时钟周期
- 理想情况下 CPI = 1
- 实际 CPI > 1
加速比:
- 流水线相对于非流水线的性能提升
- 理想情况下等于流水线级数
- 实际受冒险影响
性能优化
减少冒险:
- 优化数据转发
- 改进分支预测
- 增加硬件资源
提高并行度:
- 增加发射宽度
- 增加功能单元
- 优化指令调度
编译器优化:
- 指令重排序
- 循环展开
- 软件流水线
练习题
练习 1
什么是指令流水线?其优点是什么?
参考答案
指令流水线:
- 将指令执行分解为多个阶段
- 不同指令的不同阶段可以并行执行
- 提高 CPU 的吞吐量
优点:
-
提高吞吐量:
- 多条指令并行执行
- 理想情况下吞吐量等于流水线级数
- 显著提高 CPU 性能
-
提高 CPU 利用率:
- 减少 CPU 空闲时间
- 充分利用硬件资源
- 提高整体效率
-
提高性能:
- 在相同主频下提高性能
- 减少每条指令的平均执行时间
- 提高系统响应速度
-
支持复杂指令:
- 复杂指令分解为简单阶段
- 便于实现复杂功能
- 保持硬件简单性
-
便于优化:
- 各阶段可以独立优化
- 支持多种优化技术
- 便于性能调优
练习 2
硬布线控制器与微程序控制器有何区别?
参考答案
硬布线控制器与微程序控制器的区别:
-
实现方式:
- 硬布线控制器:组合逻辑电路实现
- 微程序控制器:微指令序列实现
-
速度:
- 硬布线控制器:速度快,延迟小
- 微程序控制器:速度较慢,需要访存
-
灵活性:
- 硬布线控制器:灵活性差,修改困难
- 微程序控制器:灵活性高,易于修改
-
复杂度:
- 硬布线控制器:硬件复杂,设计困难
- 微程序控制器:硬件相对简单
-
应用场景:
- 硬布线控制器:RISC 处理器,追求速度
- 微程序控制器:CISC 处理器,追求灵活性
-
调试难度:
- 硬布线控制器:调试困难,难以观察内部状态
- 微程序控制器:调试相对容易,可以观察微指令执行
-
功耗:
- 硬布线控制器:功耗较高
- 微程序控制器:功耗相对较低