已学完
💡 一句话解释: SM 是 GPU 内部一个个独立运作的“现代化计算车间”,每个车间里塞了成百上千个干活小核心。
办法:分身设立上百个车间
千军万马同时算
解决了什么:彻底打破单核算力上限,利用成百上千个并行核心吞吐海量数据。
代价是什么:单核心非常弱小,遇到只能一步一步算的复杂逻辑就会瘫痪。
已学完
💡 一句话解释: 既然有数万个工人,就不能一个个指挥,必须打包成“班组(线程块)”整队派发给车间。
办法:统一打包成整齐班组
打包分派,井然有序
解决了什么:实现了硬件两级层次化调度,一个车间(SM)直接承接一个或多个完整班组。
代价是什么:程序员必须精心设计 Block 大小,分得不均匀就会出现部分车间饿死。
已学完
💡 一句话解释: 去大仓库取货要等 400 步,工人不等它!直接换另一组现成货物的工人上台干活。
烦恼:货物在路上,工人发呆
等外卖送来,工期全耽误
办法:你等快递,换他先算!
谁有货谁上,车间永不歇
解决了什么:把漫长刺眼的显存搬运延迟完全掩盖在其他线程的火热计算之中。
代价是什么:需要常驻海量的线程与庞大的寄存器堆,工人数量必须远多于物理执行管线。
已学完
💡 一句话解释: 原来是一个个数字算乘法加法,张量核是直接造出“矩阵模具”,一次敲下一整个矩阵积!
办法:专属矩阵冲压机一键搞定
矩阵成块印,一口吃一大片
解决了什么:将深度学习最核心的 GEMM(矩阵乘加)算力密度推高了整整一个数量级。
代价是什么:只能算固定形状和低精度的矩阵块(如 FP16/INT8),对普通加法激活函数完全无用。
已学完
💡 一句话解释: 别总让工人跑去几公里外的大仓库取货,直接在车间桌子上放个“随手货架”!
烦恼:算完丢出去,下秒又跑去拿
反复出差,路费贵上天
解决了什么:让同车间工人高效共享中间结果,避免昂贵的显存反复读写(显存带宽节约 80%+)。
代价是什么:容量极其金贵(每个 SM 仅几十到一两百 KB),用超了就会限制同时干活的线程数。
已学完
💡 一句话解释: 搬来 1 斤菜,你炒了几次勺?算术强度 = 每搬运 1 字节数据能支撑多少次计算。
烦恼:盲目优化,根本不知卡在哪
头痛医脚,优化半天没快
办法:屋顶分界线,一测便知
画出拐点,对症下药
解决了什么:定量给出分水岭:强度低于 GPU 拐点必定受限于内存,高于拐点才受限于算力。
代价是什么:实际程序存在控制流指令和多次重复读取,理论计算只是初阶上限估计。
已学完
💡 一句话解释: ReLU 激活、加偏置这些小零碎算术极低,不要每步都进出显存,顺手在寄存器里一口气全做完!
烦恼:加法存一次,ReLU再存一次
倒腾两次,全是搬运
解决了什么:消除了逐元素算子在显存与计算单元之间的冗余访存,速度飙升数倍。
代价是什么:算子组合爆炸,编译器必须动态生成并维护复杂的融合代码模板。
补一下
💡 一句话解释: 求一万个数字的和或最大值时,不能让所有人排队加到同一个变量上,必须打“淘汰赛”!
办法:分层两两对决,对数级收缩
两两分组,极速晋级
解决了什么:在共享内存中通过树状规约完成并行聚合,彻底消除原子锁瓶颈。
代价是什么:越往后干活的有效线程越少(出现空闲分支),依然很难摆脱访存受限本质。
已学完
💡 一句话解释: 搬一次几百 MB 的模型权重,如果只服务 1 个用户(Batch=1),算力全在摸鱼;必须凑一车人一起算!
烦恼:Batch=1,搬巨大权重只算一笔
大卡车送货,只装一粒米
办法:Batch=512,一份权重服务五百人
一次搬来,大家轮流吃
解决了什么:极大地复用内存中搬进来的权重数据,将内存受限的 GEMV 转化为算力打满的 GEMM。
代价是什么:单次响应延迟增大,且显存会被庞大的中间激活值(Activation)挤爆。
下一站
💡 一句话解释: 操场有 8 个篮球架,你来了 9 个班级,前 8 个班打完,剩下的 1 个班孤零零打,另外 7 个球架全闲置!
烦恼:尾巴只有零星任务,大半空转
剩下的孤儿任务拖后腿
办法:分块对齐 SM 整数倍,多波次平摊
算好倍数,全员齐下班
解决了什么:让线程块数量保持为 SM 数量的数倍(至少4倍以上),把尾波浪费降到最低。
代价是什么:矩阵维度或 Padding 大小必须精心对齐(如 8、16、64 的倍数),增加了工程约束。