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

12 KiB
Raw Blame History

tags, create time
tags create time
计算机系统结构
复习
并行处理
2026-06-15 10:00

多处理器与并行处理

概述

本文档讲解多处理器系统的基本概念与分类、存储一致性模型(MSI 协议状态转移)、共享内存与分布式内存的架构对比,以及并行系统性能评估——包括远程访问 CPI 分析、计算/通信比、Amdahl 定律在并行系统中的应用。多处理器和并行处理是现代计算机系统结构的重要方向,涉及软硬件协同设计的多个层面。

[!tip] 考试重点 存储一致性的三个条件是论述题高频考点。MSI 协议状态转移图常以简答题出现。远程访问 CPI 分析、Amdahl 定律的并行扩展在综合题中反复出现。

正文

一、多处理器系统概述

1.1 分类

类型 特征 Flynn 分类 典型代表
单处理器 单指令单数据 SISD 传统 PC
向量处理器 单指令多数据 SIMD GPU、TPU
多处理器 多指令多数据,共享内存 MIMD 服务器集群
多计算机 多指令多数据,分布式内存 MIMD 超算集群

1.2 SIMD vs MIMD

特性 SIMD MIMD
指令流 单一控制流 多个独立控制流
数据流 同一操作作用于多个数据 各处理器独立处理不同数据
适用场景 规则的数据并行(矩阵运算) 不规则的并行任务
灵活性 低(需同步) 高(独立执行)

1.3 共享内存 vs 分布式内存

多处理器系统和多计算机系统的核心区别在于内存架构:

对比维度 共享内存多处理器(SMP/NUMA) 分布式内存多计算机(MPP/Cluster)
内存视图 所有处理器看到统一的地址空间 每个节点有独立的本地内存
通信方式 通过 Load/Store 指令直接访问共享变量 通过消息传递(MPI)交换数据
编程模型 共享变量 + 锁/信号量 消息传递(Send/Receive)
数据一致性 需要硬件一致性协议(如 MSI) 由程序员显式管理
可扩展性 受限于内存互连带宽,通常 < 64 处理器 可扩展到数千节点
编程难度 较低(共享地址空间) 较高(需显式管理数据分布)
典型代表 大型服务器(SMP)、NUMA 服务器 超算集群(如 Summit)
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(非统一内存访问)架构通过让每个处理器有本地内存来缓解,但远程访问延迟仍然远高于本地访问。

二、存储一致性(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) 该行无效

MSI 协议状态转移图:

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),只有在其他处理器需要读该数据时才写回,大大减少了总线通信量。

[!question] 监听协议为什么不适合大规模系统? 监听协议要求所有 Cache 监听总线,总线带宽成为瓶颈。当处理器数量增加时,总线冲突急剧增加,监听协议的可扩展性很差。目录协议通过点对点通信避免了这个问题。

三、并行系统性能分析

3.1 远程访问的影响

在分布式共享内存系统中,远程内存访问的延迟远高于本地访问。

CPI 计算:

CPI = CPI_{base} + \text{远程访问率} \times \text{远程访问延迟(时钟数)}

[!example] 例题 1:远程访问性能影响 32 个处理器的集群,本地执行时间 10ns,CPI = 1.0。若有 0.5% 指令需远程访问(2000ns):

远程访问时钟 = 2000 / 10 = 200

CPI = 1.0 + 0.5\% \times 200 = 2.0

结论:0.5% 的远程访问使 CPI 翻倍,性能下降 50%。

[!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 几乎减半。硬件改进(降低远程延迟)和软件优化(减少远程访问率)同等重要。

3.2 并行计算的挑战

挑战 说明 应对方法
并行性有限 Amdahl 定律限制了并行加速的上限 优化串行部分、提高并行比例
通信开销 处理器间数据交换的延迟 优化通信模式、减少同步
负载不均衡 各处理器工作量不等 动态调度、任务细分

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 计算/通信比

\text{计算/通信比} = \frac{\text{计算量}}{\text{通信量}}
  • 随数据规模增加而增大(计算量增长快于通信量)
  • 随处理器数目增加而减小(每个处理器分到的计算减少,但通信开销相对增加)

[!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)比"增加处理器"更能提高并行效率。

[!tip] 提高并行效率的关键 尽量提高计算/通信比:增大问题规模、优化通信模式(减少全局通信)、使用高带宽低延迟的互连网络。

四、设计定量原理在并行系统中的应用

  1. 以经常性事件为重点:优化本地访问路径(高频事件),而非远程访问
  2. Amdahl 定律:并行加速受限于串行部分的比例
  3. CPU 性能公式:远程访问增加了有效 CPI
  4. 局部性原理:数据局部性越好,远程访问越少,并行效率越高

关联笔记