9.1 KiB
tags, create time
| tags | create time | |||||
|---|---|---|---|---|---|---|
|
2026-06-16 21:21 |
大题 3 — 非线性流水线调度
概述
本题考查非线性流水线的调度全过程:从预约表出发,提取禁止表、构建冲突向量、画出状态转移图、求最优调度策略,最后画时空图并计算性能指标(吞吐率、加速比、效率)。这是本课程分值最高、难度最大的核心考点。
[!tip] 考试重点 这道题几乎每年必考(A 卷 24 分、B 卷 16 分),务必完整掌握以下流程: 预约表 → 禁止表 → 冲突向量 → 状态转移图 → 最优调度 → 时空图 → 性能计算
正文
一、完整解题流程
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] 找回路的技巧
- 从初始状态
C_0出发- 列出所有可能的转移路径
- 找到回到
C_0的所有回路- 比较各回路的平均延迟
- 注意:回路可以重复——如 (3, 2, 3, 2, ...) 只需取最小循环单元 (3, 2)
七、完整例题(参考 A 卷 24 分大题)
[!example] 例题:4 段流水线调度
已知预约表如下:
段 \ 时刻 1 2 3 4 5 6 7 S_1x x S_2x x S_3x x S_4x
Step 1:提取禁止表
段 占用时刻 间隔 S_11, 5 5-1=4S_22, 6 6-2=4S_33, 7 7-3=4S_44 无间隔 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:画状态转移图
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.0C_0 \to C_3 \to C_2 \to C_3(3, 2) (3+2)/2 = 2.5C_0 \to C_2 \to C_3 \to C_2(2, 3) (2+3)/2 = 2.5C_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_1T_1T_2T_3S_2T_1T_2T_3S_3T_1T_2T_3S_4T_1T_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] 考试常见错误
- 提取禁止表时只看同一行的间隔,不要跨行比较
- 冲突向量的位数 = 最大禁止间隔,不是禁止表的元素个数
- 状态转移公式是 右移(不是左移),且要 或上 $C_0$
- 最优调度是平均延迟最小的回路,不是总延迟最小的
- 画时空图时注意:每个任务的各段占用时刻必须与预约表一致