139 lines
4.8 KiB
Markdown
139 lines
4.8 KiB
Markdown
|
|
---
|
|||
|
|
tags:
|
|||
|
|
- 计算机系统结构
|
|||
|
|
- 复习
|
|||
|
|
- 流水线
|
|||
|
|
create time: 2026-06-15 10:00
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 流水线技术
|
|||
|
|
|
|||
|
|
## 概述
|
|||
|
|
|
|||
|
|
本文档系统讲解指令流水线的基本原理、冲突类型(结构/数据/控制)、流水线调度策略(预约表与冲突向量)以及时空图分析。流水线是提升处理器吞吐率的核心技术,也是历年考试的高频难点。
|
|||
|
|
|
|||
|
|
> [!tip] 考试重点
|
|||
|
|
> 流水线调度(预约表→禁止表→冲突向量→状态转移图)是分析题的核心考点,需完整掌握从预约表到最优调度策略的全过程。数据相关的三种类型(RAW/WAR/WAW)也常考。
|
|||
|
|
|
|||
|
|
## 正文
|
|||
|
|
|
|||
|
|
### 一、流水线基本概念
|
|||
|
|
|
|||
|
|
**核心思想**:将指令执行过程分成多个阶段(段),不同指令的不同阶段可以**重叠执行**,从而提高吞吐率。
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph LR
|
|||
|
|
A["IF: Fetch"] --> B["ID: Decode"] --> C["EX: Execute"] --> D["MEM: Memory"] --> E["WB: Write Back"]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**性能指标**:
|
|||
|
|
|
|||
|
|
| 指标 | 公式 | 说明 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| 吞吐率 | $TP = n / T_k$ | $n$ 个任务在 $T_k$ 时间内完成 |
|
|||
|
|
| 加速比 | $S = T_{seq} / T_k$ | 串行 vs 流水线 |
|
|||
|
|
| 效率 | $E = S / k$ | 流水线的利用率($k$ 为段数) |
|
|||
|
|
|
|||
|
|
### 二、流水线冲突
|
|||
|
|
|
|||
|
|
#### 2.1 结构冲突(Structural Hazard)
|
|||
|
|
|
|||
|
|
多条指令在同一时钟周期争用**同一硬件资源**。
|
|||
|
|
|
|||
|
|
> [!example] 典型场景
|
|||
|
|
> 指令和数据共用一个存储端口,取指和访存同时发生冲突。**解决方案**:分离指令 Cache 和数据 Cache。
|
|||
|
|
|
|||
|
|
#### 2.2 数据冲突(Data Hazard)
|
|||
|
|
|
|||
|
|
后续指令需要使用前面指令的运算结果,但结果尚未写回。
|
|||
|
|
|
|||
|
|
| 类型 | 全称 | 含义 | 示例 |
|
|||
|
|
|:----:|------|------|------|
|
|||
|
|
| **RAW** | Read After Write | 后读前写(真数据相关) | `ADD R1,... ; MOV R2,R1` |
|
|||
|
|
| **WAR** | Write After Read | 后写前读(反相关) | `MOV R2,R1 ; ADD R1,...` |
|
|||
|
|
| **WAW** | Write After Write | 后写前写(输出相关) | `ADD R1,... ; SUB R1,...` |
|
|||
|
|
|
|||
|
|
**解决方案**:
|
|||
|
|
|
|||
|
|
- **数据前推/旁路**(Forwarding):将结果直接从 EX/MEM 传递到下一条指令的 EX 输入
|
|||
|
|
- **插入气泡**(Stall):暂停流水线等待数据就绪
|
|||
|
|
- **编译器调度**:重排指令顺序避免冲突
|
|||
|
|
|
|||
|
|
> [!question] 定向传送(旁路)为什么不能完全消除数据冲突?
|
|||
|
|
> Load-use 冲突:从内存 Load 的数据在 EX 段结束时才可用,但下一条指令可能需要在 EX 段开始时就使用它,此时必须插入一个气泡。
|
|||
|
|
|
|||
|
|
#### 2.3 控制冲突(Control Hazard)
|
|||
|
|
|
|||
|
|
分支指令的执行结果决定后续取指方向,但在分支确定前已经预取了后续指令。
|
|||
|
|
|
|||
|
|
**解决方案**:
|
|||
|
|
|
|||
|
|
- **暂停**:等待分支结果确定后再取指(最简单但性能差)
|
|||
|
|
- **预测**:静态预测(总预测不跳转/总预测跳转)或动态预测(分支历史表)
|
|||
|
|
- **延迟分支**:在分支指令后填充一条必定执行的指令(延迟槽)
|
|||
|
|
|
|||
|
|
### 三、流水线调度(非线性流水线)
|
|||
|
|
|
|||
|
|
#### 3.1 预约表
|
|||
|
|
|
|||
|
|
记录一个任务在各时钟周期对各段的占用情况,是调度分析的起点。
|
|||
|
|
|
|||
|
|
#### 3.2 禁止表
|
|||
|
|
|
|||
|
|
从预约表中提取同一段被**两次以上占用**的时间间隔,构成禁止表 $F$。
|
|||
|
|
|
|||
|
|
#### 3.3 冲突向量
|
|||
|
|
|
|||
|
|
根据禁止表构建初始冲突向量 $C_0$:
|
|||
|
|
|
|||
|
|
- 冲突向量的第 $i$ 位为 1 表示间隔 $i$ 个周期不能进入新任务
|
|||
|
|
- 位数 = 最大禁止间隔
|
|||
|
|
|
|||
|
|
#### 3.4 状态转移图
|
|||
|
|
|
|||
|
|
对每个状态(冲突向量),计算允许的间隔 $j$ 对应的新状态:
|
|||
|
|
|
|||
|
|
$$C_{new} = SHR^{(j)}(C) \lor C_0$$
|
|||
|
|
|
|||
|
|
其中 $SHR^{(j)}$ 表示右移 $j$ 位,$\lor$ 表示按位或。
|
|||
|
|
|
|||
|
|
> [!example] 调度示例
|
|||
|
|
> 禁止表 $F = \{1, 3, 4, 6\}$,则 $C_0 = 101101$
|
|||
|
|
>
|
|||
|
|
> - $j=2$:$SHR^{(2)}(101101) \lor 101101 = 001011 \lor 101101 = 101111 = C_1$
|
|||
|
|
> - $j=5$:$SHR^{(5)}(101101) \lor 101101 = 000001 \lor 101101 = 101101 = C_0$
|
|||
|
|
>
|
|||
|
|
> 在 $C_1$ 状态:$j=2$ 得 $C_1$,$j=5$ 得 $C_0$
|
|||
|
|
|
|||
|
|
#### 3.5 最优调度策略
|
|||
|
|
|
|||
|
|
在状态转移图中找出所有**闭合回路**,计算每个回路的平均延迟:
|
|||
|
|
|
|||
|
|
$$\text{平均延迟} = \frac{\text{回路中各间隔之和}}{\text{回路长度}}$$
|
|||
|
|
|
|||
|
|
平均延迟最小的回路即为最优调度策略。
|
|||
|
|
|
|||
|
|
| 调度策略 | 平均延迟 |
|
|||
|
|
|:--------:|:--------:|
|
|||
|
|
| (5) | 5 |
|
|||
|
|
| (2, 5) | 3.5 |
|
|||
|
|
| (2, 7) | 4.5 |
|
|||
|
|
|
|||
|
|
最优策略为 **(2, 5)**,平均延迟 3.5 拍。
|
|||
|
|
|
|||
|
|
### 四、时空图分析
|
|||
|
|
|
|||
|
|
时空图是分析流水线性能的直观工具,横轴为时间(时钟周期),纵轴为流水线段或功能部件。
|
|||
|
|
|
|||
|
|
**绘图步骤**:
|
|||
|
|
|
|||
|
|
1. 确定每个任务的各段执行时间
|
|||
|
|
2. 根据调度策略确定任务间的间隔
|
|||
|
|
3. 注意数据相关的约束(无定向传送时需插入气泡)
|
|||
|
|
4. 计算总完成时间和吞吐率
|
|||
|
|
|
|||
|
|
## 关联笔记
|
|||
|
|
- [[计算机系统结构/复习文档/计算机系统结构基础与定量原理]]
|
|||
|
|
- [[计算机系统结构/复习文档/存储系统与Cache]]
|
|||
|
|
- [[计算机系统结构/index|试题册索引]]
|