GPU 架构与指令集
执行、存储与数据通路
核心解释
GPU 把大量线程组织起来,在许多计算单元上执行。NVIDIA 的 SM 包含调度器、寄存器和多种执行资源。线程按 warp 组织;访存、普通算术和矩阵乘加各有对应的数据通路。[1]
数据从设备内存经过缓存,进入指令需要的存储位置。寄存器保存线程状态,shared memory 支持线程协作。设计 kernel 时,要同时安排计算分工、数据复用和同步。
架构演进会改变这些安排。Hopper 的 TMA 支持张量异步搬运,WGMMA 让 warpgroup 协作完成异步矩阵乘加。Blackwell SM100 引入 tcgen05 与 TMEM,改变累加器存放的位置和矩阵指令的组织方式。具体能力要对应到芯片的计算能力与指令支持范围。[2] [3]
PTX 描述虚拟指令与执行规则,SASS 对应编译后的机器指令。阅读一段 kernel,可以沿着“数据在哪里、谁发出指令、何时完成、谁接着使用”这条线追踪。
性能分析先看计算量与数据搬运量。Roofline 模型用计算峰值和内存带宽给出吞吐上界,再结合调度、缓存和依赖关系解释实际表现。这里的 是相对于所分析存储层的算术强度, 是该层带宽。[4]
资料
How To Scale Your Model:GPU 图解 ↗
先看 GPU、SM 和存储层次的图,再读带宽与计算如何限制吞吐。适合建立整体结构。
CUDA Programming Guide:线程怎样执行 ↗
把 grid、block、warp 与 shared memory 对起来。写 kernel 前,先弄清线程之间能共享什么、在哪里同步。
Hopper:TMA 与线程块集群 ↗
结合 SM 和数据通路图理解 Hopper。重点看异步搬运、Tensor Core 与 thread block cluster。
Blackwell Tuning Guide:具体芯片的资源限制 ↗
查寄存器、shared memory、常驻 warp 与 cluster 限制。尤其留意计算能力 10.0 和 12.0 的区别。
PTX ISA:从指令查执行规则 ↗
按需查 mma、wgmma、tcgen05、异步拷贝和 barrier。每次一起看操作数布局、同步语义与 Target ISA Notes。
AMD Matrix Cores:从 MFMA 看矩阵计算 ↗
用 CDNA 的数据布局和 MFMA 指令补充另一种实现。重点看一个 wavefront 如何协作完成矩阵乘加。
Benchmarking and Dissecting the NVIDIA Hopper GPU Architecture ↗
读测量方法,再看缓存、Tensor Core 和分布式共享内存的实验。把指令延迟、吞吐和应用性能分开理解。
Nsight Compute:从计数器定位瓶颈 ↗
从 Scheduler Statistics、Memory Workload Analysis 和 Roofline 入手,把“GPU 没跑满”拆成可以检查的问题。
Rubin:哪些变化会影响 kernel ↗
看 TMA descriptor 更新、矩阵指令 K 维和 kernel 间依赖的变化。先理解机制,再回到具体工作负载评估收益。
QA
一个 warp 是不是占着 32 个 CUDA Core?
warp 是 NVIDIA GPU 中组织线程执行的单位。CUDA Core 是算术执行资源。调度器按可执行状态发射 warp 的指令,算术、访存和矩阵指令走各自的数据通路。
线程保留自己的寄存器和执行状态,但不会在整个 kernel 生命周期里独占一个 CUDA Core。理解吞吐时,要看指令类型、发射能力和依赖。
一个 block 对应一个 SM,一个 SM 只能跑一个 block 吗?
普通 thread block 在一个 SM 上执行。只要线程数、寄存器、shared memory 等资源允许,一个 SM 可以同时驻留多个 block。
cluster 把多个 block 组织起来协作。跨 block 访问 distributed shared memory 需要满足 cluster 的生命周期和同步要求。
寄存器、shared memory、L1 和 TMEM,分别放什么?
寄存器保存线程的操作数与状态。shared memory 由程序显式管理,供 block 内线程协作;L1 由硬件缓存访问的数据。部分架构让 L1 与 shared memory 共享物理容量,但两者的访问和管理方式不同。
Blackwell SM100 的 TMEM 是矩阵指令使用的专用存储,累加结果可以保存在其中,再搬到寄存器处理。CUDA local memory 表示线程私有的地址空间,发生寄存器溢出时可能产生设备内存访问。
读懂 PTX,就等于知道 GPU 实际执行的指令了吗?
PTX 是虚拟指令集。编译器把它转换成目标 GPU 的机器代码,过程中会安排指令、分配寄存器并选择具体实现。
研究实际指令和寄存器使用时,要检查对应构建产物的 SASS。比较两个 kernel 时,同时记录 GPU、编译器版本与编译选项。
同叫 Blackwell,SM100 的 kernel 能直接搬到 SM120 吗?
先查所用指令和目标架构。SM100 的 tcgen05 / TMEM 路径不能因为另一张卡也叫 Blackwell,就直接套到 SM120。两者的矩阵指令、资源限制和最佳 tile 配置都有差异。
编译成功只解决兼容性的一部分。数据类型、布局、对齐和调度仍要按目标芯片验证。带 a 或 f 后缀的编译目标还具有各自的兼容范围。
Occupancy 越高,kernel 就越快吗?
Occupancy 描述常驻 active warp 数相对硬件上限的比例。更多可调度的 warp 有助于隐藏等待,但增大并行度也会消耗寄存器和 shared memory。
减少每个线程的寄存器,可能让更多 warp 驻留,也可能增加溢出或破坏数据复用。先看执行时间,再结合 eligible warps、发射空槽和内存流量判断。
TFLOPS 更高,训练和推理就会同比变快吗?
先对齐输入精度、累加类型以及 dense / sparse 口径。峰值矩阵吞吐只描述其中一条计算路径。
实际任务还要搬运数据、执行其他算子并等待依赖。小 batch 的权重读取、长上下文的 KV 访问,以及跨卡通信,都可能限制最终吞吐。
论文里的指令延迟和吞吐,为什么不能直接互相换算?
依赖链测量前一条结果何时能供下一条使用。多条独立指令可以重叠执行,用来测稳定发射和完成工作的速率。
复核微基准时,要看依赖关系、warp 数、频率和数据所在的缓存层。同一条指令的高吞吐,可以与较长的单条延迟同时存在。
访存吞吐不高,调度器却一直在等:下一步该查什么?
待解
想用一个真实 kernel 串起 eligible warps、依赖链、访存并行度和缓存命中率,区分带宽不足与延迟无法隐藏。