SICI · 化神一层 · 第二十三章

并行计算与高性能计算 · 化神一层·并行通天

你以为GPU有数千核心就是数千倍加速。可这数千核心,喂得过数据吗?带宽是天花板——算术强度才是灵魂。

带宽之壁低语:「你既信核心越多越快,与我赌一局——这五样任务,哪一样堆了核心也不加速?」
序章

雾锁并行之门

堆核心就能线性加速吗?五道任务,哪样堆了核心也白搭

门楣上刻着四个字:"并行通天。"门内没有整洁的走廊,只有一片翻涌的紫色雾——雾的尽头,矗立一面半透明的光壁,像一堵无声的悬崖。雾凝成一个人形,通体由无数条数据流构成,但没有一条流得通——它们全部撞在光壁上,碎成浪花。

虚拟化之镜,虚拟机监控器
带宽之壁 带宽之壁

「来得好。你既信'核心越多越快',与我赌一局——这五样任务,哪一样堆了核心也不加速?」

诺依曼老祖 诺依曼老祖

「别急着下注。你以为并行就是多开几个核心——先把这五样点一遍看看。」

并行加速反直觉挑战器

反直觉下注(五选一)→ 加速曲线打脸 → 雾账记账 → 天花板图谱拼合

带宽之壁逼你下注:五样任务,哪一样堆了核心也不加速?逐个点击,看加速曲线。
第一幕 · 自信→崩塌

频率之墙 · 并行之形

P∝f³ 功耗立方爆炸 · SISD/SIMD/MISD/MIMD 四象限归位

石径尽头是一台悬空的主频仪表盘,指针停在 3.5 GHz。诺依曼老祖站在盘边,带宽之壁的光从壁面渗过来,冷冷补了一句。

诺依曼老祖 诺依曼老祖

「1974年Dennard说,频率翻倍、电压跟着降,功耗不变。2006年这条路断了。你猜,继续拉频率会怎样?」

带宽之壁 带宽之壁

「拉吧。把频率推到8 GHz。看看你的功耗账单。」

频率墙推演 · Flynn四象限

预测功耗增长 → 推频率旋钮看P∝f³ → Flynn四象限拖拽归位

频率翻倍,功耗怎么涨?
第一幕 · 探索

通天塔 · SIMT锁步

6912核心的秘密 · warp=32线程锁步执行 · SM/CUDA核心/寄存器/共享内存

墙后是一座悬空的塔,塔身由无数微小的光点构成——每个光点是一个核心。诺依曼老祖指着塔身,带宽之壁的光渗进塔基。

诺依曼老祖 诺依曼老祖

「NVIDIA A100,108个SM,6912个CUDA核心。但它不是6912个独立CPU——它用一种叫SIMT的把戏管着它们。」

带宽之壁 带宽之壁

「6912个核心。你觉得你能拿到6912倍加速?记住这个数字。」

SIMT锁步流水线动画器

展开SM → 拖32线程进warp槽 → 锁步执行 → GPU参数归位

第一幕 · 掌控膨胀

线程之海 · CUDA编程

线程/线程块/网格 · threadIdx+blockIdx索引 · 启动配置<<<>>>

塔顶是一片无垠的网格——数以万计的方块整齐排列,每个方块里嵌着线程,像一片被切分的海。诺依曼老祖递给你一张空白的内核卷轴。

诺依曼老祖 诺依曼老祖

「thread、block、grid。三件事。线程是最小执行单元,块是一组能共享内存的线程,网格是所有块的集合。写一个向量加法。」

带宽之壁 带宽之壁

「写吧。写完你会觉得自己无所不能。记住这种感觉。」

CUDA 内核组装 · 向量加法

拖代码块组装内核 → 索引公式 → 启动配置(block须32倍数)

第二幕 · 暗藏隐患

层次之塔 · CUDA内存

全局/共享/寄存器/常量 · 延迟差13倍 · 数据该放哪一层

内核卷轴亮起,塔身内部显出一座四层高塔——从顶到底依次闪烁。诺依曼老祖指着塔身。

诺依曼老祖 诺依曼老祖

「寄存器最快,共享内存次之,常量内存只读缓存,全局内存最慢——差13倍。数据放哪一层,决定你的内核跑多快。」

带宽之壁 带宽之壁

「全局内存~400 cycles,共享内存~30 cycles。你以为都一样?差13倍——这13倍就是我的领地。」

内存层次之塔 · 四级归位

拖内存卡到对应层级 → 延迟对比弹出 → 数据该放哪一层

