流式多处理器(SM):GPU的核心计算单元
流式多处理器(Streaming Multiprocessor,SM)是NVIDIA GPU架构中最核心的并行计算单元,也是GPU实现大规模并行计算的基础——所有CUDA核心(CUDA Core)、张量核心(Tensor Core)等计算资源都依附于SM,GPU的并行计算能力本质上是多个SM同时工作的结果。
简单来说:GPU是“SM的集合”,而SM是“计算核心的集合”。
一、SM的核心定位
GPU的设计目标是处理“单指令多数据(SIMT)”类型的并行任务(如图形渲染、深度学习、科学计算),而SM正是执行这类并行任务的“最小独立单元”:
- 每个GPU芯片包含数十到上百个SM(例如NVIDIA A100有108个SM,RTX 4090有128个SM);
- 每个SM内部集成了大量计算核心、缓存、调度单元等,能独立调度和执行一批线程;
- 多个SM可同时并行工作,共同支撑GPU的整体算力。
二、SM的核心组成(以NVIDIA Ampere架构为例)
不同架构(如Kepler、Maxwell、Volta、Ampere、Hopper)的SM结构略有差异,但核心模块一致,典型组成包括:
| 模块 | 作用 |
|---|---|
| CUDA核心(FP32/INT32) | 基础通用计算核心,执行单精度浮点运算、整数运算,是SM最核心的计算资源。 |
| 张量核心(Tensor Core) | 专用于深度学习的矩阵乘加(GEMM)运算,支持FP16/FP8/INT8等低精度计算,大幅提升AI算力。 |
| 双精度核心(FP64) | 处理高精度浮点运算(科学计算、流体仿真等场景),Ampere架构中FP64算力是FP32的1/2。 |
| 纹理单元(Texture Unit) | 处理图形纹理采样,也可用于通用数据加载优化。 |
| 线程调度器(Warp Scheduler) | 调度“线程束(Warp)”执行——GPU中线程以32个为一组(Warp),SM的调度器会为每个Warp分配计算资源,实现无间断流水线。 |
| 寄存器文件(Register File) | 为线程提供超低延迟的高速存储,每个线程有独立寄存器,SM的寄存器容量决定了可同时运行的线程数。 |
| 共享内存(Shared Memory) | SM内的高速片上内存(带宽达TB/s级),供同一SM内的线程共享数据,是GPU优化的核心关键点。 |
| L1缓存/常量缓存 | L1缓存用于临时数据缓存,常量缓存加速只读常量数据访问,降低对全局内存的依赖。 |
补充:Ampere架构的SM还引入了“SM Partition”设计,将单个SM拆分为2个独立的子SM(每个子SM有自己的调度器、寄存器和共享内存),进一步提升并行粒度。
三、SM的工作原理(SIMT模型)
GPU执行CUDA程序时,线程会被组织为线程块(Block),每个线程块会被分配到一个SM上执行(线程块无法跨SM),而SM内部的线程会被进一步拆分为32个一组的线程束(Warp):
- 线程调度器为每个Warp分配计算资源,同一Warp内的所有线程执行相同的指令(SIMT),但处理不同的数据;
- 当某个Warp因访存、同步等原因阻塞时,调度器会立即切换到另一个就绪的Warp执行,实现“隐藏延迟”,让SM的计算核心始终处于忙碌状态;
- 单个SM可同时容纳多个线程块(取决于寄存器、共享内存的占用),这也是“并发线程”的核心来源。
关键特性:SM的并行能力由“同时活跃的Warp数”决定,而Warp数又受SM的寄存器容量、共享内存大小限制——优化寄存器/共享内存使用,可大幅提升SM的利用率。
四、SM与CPU核心的核心差异
| 维度 | SM(GPU核心) | CPU核心 |
|---|---|---|
| 设计目标 | 大规模数据并行 | 复杂逻辑串行/轻并行 |
| 核心数量 | 单GPU数十~上百个SM | 单CPU通常2~64个核心 |
| 线程调度 | 硬件级快速切换Warp(无开销) | 操作系统调度线程(有开销) |
| 缓存/寄存器 | 共享内存为主(片上高速) | 多级缓存为主(容量更大) |
| 适用场景 | 矩阵计算、渲染、AI推理 | 操作系统、数据库、复杂逻辑 |
总结
SM是NVIDIA GPU的“计算引擎”,通过集成大量并行计算核心、高速片上存储和高效的线程调度机制,实现对海量数据的并行处理。理解SM的结构和工作原理,是优化CUDA程序、提升GPU算力利用率的关键——核心思路是让SM的计算核心尽可能不空闲,同时最大化利用共享内存/寄存器降低访存延迟。
💬 评论