跳转至

流水线技术

概述

流水线技术是提高CPU性能的重要技术,它通过将指令执行过程划分为多个阶段,使多条指令的不同阶段可以并行执行,从而提高CPU的吞吐率。

流水线的基本原理

流水线的核心思想

将一个重复的时序过程分解为若干个子过程,每个子过程可以有效地与其他子过程并行执行。

时空图

流水线时空图示例

时间:  1   2   3   4   5   6   7   8
指令1: IF  ID  EX  MEM WB
指令2:     IF  ID  EX  MEM WB
指令3:         IF  ID  EX  MEM WB
指令4:             IF  ID  EX  MEM WB
指令5:                 IF  ID  EX  MEM WB
    

说明:

  • IF: 取指 (Instruction Fetch)
  • ID: 译码 (Instruction Decode)
  • EX: 执行 (Execute)
  • MEM: 访存 (Memory Access)
  • WB: 写回 (Write Back)

经典的五级流水线

graph LR
    A[IF<br/>取指] --> B[ID<br/>译码]
    B --> C[EX<br/>执行]
    C --> D[MEM<br/>访存]
    D --> E[WB<br/>写回]
    
    style A fill:#e1f5ff
    style B fill:#fff4e1
    style C fill:#ffe1f5
    style D fill:#e1ffe1
    style E fill:#f5e1ff

各阶段的功能

1. 取指阶段 (IF)

功能:
  • 从指令Cache取指令
  • PC + 4 → PC (假设指令长度为4字节)

操作:

Text Only
IR ← Mem[PC]
PC ← PC + 4

2. 译码阶段 (ID)

功能:
  • 指令译码
  • 读寄存器操作数

操作:

Text Only
A ← Reg[rs]
B ← Reg[rt]

3. 执行阶段 (EX)

功能:
  • ALU运算
  • 计算有效地址

操作:

Text Only
1
2
3
ALUOut ← A op B
ALUOut ← A + imm

4. 访存阶段 (MEM)

功能:
  • 访问数据Cache
  • 读或写存储器

操作:

Text Only
1
2
3
LMD ← Mem[ALUOut]  (Load)
Mem[ALUOut] ← B    (Store)

5. 写回阶段 (WB)

功能:
  • 将结果写回寄存器

操作:

Text Only
1
2
3
Reg[rd] ← ALUOut  (ALU指令)
Reg[rt] ← LMD     (Load指令)

流水线的性能指标

1. 吞吐率 (Throughput)

吞吐率

单位时间内流水线完成的指令数。

公式:

Text Only
TP = n / T

其中: - n: 完成的指令数 - T: 完成n条指令所需的时间

最大吞吐率:

Text Only
TPmax = 1 / Δt

其中 Δt 为流水线时钟周期。

2. 加速比 (Speedup)

加速比

流水线方式与串行方式的速度比。

公式:

Text Only
S = T串行 / T流水线

理想加速比:

Text Only
S = k (流水线级数)

3. 效率 (Efficiency)

效率

流水线各段的利用率。

公式:

Text Only
E = n个任务占用的时空区 / k个段的总时空区
E = S / k

流水线冲突

流水线冲突

流水线冲突会降低流水线的性能,需要妥善处理。

1. 结构冲突 (Structural Hazard)

原因: 硬件资源冲突

示例: 多条指令同时访问存储器

解决方法:

  • 指令Cache和数据Cache分离
  • 增加硬件资源
  • 指令暂停等待

2. 数据冲突 (Data Hazard)

原因: 数据依赖关系

类型:

RAW (Read After Write)

Text Only
ADD R1, R2, R3
SUB R4, R1, R5    // 需要R1的结果

WAR (Write After Read)

Text Only
SUB R4, R1, R5
ADD R1, R2, R3    // 需要先读R1

WAW (Write After Write)

Text Only
ADD R1, R2, R3
SUB R1, R4, R5    // 两条指令都写R1

解决方法:

  • 暂停: 插入气泡周期
  • 转发(旁路): 直接传送结果
  • 乱序执行: 调整执行顺序

3. 控制冲突 (Control Hazard)

原因: 转移指令引起

示例:

Text Only
BEQ R1, R2, Label  // 条件转移
ADD R3, R4, R5     // 下条指令不确定

解决方法:

  • 分支预测: 预测转移方向
  • 延迟槽: 在转移指令后插入有用指令
  • 预取: 预取两个分支的指令

流水线的实现

简单流水线的数据通路

graph TB
    subgraph IF阶段
        PC[PC] --> IM[指令存储器]
        IM --> IR[IR]
    end
    
    subgraph ID阶段
        IR --> ID[译码器]
        ID --> RF[寄存器堆]
    end
    
    subgraph EX阶段
        RF --> ALU[ALU]
    end
    
    subgraph MEM阶段
        ALU --> DM[数据存储器]
    end
    
    subgraph WB阶段
        DM --> RF
    end

流水线寄存器

流水线寄存器

流水线各阶段之间需要寄存器保存中间结果。

主要流水线寄存器:

  • IF/ID: 保存取指阶段的结果
  • ID/EX: 保存译码阶段的结果
  • EX/MEM: 保存执行阶段的结果
  • MEM/WB: 保存访存阶段的结果

超标量流水线

超标量技术

在一个时钟周期内发射多条指令。

特点:

  • 多个执行单元
  • 每周期发射多条指令
  • 动态调度
  • 乱序执行

示例:

Text Only
1
2
3
周期1: 发射指令1, 2, 3
周期2: 发射指令4, 5, 6
...

参考资料