▶ 原文链接

第四讲:计算与内存基础

来源: Youtube | Tom Vman | 2024-02-05 分类: 其他 原文发表: Feb 05, 2024 纪要生成: 2026-03-05


全集重点


嘉宾/话题简介

本期嘉宾Tom Vman是技术博客learn apparat作者,经营独立咨询公司,即将加入Lightning AI团队。本次是CUDA模式读书会第四讲,围绕《大规模并行程序设计》教材第4、5章内容,讲解GPU计算与内存基础,帮助开发者编写高性能CUDA核函数。内容涵盖GPU硬件架构、线程调度规则、内存层级、分块优化等实操知识点,适合PyTorch等框架的底层性能优化从业者学习。


分节详述

00:00 开场与GPU计算架构概述

本节重点 - 对比CPU与GPU核心架构差异,介绍流多处理器(SM)的硬件构成 - 说明消费级GPU与数据中心GPU的核心差异,指出FP64算力的性能短板 - 讲解RTX 3090等主流消费级GPU的SM数量、缓存配置参数

详细精要

💬 精华片段(中文)

"the fp64 rate is 1/64 of the fp32 T flop right um and this is because it just doesn't it has two compute unit units for the for 64bit floating points just to make the programs run at all but they're not going to be fast"


05:19 线程、线程束与线程块调度规则

本节重点 - 讲解线程块与SM的绑定规则,说明线程块大小选择对GPU占用率的影响 - 解释线程束的构成与线性编号规则,对比Nvidia与AMD的线程组术语差异 - 介绍线程束分歧的产生原因与性能损耗,说明新架构的优化逻辑

详细精要

💬 精华片段(中文)

"if you have thread Divergence this part here there's part of the GPU sitting idle whenever there's one of those W spots and so uh you want to avoid thread warp Divergence if you can"


17:03 GPU占用率优化与参数查询

本节重点 - 讲解GPU占用率的定义,说明影响占用率的核心约束条件 - 介绍寄存器、共享内存使用对线程调度的影响,以及launch_bounds编译指令的作用 - 说明PyTorch与CUDA API的硬件参数查询方法,避免硬编码Magic Number

详细精要

💬 精华片段(中文)

"previously there was an Excel sheet for the occupancy calculation now this is part of inside compute and I uh Venture that we're going to see some of that in the profiling uh sessions that we're going to take"


22:15 GPU内存架构与核函数融合优化

本节重点 - 分析PyTorch程序的时间分布,说明GPU利用率不足的常见排查方向 - 讲解核函数融合的性能提升原理,介绍PyTorch历代融合器的发展与适用场景 - 对比GPU各级内存的带宽与容量差异,说明减少全局内存访问的核心优化思路 - 说明核函数融合带来的数值精度差异原因,明确精度误差的正常范围

详细精要

💬 精华片段(中文)

"this avoiding accesses to Global memory also as a core ingredient of flash attention"


36:08 屋顶线模型与性能上限评估

本节重点 - 讲解理论性能上限(光速)的测算方法,对比实际运行性能判断优化空间 - 介绍屋顶线模型的核心逻辑,帮助开发者区分计算 bound 与内存 bound 核函数 - 说明GPU各级内存的适用场景与声明方式

详细精要

💬 精华片段(中文)

"this is jokingly called the speed of light because it's the theoretical limit uh for the speed"


45:24 共享内存分块(Tiling)优化方法

本节重点 - 讲解矩阵乘法的访存特征,说明分块优化的核心逻辑 - 介绍分块矩阵乘法的实现细节,以及线程同步的注意事项 - 说明非对齐尺寸矩阵的填充适配方法,以及分块优化的性能收益

详细精要

💬 精华片段(中文)

"the idea here is to uh of tiling is to read these parameters once and put them into shared memory and then try to reuse the same value red from the uh Global memory"


56:07 总结与后续预告

本节重点 - 汇总本次课程的核心知识点,梳理GPU性能优化的核心方向 - 预告下节课内容为合并内存访问优化,介绍扩展练习方向

详细精要

💬 精华片段(中文)

"in the next chapter we can see how to organize read and write so they are all consecutive and aligned to Global memory location so we have qualis memory access and we'll see a lot about how this works in detail"


专业术语注释

术语 解释
Streaming Multiprocessor (SM,流多处理器) GPU的核心计算单元,集成大量ALU、寄存器、调度单元,可并行运行数千个线程,是GPU并行计算的核心硬件模块
Warp(线程束) Nvidia GPU的最小调度单位,固定为32个线程,同一线程束内的线程共享调度资源,执行相同指令时性能最优
Wavefront(波前) AMD GPU对线程束的称呼,默认大小为64线程,可通过编译器参数修改为32线程
Warp Divergence(线程束分歧) 同一线程束内的线程执行不同分支或不同循环迭代次数,导致部分计算单元闲置,性能下降的现象
Occupancy(占用率) GPU硬件单元的实际利用率,越高说明硬件资源利用越充分,性能通常越好
Roofline Model(屋顶线模型) 一种性能分析模型,通过计算强度区分核函数是计算 bound 还是内存 bound,指导优化方向
Tiling(分块/切片) 一种内存优化方法,将大矩阵/大张量拆分为小分块,加载到高速共享内存中复用,减少全局内存访问次数
__syncthreads() CUDA内置线程同步函数,同步同一个线程块内的所有线程,确保所有线程完成前面的操作后再继续执行
FP32/FP64 32位单精度浮点数、64位双精度浮点数,消费级GPU的FP64算力远低于FP32,应尽量避免在消费级GPU上使用FP64
Shared Memory(共享内存) GPU的高速片上内存,每个SM独立配备,带宽是全局内存的10倍以上,容量较小,由同一个线程块内的所有线程共享
Global Memory(全局内存) 通常所说的GPU显存,容量大但带宽较低,是核函数输入输出的主要存储介质
Kernel Fusion(核函数融合) 将多个独立的小核函数合并为一个核函数,减少中间结果的全局内存读写,提升性能的优化方法
launch_bounds CUDA编译指令,用于告知编译器核函数的线程块大小、最大线程块数量等参数,辅助编译器优化寄存器分配

延伸思考

  1. 尝试查询自己常用GPU的FP32/FP64算力、显存带宽、单个SM最大线程数等参数,测算常用核函数的理论性能上限,评估当前实现的优化空间。
  2. 测试不同线程块大小(128、256、512、1024)对核函数性能的影响,结合Nsight Compute工具观察SM占用率的实际变化。
  3. 尝试将业务中常用的多步逐点算子手动融合,对比融合前后的性能差异,分析内存开销的降低幅度。
  4. 尝试实现分块优化的矩阵乘法,测试不同分块大小(8、16、32)的性能差异,总结分块大小选择的核心依据。

原文发表:Feb 05, 2024  ·  纪要生成:2026-03-05