第二幕 · 第一崩塌(带宽墙)

Roofline · 算术强度

算得快不等于跑得快 · 拐点6.26 FLOP/Byte · 核心之伤形成

你站在带宽之壁面前。壁面比想象的更近、更高、更冷。诺依曼老祖按下"全量运行"——你的矩阵乘法、归约、排序内核同时启动。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裂缝愈合

A100: 9.7 TFLOPS · 1550 GB/s · 拐点 6.26 FLOP/Byte
tile_size = 8
算术强度 = 1.0 FLOP/Byte (内存受限)
第二幕 · 方法觉醒

分解之术 · 归约与排序

工作-跨度模型 T₁/T∞ · Brent定理 · 归约树最后warp串行

网格之海深处,一块巨大的石板上刻着一张DAG——节点是任务,边是依赖。诺依曼老祖指着DAG,带宽之壁的光在边上流动。

诺依曼老祖 诺依曼老祖

「并行不是多开几个核心跑循环。你得先把问题分解成没有依赖的子任务。这条最长路径,叫关键路径——它决定你最少要花多少时间。」

带宽之壁 带宽之壁

「归约的前几轮确实漂亮。但最后几轮呢?剩32个数时,一个warp就够了——剩下的2159个核心在等。」

DAG分解 · 归约树 · Brent定理

拆DAG从串行链变树形 → 拖p滑块验证Brent → 归约树最后warp串行

DAG 分解 · 串行链 → 树形

第二幕 · 范式之辨

双范式 · OpenMP 与 MPI

共享内存 vs 分布式内存 · #pragma omp vs MPI_Send/Recv

矩阵墙后是一条分岔路——左边通向一台多核机器,右边通向一排用光缆相连的节点。诺依曼老祖递来两把钥匙。

诺依曼老祖 诺依曼老祖

「OpenMP管一台机器里的核心——共享内存,线程同看一份数据。MPI管多台机器之间——分布式内存,每个进程有独立地址空间,要显式传消息。」

带宽之壁 带宽之壁

「共享内存有它的墙——核多了要锁。分布式内存也有它的墙——节点间通信就是另一道带宽之壁。」

OpenMP vs MPI · 范式对照

切换范式 → 同一段代码两种写法 → 共享 vs 分布式特征卡归位

第三幕 · 第二崩塌 · 理性觉醒

性能之秤 · Amdahl定律

S=1/(f+(1-f)/p) · 串行比例f决定上限 · 核心之伤修复

带宽之壁的表面浮出一杆秤——一端是计算,一端是访存。诺依曼老祖站在秤边,带宽之壁的声音从壁面渗出。

诺依曼老祖 诺依曼老祖

「你的内核有串行段——初始化、最终归并、同步屏障。Amdahl说:如果10%的代码是串行的,不管你有多少核心,最多只能快10倍。」

带宽之壁 带宽之壁

「你补不补那道裂缝?裂缝在问你——你的矩阵乘法,算术强度到底卡在哪里?」

Amdahl 定律推导组装器

拖公式块组装5步推导链 → 拖f滑块看曲线 → 补核心之伤

第三幕 · 最高潮

Boss 战 · 带宽之壁三问

三问对决 · 排除刻痕收网 · 雾账清算 · 算术强度是灵魂

带宽之壁从远处的悬崖向你压来,凝成一道人形光壁——通体钢灰,没有五官,只有数据流在表面撞击碎裂的纹路。它开口了,声音像所有数据撞墙的回声。

带宽之壁 带宽之壁

「我不住在计算慢里。我住在你'算得快就够了'的幻觉里。你在每一处都欠了我的账——现在,一笔笔还。」

渊账累计 0 笔 · 三问全对后清零

第三幕 · 收束

通天之境 · HPC远眺

集群拓扑 · InfiniBand互连 · 量子涟漪 · 化神一层·并行通天·圆满

壁面碎成金色尘埃,视野豁然开朗——你看见无数计算节点以光缆相连,排列成一座通天之塔。诺依曼老祖递来两把钥匙,远处一道量子涟漪在空间中一闪而过。

诺依曼老祖 诺依曼老祖

「单机GPU之上,还有HPC集群。Frontier超算,1.194 EFLOPS,全球第一。但它的每个节点之间,靠InfiniBand光缆传消息——那又是另一道带宽之壁。」

HPC集群拓扑 · 知识图谱点亮

拼集群拓扑 → 点亮知识碎片 → 境界突破