并行计算全景:从晶体管、CPU、GPU 到计算集群 / Parallel Computing from Transistors, CPUs, and GPUs to Clusters
📅 创建时间:2026-07-20 🏷️ 标签:#并行计算 #计算机体系结构 #CPU #GPU #HPC 📚 前置知识:基本编程经验;了解 C/C++ 数组、指针和线程会更顺畅 📚 相关知识:[[/02-systems-and-performance/02-computer-architecture-and-hardware/00-hardware-overview]] [[/01-cpp/06-concurrency/04-concurrency]] [[/04-ai/01-llm-engineering/09-transformer-training-computation]]
文档目标
并行计算不是“多开几个线程”,而是一套横跨算法、编程模型、体系结构和硬件系统的完整方法论。
这套专题围绕一个核心问题展开:
当单个计算单元已经无法继续明显提速时,怎样让更多计算单元协同工作,并让数据及时到达它们手中?
学完后你应该能够:
- 区分并发、并行、分布式计算与异构计算
- 理解 CPU 多核、SIMD、GPU SIMT 和集群的差异
- 判断任务是否可以拆分,以及理论加速上限
- 解释 Cache、NUMA、显存和网络为什么决定真实性能
- 使用 OpenMP、CUDA 和 MPI 描述不同层级的并行
- 用 Speedup、Efficiency、Roofline 等模型分析瓶颈
- 为 AI、CAE、图像处理和科学计算选择合理架构
一张图理解整个专题
应用问题
│
├─ 能不能拆? → 任务依赖、数据依赖、Amdahl 定律
│
├─ 在一个核心里怎样并行? → 指令流水线、乱序执行、SIMD
│
├─ 在一颗 CPU 里怎样并行? → 多核、线程、Cache 一致性、NUMA
│
├─ 在一张 GPU 里怎样并行? → SIMT、Warp、SM、显存层次
│
├─ CPU 和 GPU 怎样协作? → 异构计算、数据传输、任务流水线
│
├─ 一台机器不够怎么办? → MPI、集合通信、RDMA、多机多卡
│
└─ 为什么没有变快? → 测量、Roofline、负载均衡、通信开销并行系统的性能可以粗略写成:
总时间 = 有效计算 + 数据移动 + 同步等待 + 调度开销增加核心只会减少其中一部分。很多程序最终受限于数据移动和等待,而不是算术运算。
课程路线
| 阶段 | 文档 | 核心问题 |
|---|---|---|
| 建立直觉 | 01 基础概念与性能模型 | 为什么并行、最多能快多少? |
| 硬件基础 | 02 处理器体系结构 | 指令在处理器里怎样执行? |
| CPU 并行 | 03 多核、SIMD 与 NUMA | CPU 怎样同时完成不同工作? |
| 内存系统 | 04 Cache、一致性与数据局部性 | 为什么访存经常比计算更贵? |
| GPU 架构 | 05 GPU 与 SIMT | GPU 为什么适合海量规则任务? |
| GPU 编程 | 06 CUDA 执行与内存模型 | Thread、Block、Grid 怎样映射硬件? |
| 算法设计 | 07 并行模式与算法 | Reduction、Scan、Stencil 怎样设计? |
| 单机异构 | 08 CPU-GPU 协同 | 任务和数据应该放在哪里? |
| 集群并行 | 09 MPI、网络与集合通信 | 多台机器怎样交换数据? |
| 工程优化 | 10 性能分析与 Roofline | 瓶颈究竟在哪里? |
| 真实应用 | 11 AI、CAE 与科学计算 | 不同领域怎样组合这些技术? |
| 实践路线 | 12 项目与实验 | 怎样从零建立并行工程能力? |
推荐按编号顺序阅读。已经掌握计算机组成原理的读者,可以从 03 开始;已有 CUDA 经验的读者,也不建议跳过 01、04 和 10。
四种容易混淆的概念
并发
多个任务在一段时间内都获得执行机会,不保证同一时刻真正执行。单核操作系统也能并发。
并行
多个计算单元在同一时刻执行多个操作。多核 CPU、GPU 和多机集群都属于并行系统。
分布式计算
计算单元拥有独立内存,通过网络通信。重点是节点自治、通信和故障处理。
异构计算
系统中存在不同特性的处理器,例如 CPU、GPU、NPU 和 FPGA,由它们分别处理擅长的任务。
贯穿课程的三个案例
案例一:向量相加
for (int i = 0; i < n; ++i) {
c[i] = a[i] + b[i];
}循环之间互不依赖,适合 SIMD、多线程和 GPU,但算术强度低,通常受内存带宽限制。
案例二:矩阵乘法
C[i,j] = Σ A[i,k] × B[k,j]计算量大、数据可以复用,是 Cache 分块、向量化和 GPU Tensor Core 的经典场景。
案例三:大模型训练
模型训练同时涉及:
- GPU 内部的张量并行计算
- 单机多卡的高速互联
- 多机之间的梯度同步
- CPU 数据预处理和 I/O
- 显存容量、通信与计算重叠
它是现代并行计算各层技术的综合实例。
学习原则
- 先判断依赖,再决定如何拆分。
- 先测量瓶颈,再进行优化。
- 把数据移动视为一级成本。
- 同时考虑延迟、吞吐、容量和能耗。
- 优先使用成熟库,理解底层是为了正确选型和排障。
历史原文定位
本页保存课程合并前的并行全景。
当前权威版本补充了依赖、模式、正确性和测量流程。
历史页面用于:
- 恢复旧链接;
- 查找原始例子;
- 对比术语;
- 验证课程迁移;
- 保留早期学习顺序。
原文中的核心问题
Can work be decomposed?
Where is data?
What must synchronize?
What is the overhead?
How is correctness verified?这些问题比具体 API 更稳定。
Work 与关键路径
Work 是全部任务总量。 关键路径决定无限资源下的最低时间。
并行度不足时,换更多核心或 GPU 无法解决。
串行比例
Amdahl 提醒固定问题的串行上限。
真实系统还包含通信、调度、内存和负载不均。
扩展曲线必须由测量获得。
粒度
细任务提高调度与同步比例。 粗任务减少可并行度并产生尾部。
线程、GPU 和 MPI 都有各自固定开销。
数据位置
register/cache
-> local memory
-> remote NUMA
-> device memory
-> network peer
-> storage计算越远离数据,搬运成本越重要。
CPU 路径
CPU 适合:
- 分支;
- 任务;
- 控制;
- 小规模;
- 低延迟;
- 不规则访问。
SIMD 和多线程可以组合。
GPU 路径
GPU 适合:
- 规则数据并行;
- 大批量;
- 高吞吐;
- 可隐藏延迟;
- 高带宽访问。
传输与启动必须计入。
MPI 路径
MPI 适合跨进程和多节点。
需要设计:
- 分区;
- 消息;
- Collective;
- Halo;
- 重叠;
- Checkpoint;
- 故障。
Map
Map 是独立元素变换。 它最容易映射到 SIMD、线程和 GPU。
Reduce
Reduce 合并局部结果。
树形归约减少关键路径。 浮点顺序需要容差。
Scan
Scan 生成前缀。 它通过多个并行阶段处理依赖。
Stencil
Stencil 访问邻域。
Cache Blocking、Shared Memory 和 Halo 是常见重点。
Pipeline
Pipeline 让不同阶段并发。
最慢阶段限制吞吐。 队列要有界。
Task Graph
Task Graph 适合不规则依赖。
运行时管理 Ready Task、偷取和完成事件。
数据竞争
共享写缺少同步会导致错误。
锁和原子不是越少越好,协议正确是前提。
False Sharing
不同字段共享 Cache Line 也可能争用。
使用线程局部数据和对齐,并通过 Profile 验证。
浮点差异
并行顺序变化会改变舍入。
领域容差、残差和守恒量用于验证。
强扩展
固定总规模,增加资源。
效率下降通常来自串行、通信和不均衡。
弱扩展
每资源规模近似固定。
全局通信和 I/O 仍会增长。
历史性能数字
旧数字必须带:
- 硬件;
- 编译器;
- 输入;
- 资源数;
- 命令;
- 正确性。
否则只能作为历史现象。
当前课程补充
当前文章增加:
- Work/Span;
- 常见模式;
- CPU/GPU/MPI 映射;
- 正确性护栏;
- 强弱扩展;
- Profile 流程;
- 完成标准。
阅读验收
读者应能:
- 解释并行上限;
- 画数据分解;
- 找同步点;
- 选择执行层次;
- 估算通信;
- 设计基准;
- 验证结果;
- 区分历史与当前结论。
核心总结
- 并行性能由算法、硬件、内存和通信共同决定。
- CPU 擅长复杂控制与低延迟,GPU 擅长规则、高吞吐的数据并行。
- 从单核到集群,通信范围越来越大,代价也越来越高。
- 并行优化的本质,是让计算单元持续获得足够的数据和可执行工作。
下一篇:[[01-parallel-foundations]]