logo
导航

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 的吞吐量

优点

  1. 提高吞吐量

    • 多条指令并行执行
    • 理想情况下吞吐量等于流水线级数
    • 显著提高 CPU 性能
  2. 提高 CPU 利用率

    • 减少 CPU 空闲时间
    • 充分利用硬件资源
    • 提高整体效率
  3. 提高性能

    • 在相同主频下提高性能
    • 减少每条指令的平均执行时间
    • 提高系统响应速度
  4. 支持复杂指令

    • 复杂指令分解为简单阶段
    • 便于实现复杂功能
    • 保持硬件简单性
  5. 便于优化

    • 各阶段可以独立优化
    • 支持多种优化技术
    • 便于性能调优

练习 2

硬布线控制器与微程序控制器有何区别?

参考答案

硬布线控制器与微程序控制器的区别:

  1. 实现方式

    • 硬布线控制器:组合逻辑电路实现
    • 微程序控制器:微指令序列实现
  2. 速度

    • 硬布线控制器:速度快,延迟小
    • 微程序控制器:速度较慢,需要访存
  3. 灵活性

    • 硬布线控制器:灵活性差,修改困难
    • 微程序控制器:灵活性高,易于修改
  4. 复杂度

    • 硬布线控制器:硬件复杂,设计困难
    • 微程序控制器:硬件相对简单
  5. 应用场景

    • 硬布线控制器:RISC 处理器,追求速度
    • 微程序控制器:CISC 处理器,追求灵活性
  6. 调试难度

    • 硬布线控制器:调试困难,难以观察内部状态
    • 微程序控制器:调试相对容易,可以观察微指令执行
  7. 功耗

    • 硬布线控制器:功耗较高
    • 微程序控制器:功耗相对较低