【硬核体系结构与编译器技术】计算机并行的四大流派与

8 min

这份笔记源自于 (99+ 封私信) 【硬核体系结构与编译器技术00】从百万次 for 循环说起:计算机并行的四大流派与 GPU 的“身份危机” - 知乎,目前是通过 AI 初步整理,加上作者的一些个人理解和修改整理得到的。主要脉络如下:

  1. 简单介绍并行计算的重要性。
  2. 介绍并行计算的四大流派。
  3. 分析 GPU 到底是属于 TLP,还是属于 DLP。

四大流派的介绍有一个非常明显的特点:对任务/数据的处理颗粒度是由粗及细。这个系列重点关注的是 ILP。

概述

在追求算力极限(特别是AI和高性能计算)的今天,榨干硅片性能的魔法隐藏在底层的编译器和芯片架构中。计算机压榨极限性能的绝对“金矿”是循环级并行(处理海量同质化、重复性计算)。根据拆解颗粒度从大到小,演化出了四大并行流派。

并行计算的四大流派

1. 请求级并行 (RLP) —— 简单粗暴的“大力出奇迹”

  • 颗粒度:极宏观(完整的用户请求、独立业务流)
  • 做法:将成千上万个独立请求分发到不同服务器节点。
  • 技术底座:负载均衡(NGINX/LVS)、分布式集群、微服务(K8s)
  • 核心特点Share Nothing(无共享)。请求之间无数据依赖,扩容极简(堆机器即可)。
  • 局限:关注网络延迟、分库分表等,离单机算力的物理极限还很远。
  • 类比:美食城安排派单员,将顾客导流到一万个独立档口。

2. 线程级并行 (TLP) —— 昂贵但人类友好的“人海战术”

  • 颗粒度:大(函数或大块业务逻辑)
  • 做法:大任务拆解,由OS调度到CPU多个物理核心同时执行。
  • 硬件底座:多核架构(CMP,Chip Multiprocessor)、超线程(SMT)
  • 核心代价
    • 沟通与争抢(互斥与同步):共享内存需保持数据一致(MESI协议),易导致“伪共享”和锁竞争。
    • 上下文切换:物理核心有限,线程过多需OS介入切换,此时CPU没有被任何线程所使用,导致CPU空转。
  • 三种“厨师”量级(上下文切换开销)
    1. 进程(重装装甲车):最重,需切换内存空间、TLB、Cache等,耗费数万时钟周期。
    2. 线程(标准重步兵):共享内存,需切换寄存器/PC,需陷入内核态,耗费数千时钟周期。
    3. 协程(轻功刺客):用户态切换,仅保存少量寄存器,耗费几十个时钟周期。
  • 总结:TLP用昂贵的硬件代价换来了符合人类认知的编程模型,但不适合高度密集的同质化计算。
  • 类比:雇两拨厨师,一拨切菜一拨炒菜,需共享备菜区,且频繁换班有开销。

3. 数据级并行 (DLP) —— 降维打击的暴力“大铡刀”

  • 颗粒度:中等(数组、向量、张量中的数据元素)
  • 做法:一条指令同时处理多个数据(SIMD),告别逐个for循环。
  • 硬件底座:CPU向量指令集(AVX-512/NEON)、GPU/NPU
  • 底层物理法则
    1. 算力密度奇高:只保留1个“大脑”(控制电路),省下硅片全铺满“打工人”(ALU算术逻辑单元)。
    2. 车道与流水线:物理ALU数量(Lane)可能小于向量长度,通过流水线分时复用拉满吞吐量。
  • 两大梦魇(限制条件)
    • Bank Conflict(存储体冲突):数据必须内存对齐、连续存放。跳跃访存会导致性能血崩,AI编译器常通过“内存重排”优化。
    • Warp Divergence(分支分化):遇if-else无法同时执行不同指令,只能串行掩码执行,时间翻倍。简单说:if 条件成立的代码,后续需要等待 else 条件成立的代码执行完毕后,再继续执行后续的指令。
  • 总结:用“极度的规律性”换取“极端的算力”,是深度学习算力狂飙的基石。
  • 类比:只留1个厨师,配一把64刃大铡刀,一刀切完64个土豆。

4. 指令级并行 (ILP) —— 单线程内的极限“时间管理大师”

  • 颗粒度:极微观(单条汇编指令)
  • 做法:单核单线程内,打破代码顺序,将无依赖的指令重叠执行。
  • 硬件底座:深层流水线、乱序执行引擎、分支预测器
  • 核心矛盾:代码的“相关”导致硬件的“冒险”(如真数据相关RAW导致流水线停顿Stall)。
  • 破局方法
    1. 静态规避(编译器):编译时重排指令。如循环展开(消灭分支)、软件流水线(将不同迭代操作揉捏成超长指令VLIW同时发射)。但编译器怕“指针别名”,无法确定内存是否冲突时会认怂。
    2. 动态兜底(硬件):运行时微操。乱序执行强行提前拉入后续指令分支预测赌博式盲跑:根据历史经验直接“猜”一个方向盲跑(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 的硬件架构享受超高算力密度。