@vivekgalatage: GPU Programming Fundamentals https://youtu.be/Cl2B_hmg4gA William Brandon, a performance engineer at Anthropic, outline…

X AI KOLs Timeline 新闻

摘要

William Brandon(Anthropic 性能工程师)的 GPU 编程基础讲座摘要,强调理解 GPU 硬件的流式多处理器(SM)结构是预测性能的关键,而非仅从线程块/线程的软件抽象出发。

GPU Programming Fundamentals https://t.co/dig3Ldb73D William Brandon, a performance engineer at Anthropic, outlines fundamental hardware-first principles for GPU programming - one of the best lectures. https://t.co/lQF7LL2ECl
查看原文
查看缓存全文

缓存时间: 2026/08/04 10:07

GPU Programming Fundamentals

https://t.co/dig3Ldb73D

William Brandon, a performance engineer at Anthropic, outlines fundamental hardware-first principles for GPU programming - one of the best lectures. https://t.co/lQF7LL2ECl


TL;DR: GPU 编程性能的关键不是把程序想象成任意数量的线程块和线程,而是理解 GPU 硬件本质上是由有限数量的流式多处理器(SM)组成的。

演讲者与课程背景

这场演讲由 William Brandon 带来。他目前是 Anthropic 的性能工程师,从 MIT 博士项目中休假,研究重点是通过内核优化和模型架构改进来提高 LLM 的效率。去年秋天,他参与创建并教授了 MIT 历史上第一门加速计算课程,并主导了其中基于 CUDA 的编程作业设计。在进入研究生院之前,他曾在 NVIDIA 从事深度学习编译器相关工作。

本次演讲内容主要改编自 MIT 课程 6S4 前两周的内容和亮点。这门课由 William Brandon、他的导师 Dr. Kelly 以及另一位博士生 Nikita Lazrov 共同创建。所有材料都在网上公开;演讲者特别推荐实验 1 和实验 2,认为它们是本场演讲内容的扩展版。

目标听众

这场演讲面向的是:

  • 任何打算很快写 kernel、或者未来某个时候想写 kernel 的人;
  • 目前仍在建立对 GPU 编程理解基础的人;
  • 机器学习方向、对编写 kernel 有好奇心但还没有实际经验的人。

对于更有经验的听众,很多内容可能比较基础,但演讲者希望它能够帮助大家以稍微不同的方式来看待这些概念,或者带来额外的清晰度。

由于核心内容是“如何思考 GPU 硬件性能”,这些原理适用于任何编写 GPU 程序的语言:无论是直接使用 CUDA 编写 kernel,还是使用更高级的 DSL,例如 Triton 或 NVIDIA 的 CUTLASS 4。因为它们都是底层平台的原则。

CUDA 程序的标准视角

从 CUDA 编程语言的接口表面来看,一个 CUDA 程序就是:

  1. 用类似 C 的语言定义一个函数;
  2. 通过一个启动命令,在 GPU 上并行运行这个被定义函数的许多副本。

启动 CUDA kernel 时,通常需要指定两个参数:

  • 线程块(block)的数量;
  • 每个线程块中线程(thread)的数量。

然后 GPU 会并行运行所有这些块中的所有线程,完成计算。

从软件角度看,这个模型大致是:有一组块,每个块内有一组线程,每个线程都是一个微小程序,与其他线程并行执行工作。

谜题一:降低块内线程数,性能没有变化

假设有一个 kernel,运行得相当快,例如用来做向量加法。当前的启动配置是:

  • 128 个线程块;
  • 每个块 1024 个线程。

1024 是 NVIDIA 允许一个线程块拥有的线程数上限。

现在做一个实验:把每个块的线程数从 1024 降到 256。

初学者可能会想,既然线程块最多可以有 1024 个线程,现在只用 256 个,也许只利用了硬件 25% 的能力,运行速度会慢 4 倍。

但实际结果往往是:对于许多 kernel,从 1024 降到 256,运行速度几乎一样。

这看起来有点神秘:程序运行在更少的线程上,每个线程做更多的串行工作,速度却不变。那么另外四分之三的线程到底在做什么?

谜题二:略微增加线程块,性能却大幅下降

回到原始配置:128 个线程块,每个块 1024 个线程。

这次不调整线程数,而是调整线程块数量:从 128 个增加到 133 个。这个增长大约只有 4%,看起来只不过是把问题稍微不同地切分了一下,运行在稍微多一点的块上,似乎不太可能对性能产生太大影响。

但如果真的运行这个实验,尤其是在 H100 GPU 上运行,对于某些 kernel,线程块数量增加 4%,运行速度却可能慢 2 倍。

这两个谜题说明:仅仅用“线程”和“线程块”来思考 CUDA 程序,是一个非常有用的抽象,因为它们是 NVIDIA 提供的、你必须与之打交道的概念;但如果你想预测和推理程序的性能,这个模型非常不完整。

GPU 的本质:一堆小方块

比起问“什么是 CUDA,我该怎么用”,更好的问题是:

什么是 GPU,它能做什么?

这是一张来自 NVIDIA 的 GPU 板卡图片。板卡上有各种电子元件。但如果你放大看真正的 GPU 芯片,会注意到一个明显的视觉特征:GPU 由一堆小方块组成。

演讲者强调,如果只能用一句话描述 GPU 是什么,那么更好的心理画面是:

GPU 是一堆小方块,数量固定。

这个画面远远好过把 GPU 想象成一个“运行着成片线程块和线程、而且数量可以随意设置的模糊团块”。

这些小方块是什么?

NVIDIA 称它们为流式多处理器,通常缩写为 SM

那到底有多少个 SM?大约一百个。在这张图中,die 上有 144 个。实际上,如果你去买一个 H100,然后问它“你有多少个 SM?”,它会告诉你大约 132 个,因为 144 个 SM 中有一些没有通过制造过程,所以会在软件中被禁用。对于市面上大多数 GPU,获得的 SM 数量大概在两倍范围内变化。

Source: @vivekgalatage: GPU Programming Fundamentals

相似文章

https://www.youtube.com/watch?v=aE0onltJlOo

YouTube AI Channels

该讲座介绍了GPU架构作为SIMD(向量/数组)处理器的灵活演化,讨论了数据并行性、存储体分组、体冲突、串行瓶颈以及SIMD指令历史(如MMX),强调GPU如何利用数据并行性并应对串行瓶颈。