第 6 章 客户端到云端的并行处理器 (Parallel Processors from Client to Cloud)

      +

      核心结论

      • 并行编程模型:SISD(标量单核)/ SIMD(一条指令多数据)/ MIMD(多核独立指令)/ SPMD(单程序多数据)/ Vector(向量处理器)。

      • 并行编程挑战:race condition / 数据竞争;同步(mutex / atomic / barrier);通信(共享内存 / 消息传递);负载均衡。

      • 硬件多线程(§6.4):粗粒度 / 细粒度 / 同步多线程 (SMT / Hyper-Threading)——多线程隐藏流水线停顿。

      • 多核与共享内存(§6.5):UMA / NUMA;MESI / coherence;OpenMP / pthreads 编程模型。

      • GPU(§6.6):SIMT 模型;上千个小核 + 高带宽 GDDR;CUDA / OpenCL 编程。

      • 集群与数据中心(§6.7-§6.9):消息传递(MPI);网络拓扑(bus / ring / torus / hypercube);WSC(Warehouse Scale Computer)。

      本章主旨

      本章是"并行处理器"全景——从客户端多核 CPU 到云端数据中心。理解并行编程模型(SISD / SIMD / MIMD)是基础;理解硬件多线程与多核共享内存才能写出高性能多线程代码;理解 GPU 才能利用现代异构计算;理解集群与数据中心才能理解大规模分布式系统。本章是前 5 章的"分布式延伸"——8 大思想中的"并行"在此彻底展开。

      一、核心概念

      本章围绕 6 个核心概念展开:从并行编程模型出发,介绍并行编程挑战,硬件多线程,多核与共享内存,GPU,集群与数据中心。

      概念 定义 + 重要性 实现提示

      并行编程模型

      SISD / SIMD / MIMD / SPMD / Vector;不同模型适合不同并行模式。

      §6.3;理解模型才能选对并行原语。

      并行编程挑战

      race condition / 同步 / 通信 / 负载均衡;死锁 / 活锁 / 饥饿。

      §6.2;Amdahl 定律限制并行上限。

      硬件多线程

      细粒度 / 粗粒度 / 同步多线程 (SMT);多线程隐藏流水线停顿。

      §6.4;Intel Hyper-Threading 是 SMT 实例。

      多核与共享内存

      UMA / NUMA;MESI coherence;OpenMP / pthreads / std::thread。

      §6.5;多核编程必须理解 cache 共享与一致性。

      GPU

      SIMT 模型;上千小核 + 高带宽 GDDR;CUDA / OpenCL / Vulkan Compute。

      §6.6;图形与 ML 标准;需理解 host / device 编程模型。

      集群与数据中心

      消息传递(MPI);网络拓扑;WSC 设计哲学(cost / performance / dependability)。

      §6.7-§6.9;现代云计算基础设施。

      二、详细笔记

      2.1 并行编程模型 (Parallel Programming Models)

      What:并行编程的几种分类——SISD / SIMD / MIMD / SPMD / Vector。

      Why:不同模型适合不同并行模式;理解后才能选对并行原语。

      How

      Flynn 分类(§6.3):

      • SISD(Single Instruction, Single Data):传统标量 CPU。

      • SIMD(Single Instruction, Multiple Data):单条指令处理多数据(ARM NEON、x86 AVX)。

      • MIMD(Multiple Instruction, Multiple Data):多核各自执行不同指令。

      • SPMD(Single Program, Multiple Data):多核跑同一程序但处理不同数据(MPI)。

      • Vector:向量处理器(GPU 内部 SIMD)。

      并行模型与硬件的对应
      • SIMD:CPU 的 NEON / AVX 指令;GPU 内部 SIMT 实现 SIMD。

      • MIMD:多核 CPU;多个独立程序流。

      • SPMD:MPI / CUDA;同一程序在不同数据上执行。

      • 现代 CPU 是 SISD + SIMD + MIMD 混合(超标量 + SIMD 指令 + 多核)。

      When:选并行原语(线程 vs 进程 vs SIMD vs GPU);性能分析(哪类并行最适合)。

      Example:图像处理用 SIMD;数据库查询用 MIMD;神经网络训练用 SIMT(GPU)。

      2.2 并行编程挑战 (Parallel Programming Challenges)

      What:并行编程的常见陷阱——race condition / 同步 / 通信 / 负载均衡 / 死锁。

      Why:90% 的并行 bug 是 race condition;理解才能写出正确的并行代码。

      How

      并行编程挑战(§6.2):

      • Race condition:多个线程读 / 写同一数据,结果依赖调度顺序。

      • 同步:mutex / atomic / barrier;保护共享数据。

      • 通信:共享内存(OpenMP / pthreads)vs 消息传递(MPI)。

      • 负载均衡:工作分配不均导致部分线程空闲。

      • 死锁:循环等待;A 等 B、B 等 A。

      • 活锁:线程一直工作但没进展(如 CAS 重试)。

      • 饥饿:线程长期得不到资源。

      Amdahl 定律(§6.2):并行上限 = 1 / (串行比例 + 并行比例/n)

      并行的"金科玉律"
      • 串行部分必须尽量小(启动 / 关闭 / I/O / 锁)。

      • 锁的粒度越细越好(但太多锁 = 死锁风险)。

      • 数据竞争用工具检测(TSan / Helgrind)。

      • 性能调优用 profiler(perf / VTune / nsight)。

      When:所有并行编程;debug 诡异 bug;性能优化(Amdahl 定律识别串行瓶颈)。

      Example:OpenMP 中 #pragma omp parallel for reduction(+:sum) 自动合并线程局部 sum 到全局 sum;避免 race condition。

      2.3 硬件多线程 (Hardware Multithreading)

      What:单核 CPU 同时跑多个线程;用线程切换隐藏流水线停顿。

      Why:流水线停顿(如 cache miss)浪费硬件资源;多线程切换可填补空闲周期。

      How

      多线程分类(§6.4):

      • 细粒度多线程:每周期切换线程(开销大)。

      • 粗粒度多线程:遇到长 stall 才切换(切换开销小但仍有 stall 浪费)。

      • 同步多线程 (SMT):每个周期发射多个线程的指令(Hyper-Threading)。

      Hyper-Threading 实例(§6.4):

      • Intel 处理器每个物理核有 2 个逻辑核(SMT = 2)。

      • 每个逻辑核有独立寄存器,但共享 ALU / cache。

      • 单线程 IPC ≈ 1;双线程 SMT ≈ 1.2-1.5(不是 2 倍)。

      Hyper-Threading 的工程取舍
      • 优点:单线程 IPC 不变,多线程总吞吐 +20-50%。

      • 缺点:单线程延迟略增(资源共享);功耗略增。

      • 不适合延迟敏感的应用(高频交易);适合吞吐密集(web 服务器、批处理)。

      When:CPU 选型;性能调优(关闭 HT 是否更优?);理解"逻辑核" vs "物理核"。

      Example:Intel Core i9-13900K 有 24 物理核 + 32 线程(HT 开启);关闭 HT 后性能 ≈ 95% 单核,但能效更高。

      2.4 多核与共享内存 (Multicore & Shared Memory)

      What:多个物理核共享同一物理内存;线程间通信用读 / 写共享变量。

      Why:多核编程必须理解 cache 共享与一致性;理解后才能写出正确的多线程代码。

      How

      共享内存架构(§6.5):

      • UMA(Uniform Memory Access):所有核访问同一内存的时间相同(典型 2-4 核)。

      • NUMA(Non-Uniform Memory Access):每个核有自己的本地内存(远程访问慢);典型 8+ 核服务器。

      并行编程 API:

      • OpenMP:编译器指令 #pragma omp parallel for;自动线程管理;适合 CPU 并行。

      • pthreads:POSIX 线程库;低层 API;Linux / Unix 标准。

      • *C std::thread / std::async*:C11 标准线程库;现代 C++ 并行首选。

      NUMA 的工程意义
      • 大数据访问应放在本地内存(用 numactl 绑定)。

      • 多线程共享数据应考虑 cache line 共享(false sharing)。

      • 跨 NUMA 节点的同步代价高(>100 ns);尽量本地化。

      When:多核编程;服务器性能调优;选择线程库。

      Example:Linux taskset 绑定线程到 CPU;numactl --membind=0 绑定内存到节点 0。

      2.5 GPU (Graphics Processing Units)

      What:上千个小核 + 高带宽 GDDR + SIMT 执行模型;适合数据并行。

      Why:ML / 图形 / 科学计算标准;性能 / 瓦特比远高于 CPU。

      How

      GPU 架构(§6.6):

      • SM(Streaming Multiprocessor):含数百 CUDA 核 + 共享内存 + 寄存器堆。

      • SIMT(Single Instruction, Multiple Threads):32 个线程组成一个 warp 同步执行。

      • 内存层级:寄存器 / 共享内存 / L1 / L2 / GDDR(高带宽)。

      CUDA 编程模型:

      __global__ void add(int *a, int *b, int *c, int n) {
          int i = blockIdx.x * blockDim.x + threadIdx.x;
          if (i < n) c[i] = a[i] + b[i];
      }
      // 调用:add<<<grid, block>>>(a, b, c, n);
      ----
      GPU vs CPU 的工程权衡
      • GPU:数千小核、高带宽 GDDR、高吞吐;适合数据并行。

      • CPU:少数大核、大 cache、低延迟;适合分支密集。

      • 现代异构计算:CPU 处理串行 + 控制流,GPU 处理数据并行。

      • AMD APU / Apple M1:CPU + GPU 集成;统一内存架构。

      When:ML 训练 / 推理;图形渲染;科学计算;密码学;视频处理。

      Example:NVIDIA H100 有 132 SM × 128 CUDA 核 = 16896 核;FP16 算力 1979 TFLOPS。

      2.6 集群与数据中心 (Cluster & Data Center)

      What:用网络连接多台独立计算机;通过消息传递通信。

      Why:现代云计算基础设施;理解后才能设计分布式系统。

      How

      并行架构分类(§6.7):

      • 共享内存多处理器 (SMP):多核共享同一内存(§6.5)。

      • 集群:多台独立计算机通过网络连接(MPI / 消息传递)。

      • WSC(Warehouse Scale Computer):Google / Amazon 规模的数据中心;专门为云服务设计。

      网络拓扑(§6.8):

      • Bus:所有节点共享一条总线(简单但带宽瓶颈)。

      • Ring:节点形成环形(每节点 2 邻居)。

      • Torus:环形 + 跨接(每节点 4 邻居)。

      • Hypercube:N 维立方体(N 邻居,距离 log N)。

      • Fat tree:带宽从根到叶递增(无瓶颈)。

      • Dragonfly:分组 + 跨组高速链路。

      WSC 的设计哲学
      • 廉价组件 + 冗余:单台机器可能失败,需冗余 + 软件容错。

      • 统一基础设施:同一集群跑多种工作负载(搜索 / 邮件 / 视频)。

      • 自动化运维:最小化人工干预;自动故障检测 + 替换。

      • 成本 = TCO:不仅是硬件成本,还包括电力 / 散热 / 运维。

      When:分布式系统设计;HPC 集群;云架构;数据中心运维。

      Example:Google 用 WSC 跑搜索 / Gmail / YouTube;Amazon AWS 是公开 WSC;Facebook 用 Hadoop / HBase 跑 PB 级数据。

      三、关键图表

      视觉图表

      图 6-1
      Figure 1. 图 6-1:Flynn 分类(SISD / SIMD / MIMD)
      图 6-2
      Figure 2. 图 6-2:硬件多线程(细粒度 / 粗粒度 / SMT)
      图 6-3
      Figure 3. 图 6-3:多核 UMA / NUMA 架构
      图 6-4
      Figure 4. 图 6-4:GPU 架构(SM / 内存层级)
      图 6-5
      Figure 5. 图 6-5:网络拓扑(bus / ring / torus / hypercube / fat tree)
      图 6-6
      Figure 6. 图 6-6:WSC 数据中心

      非可视化条目

      非可视化条目(表 / 算法)
      编号 内容摘要

      表 6.1

      Flynn 分类详表。

      表 6.2

      OpenMP / pthreads / MPI / CUDA 对比(共享内存 vs 消息传递)。

      式 6-1 至 6-5

      Amdahl 定律、GPU 占用率公式、通信延迟公式。

      列表 6.1-6.x

      OpenMP / CUDA / MPI 示例代码。

      表 6.3

      Intel Core i7 与 NVIDIA Tesla GPU 性能对比(roofline 模型)。

      核心公式对照表

      核心公式对照表
      概念 公式

      Amdahl 定律

      \(\text{Speedup} = \frac{1}{(1 - p) + p/n}\)

      GPU 占用率

      \(\text{Occupancy} = \frac{\text{Active warps}}{\text{Max warps per SM}}\)

      网络延迟

      \(T_{\text{latency}} = T_{\text{propagation}} + T_{\text{transmit}} + T_{\text{queue}}\)

      Roofline 模型

      \(\text{Performance} = \min(\text{Peak FLOPS}, \text{Bandwidth} \times \text{AI})\)

      四、思维导图

      mindmap
        root((第 6 章 并行处理器))
          编程模型
            SISDSIMDMIMD
            SPMDVector
            Flynn分类
          并行挑战
            race条件
            同步通信
            死锁活锁
            Amdahl定律
          硬件多线程
            细粒度粗粒度
            SMT超线程
            隐藏stall
          多核共享
            UMANUMA
            MESI一致性
            OpenMP
          GPU
            SIMT模型
            数千小核
            CUDA
          集群WSC
            MPI消息传递
            网络拓扑
            数据中心

      五、重点与易错点

      • 并行模型与硬件的对应:SIMD = CPU NEON/AVX;MIMD = 多核 CPU;SPMD = MPI / CUDA。

      • Amdahl 定律决定并行上限:99% 并行 ≈ 100× 加速;99.9% ≈ 1000× 加速。

      • Hyper-Threading 不是 2 倍性能:单线程 IPC 不变,多线程总吞吐 +20-50%。

      • NUMA 本地性:跨 NUMA 节点访问慢 2-10 倍;大数据应放本地内存。

      • false sharing 是多核性能杀手:独立变量共享 cache 行 → 写触发 snoop invalidation → padding 解决。

      • GPU 适合数据并行:分支密集 / 串行代码 GPU 性能差;CPU + GPU 异构计算。

      • WSC 假设组件会失败:单盘失败 / 单机失败常见;用软件冗余 + 自动恢复。

      • OpenMP / pthreads / std::thread 选型:OpenMP 编译器管理最简单;pthreads 最底层;std::thread C++ 标准。

      • MESI 是硬件自动维护:程序员无需关心(除非写 lock-free 代码)。

      • 跨章衔接:第 4 章 CPU 微架构是多线程基础;第 5 章 MESI 是多核一致性;附录 D 给出 ARM / Intel / MIPS 多核实例。