Files
final-exam/计算机系统结构/重点复习/大题3-非线性流水线调度.md

271 lines
9.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags:
- 计算机系统结构
- 重点复习
- 流水线
- 非线性流水线
- 调度
create time: 2026-06-16 21:21
---
# 大题 3 — 非线性流水线调度
## 概述
本题考查**非线性流水线的调度**全过程:从**预约表**出发,提取**禁止表**、构建**冲突向量**、画出**状态转移图**、求**最优调度策略**,最后画**时空图**并计算**性能指标**(吞吐率、加速比、效率)。这是本课程**分值最高、难度最大**的核心考点。
> [!tip] 考试重点
> 这道题几乎每年必考(A 卷 24 分、B 卷 16 分),务必完整掌握以下流程:
> **预约表 → 禁止表 → 冲突向量 → 状态转移图 → 最优调度 → 时空图 → 性能计算**
## 正文
### 一、完整解题流程
```mermaid
graph TD
A["Step 0: Reservation Table"] --> B["Step 1: Forbidden Set F"]
B --> C["Step 2: Initial Collision Vector C0"]
C --> D["Step 3: State Transition Diagram"]
D --> E["Step 4: Find Optimal Schedule"]
E --> F["Step 5: Space-Time Diagram"]
F --> G["Step 6: Performance Metrics"]
style A fill:#e3f2fd
style G fill:#e8f5e9
```
### 二、Step 0:预约表(Reservation Table)
预约表记录**一个任务**在各时钟周期对各流水段的占用情况。`x` 表示占用,空表示空闲。
> [!question] 预约表从哪来?
> 预约表由任务的**执行过程**决定——它描述了单个任务在流水线中的资源使用模式。考试中预约表直接给出,不需要自己推导。
### 三、Step 1:提取禁止表 $F$
**规则**:对预约表中的**每一行**(每个流水段),找出该段被占用的所有时刻,计算每两个时刻之间的**时间间隔**,所有间隔的集合就是禁止表。
$$F = \{d \mid \exists \text{某段在时刻 } t_1 \text{ 和 } t_2 \text{ 被占用,且 } d = |t_2 - t_1|\}$$
> [!warning] 注意
> - 只看**同一段**的多个占用时刻,不同段之间不比较
> - 间隔取**绝对值**
> - **去重**——相同的间隔只保留一个
### 四、Step 2:构建初始冲突向量 $C_0$
冲突向量是一个**二进制位串**,第 $i$ 位为 1 表示间隔 $i$ 禁止进入新任务。
$$C_0[j] = \begin{cases} 1 & \text{if } j \in F \\ 0 & \text{if } j \notin F \end{cases}$$
**位数** = 禁止表中的**最大间隔**值。
> [!example] 示例:禁止表 $F = \{2, 4\}$
>
> 最大禁止间隔为 4,冲突向量共 4 位:
>
> | 位位置 | 4 | 3 | 2 | 1 |
> |:------:|:-:|:-:|:-:|:-:|
> | 值 | 1 | 0 | 1 | 0 |
>
> $C_0 = 1010$
>
> 含义:间隔 1 和 3 允许(位为 0),间隔 2 和 4 禁止(位为 1)。
### 五、Step 3:画状态转移图
对每个状态(冲突向量),找出**允许的间隔** $j$(对应位为 0),计算转移后的新状态:
$$C_{new} = SHR^{(j)}(C_{current}) \lor C_0$$
其中 $SHR^{(j)}$ 表示**右移 $j$ 位**(高位补 0),$\lor$ 表示**按位或**。
**重复这个过程**直到所有可达状态都被探索。
> [!note] 状态转移的直觉理解
> - **右移 $j$ 位**:相当于"过了 $j$ 拍后,之前禁止的间隔距离缩短了 $j$"
> - **或上 $C_0$**:新进入的任务带来了与第一个任务相同的禁止间隔
> - 当所有位都为 1 时,该状态为**终态**——无法再进入新任务
### 六、Step 4:求最优调度策略
在状态转移图中找出所有**闭合回路**(从某状态出发回到自身),计算每个回路的**平均延迟**:
$$\text{平均延迟} = \frac{\text{回路中各间隔之和}}{\text{回路长度(间隔个数)}}$$
**平均延迟最小的回路**即为最优调度策略。
> [!important] 找回路的技巧
> 1. 从初始状态 $C_0$ 出发
> 2. 列出所有可能的转移路径
> 3. 找到回到 $C_0$ 的所有回路
> 4. 比较各回路的平均延迟
> 5. 注意:回路可以重复——如 (3, 2, 3, 2, ...) 只需取最小循环单元 (3, 2)
### 七、完整例题(参考 A 卷 24 分大题)
> [!example] 例题:4 段流水线调度
>
> **已知**预约表如下:
>
> | 段 \ 时刻 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
> |:----------:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
> | $S_1$ | x | | | | x | | |
> | $S_2$ | | x | | | | x | |
> | $S_3$ | | | x | | | | x |
> | $S_4$ | | | | x | | | |
>
> ---
>
> **Step 1:提取禁止表**
>
> | 段 | 占用时刻 | 间隔 |
> |:--:|:--------:|:----:|
> | $S_1$ | 1, 5 | $5-1=4$ |
> | $S_2$ | 2, 6 | $6-2=4$ |
> | $S_3$ | 3, 7 | $7-3=4$ |
> | $S_4$ | 4 | 无间隔 |
>
> $$F = \{4\}$$
>
> ---
>
> **Step 2:构建初始冲突向量**
>
> 最大禁止间隔 = 4,冲突向量 4 位:
>
> $$C_0 = 1000$$
>
> | 位位置 | 4 | 3 | 2 | 1 |
> |:------:|:-:|:-:|:-:|:-:|
> | 值 | 1 | 0 | 0 | 0 |
>
> 允许间隔:$j \in \{1, 2, 3\}$
>
> ---
>
> **Step 3:计算状态转移**
>
> 从 $C_0 = 1000$ 出发:
>
> - $j=1$:$SHR^{(1)}(1000) \lor 1000 = 0100 \lor 1000 = 1100 = C_1$
> - $j=2$:$SHR^{(2)}(1000) \lor 1000 = 0010 \lor 1000 = 1010 = C_2$
> - $j=3$:$SHR^{(3)}(1000) \lor 1000 = 0001 \lor 1000 = 1001 = C_3$
>
> 从 $C_1 = 1100$(允许间隔 $j \in \{1, 2\}$,注意第 1 位和第 2 位为 0):
>
> 等等,$C_1 = 1100$,第 1 位=0,第 2 位=0,所以允许 $j=1, 2$。
>
> - $j=1$:$SHR^{(1)}(1100) \lor 1000 = 0110 \lor 1000 = 1110 = C_4$
> - $j=2$:$SHR^{(2)}(1100) \lor 1000 = 0011 \lor 1000 = 1011 = C_5$
>
> 从 $C_2 = 1010$(允许间隔 $j \in \{1, 3\}$):
>
> - $j=1$:$SHR^{(1)}(1010) \lor 1000 = 0101 \lor 1000 = 1101 = C_6$
> - $j=3$:$SHR^{(3)}(1010) \lor 1000 = 0001 \lor 1000 = 1001 = C_3$
>
> 从 $C_3 = 1001$(允许间隔 $j \in \{2, 3\}$):
>
> - $j=2$:$SHR^{(2)}(1001) \lor 1000 = 0010 \lor 1000 = 1010 = C_2$
> - $j=3$:$SHR^{(3)}(1001) \lor 1000 = 0001 \lor 1000 = 1001 = C_3$(自环)
>
> 从 $C_4 = 1110$(允许间隔 $j=1$):
>
> - $j=1$:$SHR^{(1)}(1110) \lor 1000 = 0111 \lor 1000 = 1111 = C_7$(终态)
>
> 从 $C_5 = 1011$(允许间隔 $j=2$):
>
> - $j=2$:$SHR^{(2)}(1011) \lor 1000 = 0010 \lor 1000 = 1010 = C_2$
>
> 从 $C_6 = 1101$(允许间隔 $j=2$):
>
> - $j=2$:$SHR^{(2)}(1101) \lor 1000 = 0011 \lor 1000 = 1011 = C_5$
>
> ---
>
> **Step 4:画状态转移图**
>
> ```mermaid
> stateDiagram-v2
> direction LR
> [*] --> C0
> C0 --> C1: "j=1"
> C0 --> C2: "j=2"
> C0 --> C3: "j=3"
> C1 --> C4: "j=1"
> C1 --> C5: "j=2"
> C2 --> C6: "j=1"
> C2 --> C3: "j=3"
> C3 --> C2: "j=2"
> C3 --> C3: "j=3"
> C4 --> C7: "j=1"
> C5 --> C2: "j=2"
> C6 --> C5: "j=2"
> ```
>
> ---
>
> **Step 5:找最优调度策略**
>
> 从 $C_0$ 出发的所有闭合回路:
>
> | 回路 | 间隔序列 | 平均延迟 |
> |:----:|:--------:|:--------:|
> | $C_0 \to C_3 \to C_3$ (自环) | (3) | $3/1 = 3.0$ |
> | $C_0 \to C_3 \to C_2 \to C_3$ | (3, 2) | $(3+2)/2 = 2.5$ |
> | $C_0 \to C_2 \to C_3 \to C_2$ | (2, 3) | $(2+3)/2 = 2.5$ |
> | $C_0 \to C_1 \to C_5 \to C_2 \to C_3$ | (1, 2, 2, 3) | $8/4 = 2.0$ |
>
> ... 需要检查是否回路回到 $C_0$。由于本例中从 $C_0$ 出发不一定回到 $C_0$,需要选取**最小平均延迟的循环回路**。
>
> **最优调度策略**:间隔序列为 **(3, 2)**,平均延迟 **2.5 拍**。
>
> ---
>
> **Step 6:画时空图(4 个任务)**
>
> 按调度策略 (3, 2, 3, 2, ...),任务进入时刻:0, 3, 5, 8
>
> | 段 \ 时刻 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
> |:----------:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:--:|:--:|:--:|
> | $S_1$ | $T_1$ | | | | | $T_2$ | | | | | $T_3$ | | |
> | $S_2$ | | $T_1$ | | | | | $T_2$ | | | | | $T_3$ | |
> | $S_3$ | | | $T_1$ | | | | | $T_2$ | | | | | $T_3$ |
> | $S_4$ | | | | $T_1$ | | | | | $T_2$ | | | | |
>
> (续表:任务 $T_4$ 在时刻 10 进入...)
>
> ---
>
> **Step 7:计算性能指标**
>
> 4 个任务总完成时间 = 最后一个任务进入时刻 + 单个任务执行时间 = $8 + 4 = 12$ 拍
>
> - **吞吐率**:$TP = \frac{4}{12} = \frac{1}{3}$ 任务/拍
> - **串行执行时间**:$T_{seq} = 4 \times 4 = 16$ 拍
> - **加速比**:$S = \frac{T_{seq}}{T_k} = \frac{16}{12} = 1.33$
> - **效率**:$E = \frac{S}{k} = \frac{1.33}{4} = 33.3\%$($k$ 为段数)
### 八、性能指标公式汇总
| 指标 | 公式 | 说明 |
|------|------|------|
| **吞吐率** | $TP = \frac{n}{T_k}$ | $n$ 个任务在 $T_k$ 时间完成 |
| **加速比** | $S = \frac{T_{seq}}{T_k} = \frac{n \times k \times \Delta t}{T_k}$ | 串行时间 / 流水线时间 |
| **效率** | $E = \frac{S}{k}$ | 流水线利用率 |
其中 $T_k = (n-1) \times \text{平均延迟} + k \times \Delta t$($k$ 为段数,$\Delta t$ 为时钟周期)。
> [!warning] 考试常见错误
> 1. 提取禁止表时**只看同一行**的间隔,不要跨行比较
> 2. 冲突向量的位数 = **最大禁止间隔**,不是禁止表的元素个数
> 3. 状态转移公式是 **右移**(不是左移),且要 **或上 $C_0$**
> 4. 最优调度是平均延迟**最小**的回路,不是总延迟最小的
> 5. 画时空图时注意:每个任务的各段占用时刻必须与预约表一致
## 关联笔记
- [[计算机系统结构/复习文档/流水线技术]]
- [[小题2-流水线的分类]]
- [[小题4-流水寄存器的作用]]