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

9.1 KiB
Raw Blame History

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] 找回路的技巧

  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:画状态转移图

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. 画时空图时注意:每个任务的各段占用时刻必须与预约表一致

关联笔记