【硬核体系结构与编译器技术】计算机并行的四大流派与
8 min
这份笔记源自于 (99+ 封私信) 【硬核体系结构与编译器技术00】从百万次 for 循环说起:计算机并行的四大流派与 GPU 的“身份危机” - 知乎,目前是通过 AI 初步整理,加上作者的一些个人理解和修改整理得到的。主要脉络如下:
- 简单介绍并行计算的重要性。
- 介绍并行计算的四大流派。
- 分析 GPU 到底是属于 TLP,还是属于 DLP。
四大流派的介绍有一个非常明显的特点:对任务/数据的处理颗粒度是由粗及细。这个系列重点关注的是 ILP。
概述
在追求算力极限(特别是AI和高性能计算)的今天,榨干硅片性能的魔法隐藏在底层的编译器和芯片架构中。计算机压榨极限性能的绝对“金矿”是循环级并行(处理海量同质化、重复性计算)。根据拆解颗粒度从大到小,演化出了四大并行流派。
并行计算的四大流派
1. 请求级并行 (RLP) —— 简单粗暴的“大力出奇迹”
- 颗粒度:极宏观(完整的用户请求、独立业务流)
- 做法:将成千上万个独立请求分发到不同服务器节点。
- 技术底座:负载均衡(NGINX/LVS)、分布式集群、微服务(K8s)
- 核心特点:Share Nothing(无共享)。请求之间无数据依赖,扩容极简(堆机器即可)。
- 局限:关注网络延迟、分库分表等,离单机算力的物理极限还很远。
- 类比:美食城安排派单员,将顾客导流到一万个独立档口。
2. 线程级并行 (TLP) —— 昂贵但人类友好的“人海战术”
- 颗粒度:大(函数或大块业务逻辑)
- 做法:大任务拆解,由OS调度到CPU多个物理核心同时执行。
- 硬件底座:多核架构(CMP,Chip Multiprocessor)、超线程(SMT)
- 核心代价:
- 沟通与争抢(互斥与同步):共享内存需保持数据一致(MESI协议),易导致“伪共享”和锁竞争。
- 上下文切换:物理核心有限,线程过多需OS介入切换,此时CPU没有被任何线程所使用,导致CPU空转。
- 三种“厨师”量级(上下文切换开销):
- 进程(重装装甲车):最重,需切换内存空间、TLB、Cache等,耗费数万时钟周期。
- 线程(标准重步兵):共享内存,需切换寄存器/PC,需陷入内核态,耗费数千时钟周期。
- 协程(轻功刺客):用户态切换,仅保存少量寄存器,耗费几十个时钟周期。
- 总结:TLP用昂贵的硬件代价换来了符合人类认知的编程模型,但不适合高度密集的同质化计算。
- 类比:雇两拨厨师,一拨切菜一拨炒菜,需共享备菜区,且频繁换班有开销。
3. 数据级并行 (DLP) —— 降维打击的暴力“大铡刀”
- 颗粒度:中等(数组、向量、张量中的数据元素)
- 做法:一条指令同时处理多个数据(SIMD),告别逐个
for循环。 - 硬件底座:CPU向量指令集(AVX-512/NEON)、GPU/NPU
- 底层物理法则:
- 算力密度奇高:只保留1个“大脑”(控制电路),省下硅片全铺满“打工人”(ALU算术逻辑单元)。
- 车道与流水线:物理ALU数量(Lane)可能小于向量长度,通过流水线分时复用拉满吞吐量。
- 两大梦魇(限制条件):
- Bank Conflict(存储体冲突):数据必须内存对齐、连续存放。跳跃访存会导致性能血崩,AI编译器常通过“内存重排”优化。
- Warp Divergence(分支分化):遇
if-else无法同时执行不同指令,只能串行掩码执行,时间翻倍。简单说:if条件成立的代码,后续需要等待else条件成立的代码执行完毕后,再继续执行后续的指令。
- 总结:用“极度的规律性”换取“极端的算力”,是深度学习算力狂飙的基石。
- 类比:只留1个厨师,配一把64刃大铡刀,一刀切完64个土豆。
4. 指令级并行 (ILP) —— 单线程内的极限“时间管理大师”
- 颗粒度:极微观(单条汇编指令)
- 做法:单核单线程内,打破代码顺序,将无依赖的指令重叠执行。
- 硬件底座:深层流水线、乱序执行引擎、分支预测器
- 核心矛盾:代码的“相关”导致硬件的“冒险”(如真数据相关RAW导致流水线停顿Stall)。
- 破局方法:
- 静态规避(编译器):编译时重排指令。如循环展开(消灭分支)、软件流水线(将不同迭代操作揉捏成超长指令VLIW同时发射)。但编译器怕“指针别名”,无法确定内存是否冲突时会认怂。
- 动态兜底(硬件):运行时微操。乱序执行强行提前拉入后续指令;分支预测赌博式盲跑:根据历史经验直接“猜”一个方向盲跑(Speculative Execution)猜对了性能起飞;猜错则清洗流水线。
- 总结:通用CPU的巅峰设计,极其包容烂代码,但目前已逼近功耗墙物理尽头(为了10%性能需翻倍控制电路晶体管)。
- 类比:1个厨师1把刀,烧水等开期间同时切葱花、踢烤箱,极限压榨时间。
GPU 的身份危机(TLP 还是 DLP?)
结论:GPU 是一个披着 DLP 外衣的 TLP 狂魔。
- 软件编程视角(看起来像 TLP):CUDA编程采用标量思维(写单元素处理Kernel),启动海量Thread,给程序员一种“独立线程并发”的错觉,降低了编程门槛。
- 硬件执行视角(实际上是 DLP):底层硬件无法为每个线程分配独立的取指/译码器。GPU将32个Thread强行捆绑为一个 Warp,它们共享同一个程序计数器(PC),在同一时钟周期执行绝对相同的指令,仅数据不同——这就是最纯正的 SIMD(单指令多数据)。 NVIDIA 聪明地发明了 SIMT(单指令多线程) 概念:用 TLP 的编程模型降低门槛,用 DLP 的硬件架构享受超高算力密度。