🧸 ELI5 · GPU 深度漫游

为什么 GPU 算得飞快,却总在等快递?

10 个环环相扣的卡通两格漫画,带你看透英伟达 GPU 架构与深度学习性能的核心秘密。

小绿:正在计算的工人/核心
小橙:刚送来的新数据/新任务
小蓝:仓库或缓存里存着的数据
红虚线:闲置摸鱼或被作废淘汰

⚡ 核心主线:计算与搬运的世纪大鸿沟

一句话结论: GPU 就像一个 1 秒能吃 1000 碗面的大胃王,而内存送面小哥每秒只能端来 10 碗面——整个 GPU 架构的一切优化,全都是为了别让这个大胃王闲着发呆!

显存大仓库 DRAM (慢速快递) 访存带宽:很挤很慢 超高速计算阵列 SMs (秒吞海量算力) 算力极猛,永远嗷嗷待哺
已学完
1

流处理器 SM (Streaming Multiprocessor)

💡 一句话解释: SM 是 GPU 内部一个个独立运作的“现代化计算车间”,每个车间里塞了成百上千个干活小核心。
烦恼:CPU 单挑千万任务
超级工人 堆积如山的新数据

一个人再强也排长队

办法:分身设立上百个车间
SM-1 SM-2 SM-108

千军万马同时算

解决了什么:彻底打破单核算力上限,利用成百上千个并行核心吞吐海量数据。
代价是什么:单核心非常弱小,遇到只能一步一步算的复杂逻辑就会瘫痪。
已学完
2

线程块分层管理 (Thread Block)

💡 一句话解释: 既然有数万个工人,就不能一个个指挥,必须打包成“班组(线程块)”整队派发给车间。
烦恼:散兵游勇调度崩溃
几十万任务乱成一锅粥

每个人都要派单太乱了

办法:统一打包成整齐班组
Block 0 (256人) Block 1 (256人)

打包分派,井然有序

解决了什么:实现了硬件两级层次化调度,一个车间(SM)直接承接一个或多个完整班组。
代价是什么:程序员必须精心设计 Block 大小,分得不均匀就会出现部分车间饿死。
已学完
3

延迟隐藏与 Warp 切换 (Latency Hiding)

💡 一句话解释: 去大仓库取货要等 400 步,工人不等它!直接换另一组现成货物的工人上台干活。
烦恼:货物在路上,工人发呆
Zzz... 等待显存 400 周期

等外卖送来,工期全耽误

办法:你等快递,换他先算!
Warp A 等货 Warp B 接盘火速算 0 开销瞬间切换

谁有货谁上,车间永不歇

解决了什么:把漫长刺眼的显存搬运延迟完全掩盖在其他线程的火热计算之中。
代价是什么:需要常驻海量的线程与庞大的寄存器堆,工人数量必须远多于物理执行管线。
已学完
4

张量核心 (Tensor Core)

💡 一句话解释: 原来是一个个数字算乘法加法,张量核是直接造出“矩阵模具”,一次敲下一整个矩阵积!
烦恼:普通核逐个点乘慢腾腾
× + 1次时钟只能算1对点

一个一个乘,算到明天

办法:专属矩阵冲压机一键搞定
× ➔ 4×4 矩阵 A100 提速高达 16 倍!

矩阵成块印,一口吃一大片

解决了什么:将深度学习最核心的 GEMM(矩阵乘加)算力密度推高了整整一个数量级。
代价是什么:只能算固定形状和低精度的矩阵块(如 FP16/INT8),对普通加法激活函数完全无用。
已学完
5

片上共享内存与 L2 (Shared Memory)

💡 一句话解释: 别总让工人跑去几公里外的大仓库取货,直接在车间桌子上放个“随手货架”!
烦恼:算完丢出去,下秒又跑去拿
大显存 往返耗死路程

反复出差,路费贵上天

办法:桌头小货架,即拿即用
片上共享内存 带宽翻数十倍,耗时仅几步

近水楼台,伸手就能拿

解决了什么:让同车间工人高效共享中间结果,避免昂贵的显存反复读写(显存带宽节约 80%+)。
代价是什么:容量极其金贵(每个 SM 仅几十到一两百 KB),用超了就会限制同时干活的线程数。
已学完
6

算术强度与屋顶模型 (Arithmetic Intensity)

💡 一句话解释: 搬来 1 斤菜,你炒了几次勺?算术强度 = 每搬运 1 字节数据能支撑多少次计算。
烦恼:盲目优化,根本不知卡在哪
❓ 是脑子慢还是腿慢?

头痛医脚,优化半天没快

办法:屋顶分界线,一测便知
受限于内存 受限于算力 Ops / Byte (分水岭 139)

画出拐点,对症下药

解决了什么:定量给出分水岭:强度低于 GPU 拐点必定受限于内存,高于拐点才受限于算力。
代价是什么:实际程序存在控制流指令和多次重复读取,理论计算只是初阶上限估计。
已学完
7

算子融合 (Kernel Fusion)

💡 一句话解释: ReLU 激活、加偏置这些小零碎算术极低,不要每步都进出显存,顺手在寄存器里一口气全做完!
烦恼:加法存一次,ReLU再存一次
加偏置 存显存 读ReLU 算术强度仅 0.25

倒腾两次,全是搬运

办法:串联打包,算完再写回
加法 激活 💾 只读一次,只写一次!

顺手搞定,省下整趟车

解决了什么:消除了逐元素算子在显存与计算单元之间的冗余访存,速度飙升数倍。
代价是什么:算子组合爆炸,编译器必须动态生成并维护复杂的融合代码模板。
补一下
8

树状归约与 SoftMax 优化 (Reduction)

