并行通天
你以为GPU有数千核心就是数千倍加速。可这数千核心,喂得过数据吗?带宽是天花板——算术强度才是灵魂。
雾锁并行之门
门楣上刻着四个字:"并行通天。"门内没有整洁的走廊,只有一片翻涌的紫色雾——雾的尽头,矗立一面半透明的光壁,像一堵无声的悬崖。雾凝成一个人形,通体由无数条数据流构成,但没有一条流得通——它们全部撞在光壁上,碎成浪花。
「来得好。你既信'核心越多越快',与我赌一局——这五样任务,哪一样堆了核心也不加速?」
「别急着下注。你以为并行就是多开几个核心——先把这五样点一遍看看。」
并行加速反直觉挑战器
反直觉下注(五选一)→ 加速曲线打脸 → 雾账记账 → 天花板图谱拼合
频率之墙 · 并行之形
石径尽头是一台悬空的主频仪表盘,指针停在 3.5 GHz。诺依曼老祖站在盘边,带宽之壁的光从壁面渗过来,冷冷补了一句。
「1974年Dennard说,频率翻倍、电压跟着降,功耗不变。2006年这条路断了。你猜,继续拉频率会怎样?」
「拉吧。把频率推到8 GHz。看看你的功耗账单。」
频率墙推演 · Flynn四象限
预测功耗增长 → 推频率旋钮看P∝f³ → Flynn四象限拖拽归位
Flynn 分类 · 四象限归位
通天塔 · SIMT锁步
墙后是一座悬空的塔,塔身由无数微小的光点构成——每个光点是一个核心。诺依曼老祖指着塔身,带宽之壁的光渗进塔基。
「NVIDIA A100,108个SM,6912个CUDA核心。但它不是6912个独立CPU——它用一种叫SIMT的把戏管着它们。」
「6912个核心。你觉得你能拿到6912倍加速?记住这个数字。」
SIMT锁步流水线动画器
展开SM → 拖32线程进warp槽 → 锁步执行 → GPU参数归位
warp 锁步实验 · 拖线程卡填满 warp 槽
GPU 参数表 · A100
线程之海 · CUDA编程
塔顶是一片无垠的网格——数以万计的方块整齐排列,每个方块里嵌着线程,像一片被切分的海。诺依曼老祖递给你一张空白的内核卷轴。
「thread、block、grid。三件事。线程是最小执行单元,块是一组能共享内存的线程,网格是所有块的集合。写一个向量加法。」
「写吧。写完你会觉得自己无所不能。记住这种感觉。」
CUDA 内核组装 · 向量加法
拖代码块组装内核 → 索引公式 → 启动配置(block须32倍数)
启动配置 <<>>
层次之塔 · CUDA内存
内核卷轴亮起,塔身内部显出一座四层高塔——从顶到底依次闪烁。诺依曼老祖指着塔身。
「寄存器最快,共享内存次之,常量内存只读缓存,全局内存最慢——差13倍。数据放哪一层,决定你的内核跑多快。」
「全局内存~400 cycles,共享内存~30 cycles。你以为都一样?差13倍——这13倍就是我的领地。」
内存层次之塔 · 四级归位
拖内存卡到对应层级 → 延迟对比弹出 → 数据该放哪一层
Roofline · 算术强度
你站在带宽之壁面前。壁面比想象的更近、更高、更冷。诺依曼老祖按下"全量运行"——你的矩阵乘法、归约、排序内核同时启动。6912个核心亮起紫光。但数据从HBM涌向核心的通道——只有1550 GB/s。
「你的核心算力是9.7 TFLOPS。你的带宽是1550 GB/s。算术强度拐点是6.26 FLOP per Byte。你的矩阵乘法算术强度只有4。4 < 6.26。你的核心在等数据。你被钉在这里了。」
「你被钉住了。但墙上有刻度——Roofline。读懂它,才知道瓶颈在哪。」
Roofline 算术强度追踪器
拖tile滑块 → 矩阵乘法标记沿X轴移动 → 过拐点6.26裂缝愈合
分解之术 · 归约与排序
网格之海深处,一块巨大的石板上刻着一张DAG——节点是任务,边是依赖。诺依曼老祖指着DAG,带宽之壁的光在边上流动。
「并行不是多开几个核心跑循环。你得先把问题分解成没有依赖的子任务。这条最长路径,叫关键路径——它决定你最少要花多少时间。」
「归约的前几轮确实漂亮。但最后几轮呢?剩32个数时,一个warp就够了——剩下的2159个核心在等。」
DAG分解 · 归约树 · Brent定理
拆DAG从串行链变树形 → 拖p滑块验证Brent → 归约树最后warp串行
DAG 分解 · 串行链 → 树形
Brent 定理 · Tₚ ≥ max(T₁/p, T∞)
归约树 · 1024 元素 → log₂(1024)=10 轮
双范式 · OpenMP 与 MPI
矩阵墙后是一条分岔路——左边通向一台多核机器,右边通向一排用光缆相连的节点。诺依曼老祖递来两把钥匙。
「OpenMP管一台机器里的核心——共享内存,线程同看一份数据。MPI管多台机器之间——分布式内存,每个进程有独立地址空间,要显式传消息。」
「共享内存有它的墙——核多了要锁。分布式内存也有它的墙——节点间通信就是另一道带宽之壁。」
OpenMP vs MPI · 范式对照
切换范式 → 同一段代码两种写法 → 共享 vs 分布式特征卡归位
性能之秤 · Amdahl定律
带宽之壁的表面浮出一杆秤——一端是计算,一端是访存。诺依曼老祖站在秤边,带宽之壁的声音从壁面渗出。
「你的内核有串行段——初始化、最终归并、同步屏障。Amdahl说:如果10%的代码是串行的,不管你有多少核心,最多只能快10倍。」
「你补不补那道裂缝?裂缝在问你——你的矩阵乘法,算术强度到底卡在哪里?」
Amdahl 定律推导组装器
拖公式块组装5步推导链 → 拖f滑块看曲线 → 补核心之伤
核心之伤修复 · 填入算术强度
Boss 战 · 带宽之壁三问
带宽之壁从远处的悬崖向你压来,凝成一道人形光壁——通体钢灰,没有五官,只有数据流在表面撞击碎裂的纹路。它开口了,声音像所有数据撞墙的回声。
「我不住在计算慢里。我住在你'算得快就够了'的幻觉里。你在每一处都欠了我的账——现在,一笔笔还。」
渊账累计 0 笔 · 三问全对后清零
通天之境 · HPC远眺
壁面碎成金色尘埃,视野豁然开朗——你看见无数计算节点以光缆相连,排列成一座通天之塔。诺依曼老祖递来两把钥匙,远处一道量子涟漪在空间中一闪而过。
「单机GPU之上,还有HPC集群。Frontier超算,1.194 EFLOPS,全球第一。但它的每个节点之间,靠InfiniBand光缆传消息——那又是另一道带宽之壁。」
HPC集群拓扑 · 知识图谱点亮
拼集群拓扑 → 点亮知识碎片 → 境界突破