Files
final-exam/计算机系统结构/复习文档/多处理器与并行处理.md
T

251 lines
12 KiB
Markdown
Raw Normal View History

2026-06-15 22:39:57 +08:00
---
tags:
- 计算机系统结构
- 复习
- 并行处理
create time: 2026-06-15 10:00
---
# 多处理器与并行处理
## 概述
2026-06-15 22:55:55 +08:00
本文档讲解多处理器系统的基本概念与分类、存储一致性模型(MSI 协议状态转移)、共享内存与分布式内存的架构对比,以及并行系统性能评估——包括远程访问 CPI 分析、计算/通信比、Amdahl 定律在并行系统中的应用。多处理器和并行处理是现代计算机系统结构的重要方向,涉及软硬件协同设计的多个层面。
2026-06-15 22:39:57 +08:00
> [!tip] 考试重点
2026-06-15 22:55:55 +08:00
> 存储一致性的三个条件是论述题高频考点。MSI 协议状态转移图常以简答题出现。远程访问 CPI 分析、Amdahl 定律的并行扩展在综合题中反复出现。
2026-06-15 22:39:57 +08:00
## 正文
### 一、多处理器系统概述
#### 1.1 分类
| 类型 | 特征 | Flynn 分类 | 典型代表 |
|------|------|:----------:|----------|
| 单处理器 | 单指令单数据 | SISD | 传统 PC |
| 向量处理器 | 单指令多数据 | SIMD | GPU、TPU |
| **多处理器** | 多指令多数据,共享内存 | MIMD | 服务器集群 |
| 多计算机 | 多指令多数据,分布式内存 | MIMD | 超算集群 |
#### 1.2 SIMD vs MIMD
| 特性 | SIMD | MIMD |
|------|------|------|
| 指令流 | 单一控制流 | 多个独立控制流 |
| 数据流 | 同一操作作用于多个数据 | 各处理器独立处理不同数据 |
| 适用场景 | 规则的数据并行(矩阵运算) | 不规则的并行任务 |
| 灵活性 | 低(需同步) | 高(独立执行) |
2026-06-15 22:55:55 +08:00
#### 1.3 共享内存 vs 分布式内存
多处理器系统和多计算机系统的核心区别在于内存架构:
| 对比维度 | 共享内存多处理器(SMP/NUMA) | 分布式内存多计算机(MPP/Cluster) |
|----------|---------------------------|----------------------------------|
| **内存视图** | 所有处理器看到统一的地址空间 | 每个节点有独立的本地内存 |
| **通信方式** | 通过 Load/Store 指令直接访问共享变量 | 通过消息传递(MPI)交换数据 |
| **编程模型** | 共享变量 + 锁/信号量 | 消息传递(Send/Receive) |
| **数据一致性** | 需要硬件一致性协议(如 MSI) | 由程序员显式管理 |
| **可扩展性** | 受限于内存互连带宽,通常 < 64 处理器 | 可扩展到数千节点 |
| **编程难度** | 较低(共享地址空间) | 较高(需显式管理数据分布) |
| **典型代表** | 大型服务器(SMP)、NUMA 服务器 | 超算集群(如 Summit) |
```mermaid
flowchart LR
subgraph SMP["共享内存多处理器"]
P1["处理器 1"] --> SM["共享内存"]
P2["处理器 2"] --> SM
P3["处理器 3"] --> SM
end
subgraph MPP["分布式内存多计算机"]
N1["节点 1: CPU + 本地内存"] <-->|"消息传递"| N2["节点 2: CPU + 本地内存"]
N2 <-->|"消息传递"| N3["节点 3: CPU + 本地内存"]
end
```
> [!question] 思考
> 为什么共享内存系统难以扩展到大规模?因为所有处理器竞争同一个内存系统的带宽。当处理器数量增加时,内存带宽成为瓶颈。NUMA(非统一内存访问)架构通过让每个处理器有本地内存来缓解,但远程访问延迟仍然远高于本地访问。
2026-06-15 22:39:57 +08:00
### 二、存储一致性(Cache Coherence)
#### 2.1 问题背景
在多处理器系统中,每个处理器都有自己的 Cache。当多个处理器访问共享数据时,可能出现**数据不一致**的问题。
```
处理器 P 写入 X = 1
↓ (Cache 更新)
处理器 Q 的 Cache 中 X 仍为旧值
```
#### 2.2 一致性定义
一个存储系统如果满足以下三个条件,则称是一致的:
> [!important] 存储一致性的三个条件
>
> **条件 1(写后读一致性)**:处理器 P 写 X 后又读 X,若期间无其他处理器写 X,则 P 读到的是自己写入的值。
>
> **条件 2(写传播一致性)**:处理器 P 写 X 后,处理器 Q 读 X,若期间无其他写操作,则 Q 读到的是 P 写入的值。
>
> **条件 3(写顺序一致性)**:对 X 的两次写之间若无其他处理器写 X,则最后写入的值保留(写顺序对所有处理器可见)。
#### 2.3 一致性协议
| 协议 | 原理 | 适用场景 |
|------|------|----------|
| **监听协议**(Snooping) | 所有 Cache 监听总线上的事务 | 小规模多处理器(总线互连) |
| **目录协议**(Directory) | 用目录记录每个内存块的状态 | 大规模多处理器(交叉开关互连) |
**MSI 协议**(监听协议的基础):
| 状态 | 含义 |
|:----:|------|
| **M**(Modified) | 该行已被修改,与主存不一致,只有本 Cache 有最新副本 |
| **S**(Shared) | 该行未被修改,多个 Cache 可能有副本 |
| **I**(Invalid) | 该行无效 |
2026-06-15 22:55:55 +08:00
**MSI 协议状态转移图**:
```mermaid
stateDiagram-v2
[*] --> I
I --> M: "本地写 (Local Write)"
I --> S: "本地读命中 (Local Read Hit)"
S --> M: "本地写 (Local Write)"
M --> S: "远程读 (Remote Read, 总线读命中)"
M --> I: "远程写 (Remote Write, 总线写命中)"
S --> I: "远程写 (Remote Write, 总线写命中)"
I --> I: "远程写 (Remote Write, 监听到写)"
```
> [!note] 状态转移详解
> - **本地操作**(本处理器发起):读命中时从 S 转移或保持 S;写操作将状态提升为 M(独占且已修改)。
> - **远程操作**(其他处理器通过总线发起):当某处理器写数据时,其他持有该数据副本的 Cache 必须将其置为 I(无效);当某处理器读数据时,持有 M 状态的 Cache 需先将数据写回主存并将自身降为 S。
> - **M -> S 的"写回"**:当远程处理器读取数据时,持有 M 状态的 Cache 必须先将修改的数据写回主存,然后转为 S。这保证了数据一致性。
> [!question] 思考
> 为什么需要 M 状态?直接用 S 和 I 不行吗?如果只有 S 和 I,每次写操作都需要立即写回主存(write-through),这会导致大量总线流量。M 状态允许延迟写回(write-back),只有在其他处理器需要读该数据时才写回,大大减少了总线通信量。
2026-06-15 22:39:57 +08:00
> [!question] 监听协议为什么不适合大规模系统?
> 监听协议要求所有 Cache 监听总线,总线带宽成为瓶颈。当处理器数量增加时,总线冲突急剧增加,监听协议的可扩展性很差。目录协议通过点对点通信避免了这个问题。
### 三、并行系统性能分析
#### 3.1 远程访问的影响
在分布式共享内存系统中,远程内存访问的延迟远高于本地访问。
**CPI 计算**:
$$CPI = CPI_{base} + \text{远程访问率} \times \text{远程访问延迟(时钟数)}$$
2026-06-15 22:55:55 +08:00
> [!example] 例题 1:远程访问性能影响
2026-06-15 22:39:57 +08:00
> 32 个处理器的集群,本地执行时间 10ns,CPI = 1.0。若有 0.5% 指令需远程访问(2000ns):
>
> 远程访问时钟 $= 2000 / 10 = 200$
>
> $CPI = 1.0 + 0.5\% \times 200 = 2.0$
>
> **结论**:0.5% 的远程访问使 CPI 翻倍,性能下降 50%。
2026-06-15 22:55:55 +08:00
> [!example] 例题 2:不同远程访问率的对比分析
> 假设有 16 个处理器的 NUMA 系统,基本 CPI = 1.2,时钟周期 2ns,本地内存访问 40ns,远程内存访问 200ns。
>
> | 场景 | 远程访问率 | 远程延迟(时钟) | 有效 CPI | 相对性能 |
> |------|:---------:|:-------------:|:--------:|:-------:|
> | 优化的并行程序 | 1% | 100 | $1.2 + 0.01 \times 100 = 2.2$ | 1.00 |
> | 一般并行程序 | 5% | 100 | $1.2 + 0.05 \times 100 = 6.2$ | 0.35 |
> | 通信密集程序 | 10% | 100 | $1.2 + 0.10 \times 100 = 11.2$ | 0.20 |
>
> **分析**:远程访问率从 1% 增加到 10%,CPI 从 2.2 飙升到 11.2,性能下降到原来的 1/5。这说明**数据局部性**对并行系统性能至关重要。优化并行程序的核心任务之一就是最小化远程访问比例。
> [!question] 思考
> 如果远程内存访问延迟从 200ns 优化到 100ns(比如使用更快的互连网络),对通信密集程序(10% 远程访问率)的 CPI 影响有多大?新的 CPI = 1.2 + 0.10 * 50 = 6.2,相比原来的 11.2 几乎减半。硬件改进(降低远程延迟)和软件优化(减少远程访问率)同等重要。
2026-06-15 22:39:57 +08:00
#### 3.2 并行计算的挑战
| 挑战 | 说明 | 应对方法 |
|------|------|----------|
| **并行性有限** | Amdahl 定律限制了并行加速的上限 | 优化串行部分、提高并行比例 |
| **通信开销** | 处理器间数据交换的延迟 | 优化通信模式、减少同步 |
| **负载不均衡** | 各处理器工作量不等 | 动态调度、任务细分 |
2026-06-15 22:55:55 +08:00
#### 3.3 Amdahl 定律在并行系统中的应用
Amdahl 定律指出,程序的加速比受限于串行部分的比例:
$$S = \frac{1}{(1 - f) + \frac{f}{P}}$$
其中 $f$ 为可并行化的比例,$P$ 为处理器数量。
> [!example] 例题:Amdahl 定律计算
> 某程序总执行时间中,串行部分占 10%($f = 0.9$)。
>
> | 处理器数 $P$ | 加速比 $S$ | 效率 $S/P$ | 边际收益 |
> |:-----------:|:---------:|:---------:|:--------:|
> | 1 | 1.00 | 100% | - |
> | 2 | 1.82 | 91% | 0.82 |
> | 4 | 3.08 | 77% | 1.26 |
> | 8 | 4.71 | 59% | 1.63 |
> | 16 | 6.40 | 40% | 1.69 |
> | 32 | 7.80 | 24% | 1.40 |
> | 64 | 8.77 | 14% | 0.97 |
> | $\infty$ | 10.00 | 0% | - |
>
> **计算过程**(以 $P = 8$ 为例):
>
> $S = \frac{1}{0.1 + 0.9/8} = \frac{1}{0.1 + 0.1125} = \frac{1}{0.2125} \approx 4.71$
>
> **关键发现**:
>
> 1. **理论上限**:即使无限处理器,加速比也不会超过 $1/0.1 = 10$ 倍。这就是串行瓶颈。
> 2. **边际收益递减**:从 16 个到 32 个处理器,只增加了 1.4 倍加速比(边际收益列)。处理器翻倍,收益远小于翻倍。
> 3. **效率下降**:处理器越多,每个处理器的利用率越低。
> [!important] Amdahl 定律的实践启示
> - 与其追求更多处理器,不如先优化串行部分。将串行比例从 10% 降到 5%,理论上限从 10 倍提升到 20 倍。
> - 在实际系统中,通信开销进一步拉低并行效率。真正有效的加速比远低于 Amdahl 定律的预测。
> - 这就是为什么"弱扩展"(增大问题规模以保持效率)比"强扩展"(固定问题规模增加处理器)在实践中更有意义。
#### 3.4 计算/通信比
2026-06-15 22:39:57 +08:00
$$\text{计算/通信比} = \frac{\text{计算量}}{\text{通信量}}$$
- 随数据规模增加而**增大**(计算量增长快于通信量)
- 随处理器数目增加而**减小**(每个处理器分到的计算减少,但通信开销相对增加)
2026-06-15 22:55:55 +08:00
> [!example] 例题:计算/通信比的趋势分析
> 一个矩阵乘法问题,矩阵规模为 $N \times N$,使用 $P$ 个处理器并行计算。
>
> - 计算量:$O(N^3 / P)$(每个处理器分担的计算)
> - 通信量:$O(N^2 / \sqrt{P})$(2D 分块方案下的通信开销)
> - 计算/通信比:$O(N^3 / P) \div O(N^2 / \sqrt{P}) = O(N / \sqrt{P})$
>
> **趋势演示**(设 $N = 1000$, $P = 16$):
>
> | 参数变化 | 计算量(相对) | 通信量(相对) | 计算/通信比 |
> |----------|:-----------:|:-----------:|:----------:|
> | $N=1000, P=16$ | 62.5 | 250 | 0.25 |
> | $N=2000, P=16$ | 500 | 500 | 1.00 |
> | $N=4000, P=16$ | 4000 | 1000 | 4.00 |
> | $N=2000, P=64$ | 125 | 250 | 0.50 |
>
> **结论**:规模翻倍(1000→2000→4000),计算/通信比快速提升(0.25→1→4),而增加处理器(16→64)则计算/通信比下降(1→0.5)。这就是为什么"规模化并行"(scaling up the problem)比"增加处理器"更能提高并行效率。
2026-06-15 22:39:57 +08:00
> [!tip] 提高并行效率的关键
> 尽量提高计算/通信比:增大问题规模、优化通信模式(减少全局通信)、使用高带宽低延迟的互连网络。
### 四、设计定量原理在并行系统中的应用
1. **以经常性事件为重点**:优化本地访问路径(高频事件),而非远程访问
2. **Amdahl 定律**:并行加速受限于串行部分的比例
3. **CPU 性能公式**:远程访问增加了有效 CPI
4. **局部性原理**:数据局部性越好,远程访问越少,并行效率越高
## 关联笔记
- [[计算机系统结构/复习文档/计算机系统结构基础与定量原理]]
- [[计算机系统结构/复习文档/存储系统与Cache]]
- [[计算机系统结构/index|试题册索引]]