第二十七课:GPU 架构学习总结与统一分析框架
最后一课将把前面所有内容压缩成一套统一分析框架,并给出面向 GPU 架构与 RTL 设计的后续实践路线。
Tag
共 28 篇文章。
最后一课将把前面所有内容压缩成一套统一分析框架,并给出面向 GPU 架构与 RTL 设计的后续实践路线。
这一课从 RTL 设计角度搭建一颗最小可运行的 SIMT GPU。重点是模块边界、状态机和实现顺序,而不是一开始复制完整商用 GPU。
这一课是倒数第三课,重点解释“计算量更少”为什么不一定更快,以及不规则访存、原子冲突和负载不均衡为何会削弱 GPU 优势。
这一课讲 Transformer 中计算量最大的 MLP 模块,以及 GEMM Epilogue、GELU/SiLU/SwiGLU 融合和张量并行的数据流。
这一课讲 LayerNorm 与 RMSNorm;随后我会把课程收束到少数几个最必要章节,避免继续无限展开。
这一课把 Reduction 应用到 Softmax 和 Attention,并推导 FlashAttention 如何用分块与在线 Softmax 避免保存完整的 N x N 注意力矩阵。
这一课用 Reduction 实战串联原子操作、Shared Memory、分支发散、Warp Shuffle、向量化加载和多级归约。
这一课进入实际性能诊断:如何从 Nsight Compute 的报告中判断 Kernel 是计算受限、带宽受限,还是因为延迟与调度停顿而变慢。
这一课解释 CUDA 编译器如何从源代码生成更高效的 GPU 指令,以及这些优化怎样影响寄存器、分支、访存和 Occupancy。
前面讨论的是 GPU 硬件如何执行指令,但程序员通常写的是 CUDA C++:
这一课按时间线梳理 NVIDIA GPU 架构演进,重点不是背型号,而是看每一代解决了什么瓶颈。
这一课把前面的 SM、缓存、显存控制器和图形单元放回整块 GPU 中,学习如何阅读一张完整的 GPU 架构框图。
这一课转向 GPU 的图形起源,讲一幅三维场景如何经过顶点处理、光栅化、像素着色和深度测试,最终变成屏幕图像。
这一课进入多 GPU 系统,先讲 PCIe、NVLink、NVSwitch,再讲数据并行、张量并行、流水线并行和 AllReduce,最后用 GB200 NVL72 串起来。
这一课把调度层次串起来:从 CPU 提交 Kernel,到 Stream、Grid、Block,再到 SM 内部的 Warp 调度。
这一课讲 Block 如何进入 SM、哪些硬件资源限制并发度,以及 Occupancy 为什么只是性能指标之一。
这一课继续深入 GPU 的内存系统,重点解释一个 Warp 的访存请求如何变成 Cache Line、内存事务,并最终到达 GDDR 或 HBM。
这一课讲 Tensor Core 和低精度计算:先理解不同数值格式,再看 MMA 指令、混合精度累加,以及 Blackwell 中 Transformer Engine 的作用。
这一课把矩阵乘法继续推进到卷积,重点解释卷积的数据组织、常见映射方式,以及为什么不同卷积在 GPU 上效率差异很大。
这一课用矩阵乘法把前面学过的线程、Block、Shared Memory、寄存器和计算强度串联起来。
这一课建立 GPU 性能分析的核心框架:先判断程序受算力限制,还是受显存带宽限制。
这一课讲 GPU 中的数据依赖与数据冒险,重点区分“依赖本身”和“流水线造成的冲突”,并说明 Scoreboard、原子操作和内存屏障如何保证正确性。
这一课继续讲控制流:同一个 Warp 遇到 if/else、循环和提前退出时,硬件如何处理,以及分支发散为什么会降低效率。
这一部分进入 SM 内部,重点讲清楚 Warp Scheduler、发射、执行单元、Scoreboard 和流水线之间的关系。
这一部分讲 GPU 的存储层次,以及为什么同一个程序只是改变数据访问方式,性能就可能相差数倍。
下面继续讲 GPU 程序从启动到执行完成的全过程,重点理清 Kernel、Grid、Block、Warp、Thread 与 SM 的对应关系。
先从“GPU为什么存在”讲起,再逐步进入线程、SIMT、SM、Warp、存储层次和指令执行。先建立整体框架,不急着看具体英伟达架构。
我会用最基础的层次,把 Blackwell 的定位、核心改进和它解决什么问题讲清楚。