💡 一句话解释: 求一万个数字的和或最大值时,不能让所有人排队加到同一个变量上,必须打“淘汰赛”!
烦恼:所有人挤一个存钱罐
共享锁 发生严重排队冲突

争先恐后,全部堵死

办法:分层两两对决,对数级收缩
O(N) ➔ O(log N) 步完成

两两分组,极速晋级

解决了什么:在共享内存中通过树状规约完成并行聚合,彻底消除原子锁瓶颈。
代价是什么:越往后干活的有效线程越少(出现空闲分支),依然很难摆脱访存受限本质。
已学完
9

批处理饱和度 (Batch Size)

💡 一句话解释: 搬一次几百 MB 的模型权重,如果只服务 1 个用户(Batch=1),算力全在摸鱼;必须凑一车人一起算!
烦恼:Batch=1,搬巨大权重只算一笔
权重参数 100MB Batch=1 算术强度仅 1 FLOPS/B

大卡车送货,只装一粒米

办法:Batch=512,一份权重服务五百人
同一份权重 × Batch=512 算术强度飙升至 315 FLOPS/B!

一次搬来,大家轮流吃

解决了什么:极大地复用内存中搬进来的权重数据,将内存受限的 GEMV 转化为算力打满的 GEMM。
代价是什么:单次响应延迟增大,且显存会被庞大的中间激活值(Activation)挤爆。
下一站
10

波次对齐与长尾效应 (Wave & Tail Effect)

💡 一句话解释: 操场有 8 个篮球架,你来了 9 个班级,前 8 个班打完,剩下的 1 个班孤零零打,另外 7 个球架全闲置!
烦恼:尾巴只有零星任务,大半空转
波次1: 8 SM 满载 波次2 50%闲置 尾巴严重拉低均速

剩下的孤儿任务拖后腿

办法:分块对齐 SM 整数倍,多波次平摊
Wave 1 (100%) Wave 2 (100%) Wave 3 (100%) 利用率逼近 100%

算好倍数,全员齐下班

解决了什么:让线程块数量保持为 SM 数量的数倍(至少4倍以上),把尾波浪费降到最低。
代价是什么:矩阵维度或 Padding 大小必须精心对齐(如 8、16、64 的倍数),增加了工程约束。

📏 性能衡量尺:三大指标如何权衡?

在 GPU 体系中,没有任何一个优化是“免费的午餐”。性能的好坏永远在下面三个指标间相互取舍:

算力吞吐 TFLOPS 访存利用率 GB/s 单次时延 Latency 支点:硬件物理上限 (Ops/Byte 拐点)

🚀 张量核与大 Batch

大幅改善: 算力吞吐 TFLOPS

牺牲妥协: 单次请求延迟增加、显存占用激增

🧩 算子融合与共享内存

大幅改善: 访存带宽消耗降低

牺牲妥协: 寄存器占用增大、代码复杂度高

🌊 波次对齐与网格规划

大幅改善: 整体耗时平稳度、消除尾巴闲置

牺牲妥协: 需要对尺寸进行 Padding 填充额外显存

👶 零基础版:手把手算一次算术强度

许多初学者卡在“算术强度”这个概念。其实它非常直白,就像我们去超市买菜:

  1. 第一步(称重量): 看你的算法从显存里读取了多少字节、写回了多少字节。在 FP16 半精度下,每个数字占 2 字节(Byte)。
  2. 第二步(算工次): 统计工人总共挥了多少次铁锹。比如一次点乘既有“乘法”又有“加法”,算作 2 次浮点运算(2 FLOPs)。
  3. 第三步(做除法): 把“总运算次数”除以“总搬运字节数”,得到的数值就是 算术强度 (FLOPs / Byte)。
经典神经网络操作 算术强度 (FLOPs/Byte) 主要卡在哪(瓶颈) 大白话通俗比喻
ReLU 激活函数 0.25 (极低) 受限于内存 (Memory) 搬来 2 斤肉只剁了 0.5 刀,大部分时间都在路上
全连接层 (Batch=1) 1.0 (很低) 受限于内存 (Memory) 请了一百个厨师,只给一个客人煎一颗荷包蛋
最大池化 (3x3 窗口) 2.25 (低) 受限于内存 (Memory) 9 个数字看一眼只挑最大的一个,没任何重活
Layer Normalization < 10 (较低) 受限于内存 (Memory) 算均值方差,来回扫了三遍内存,计算量却很小
大矩阵乘 (Batch=512) 315 (超高) 受限于算力 (Arithmetic) 大卡车送来一次原料,流水线狂轰滥炸加工好几分钟

注:以上数据均基于 NVIDIA 官方性能白皮书实测基准(V100/A100 FP16 测试环境)。

🗺️ 一遍过完:官方进阶学习路线

所有资料已全部通过真实网络连接核验,涵盖从基础架构到矩阵乘、卷积优化全流程:

🚩 第一站:GPU 性能基础总纲 (DL Performance Guide)
为什么去: 建立 SM、算术强度、延迟隐藏的最底层直觉,搞懂三大性能瓶颈分类。
预计耗时: 15 分钟
立即前往 ↗
🚩 第二站:矩阵乘法的秘密 (Matrix Multiplication Guide)
为什么去: 掌握深度学习核心 GEMM、分块(Tiling)技术以及 Tensor Core 硬件调用规则。
预计耗时: 20 分钟
立即前往 ↗
🚩 第三站:全连接与线性层优化 (Fully-Connected Layers)
为什么去: 理解 Transformer 中最庞大的 Linear/MLP 模块如何对齐维度并跑满流水线。
预计耗时: 15 分钟
立即前往 ↗
🚩 第四站:卷积计算实战 (Convolutional Layers Guide)
为什么去: 学习视觉网络中卷积如何通过 Im2Col 巧妙转换为矩阵乘法加速。
预计耗时: 15 分钟
立即前往 ↗