芯片层 开放阅读

占用率

Occupancy

概念 ID
occupancy
更新时间
2026-05-29
来源数量
待补

占用率

3 秒看懂

  • 占用率(Occupancy) 是衡量GPU一个流多处理器(SM)上活跃线程束(warp)数量与理论最大调度能力之比的指标,直观反映SM中“有多少等待被执行的活儿”。
  • 在深度学习训练/推理的背景下,占用率直接决定GPU隐藏内存延迟的能力——占用率越高,SM在一条指令发射后能立刻切换到另一个可执行的warp,将片上计算单元“喂饱”。
  • 它不是“越高越好”的万能指标:过高的占用率可能带来寄存器溢出(若限制过度)和共享内存容量不足降低数据复用,反而牺牲单个线程的效率(如矩阵乘法中每个线程复用数据的效率),业界常在占用率与其它资源使用之间寻找平衡点。

3 分钟产业解释

在深度学习训练的大规模并行计算链路中,占用率是隐藏在硬件利用率背后的一级微观调度指标。现代GPU由几十个流多处理器(SM)构成,每个SM内部维护着数十个warp(每个warp包含32个线程)的上下文。SM按照指令发射逻辑,在每个时钟周期从就绪的warp中挑选一个发射指令。如果就绪warp太少,当某warp因全局内存访问长延时(数百时钟周期)而停滞时,SM将无其他任务可执行,计算单元空转。

对于千卡级大模型训练而言,单个GPU的微架构效率会被放大。假设每个warp因内存等待停顿400周期,若占用率仅25%(即可调度warp数远低于理论资源限制),则近300个周期SM完全闲逛。反之,非常高的占用率能通过“多份工作”让SM几乎连续发射指令。然而,为达到高占用率往往需减少每个线程块的资源占用量(如寄存器、共享内存),这使得单个线程的数据复用度下降,可能导致总指令数增加、片上网络带宽压力攀升。所以,在深度学习框架(PyTorch/TensorFlow)与底层库(cuBLAS/cuDNN)的算子实现中,占用率是调优循环的核心手艺之一,尤其影响小矩阵乘法、批量小算子融合(Kernel Fusion)等场景的实际吞吐量。

15 分钟专家深入

占用率的概念根植于GPU的吞吐量设计哲学。与CPU通过大缓存、分支预测低延迟隐藏不同,GPU使用海量线程并行来掩盖长延时操作。这种“以量换时”策略的物理基础就是warp调度器能在每个周期从所有未阻塞的warp中挑选出就绪的warp。于是,有多少warp“活着”且可被调度,成为决定硬件功能单元利用水平的核心杠杆。

定量关系可由 Little定律 思想理解:

  • 等待内存回复的线程数 = 内存访问频率 × 内存延时
  • 若内存延时固定,必须保留足够数量的活跃warp,才能让SM始终有可发指令的warp,否则会因“线程干涸”而丧失覆盖延时的能力。

从AI芯片系统视角延伸,AMD对应概念为“Wavefront Occupancy”,其硬件线程粒度(wavefront为64线程)不同,但原理相通。在面向AI训练的自研芯片(如Google TPU、华为昇腾)中,类似概念往往体现在矩阵计算单元(MXU/Cube)与标量/向量单元的指令流水深度和上下文保持能力,虽不直接叫占用率,但内在权衡完全一致:任务并发的上下文越多,延迟容忍力越强,但每个上下文可用的快速存储(寄存器/便签存储器)越少,可能降低计算密度。

如今,随着Transformer类模型越来越深、MoE(混合专家)架构引入动态路由和All-to-All通信,计算图呈现更强的“瘦长型”算子特征(如大量小矩阵乘法、自定义激活),这些算子对占用率极为敏感,因为每个线程块所含的计算量不足以单纯依靠线程级并行,必须辅以更多warp级并行才能压满单位带宽。

技术原理(最深)

1. 占用率计算公式

以NVIDIA CUDA模型为例,占用率定义为:

Occupancy = Active_Warps_per_SM  /  Max_Warps_per_SM

其中 Max_Warps_per_SM 是架构规定的每个SM最多可驻留的warp数(取决于硬件资源上限,如warp槽位数量),而 Active_Warps_per_SM 受多种资源约束共同限制:

  • 线程限制:每个SM可同时驻留的最大线程总数(等于 Max_Warps_per_SM × 32),同时受每个SM最大线程块数 (Max_Blocks_per_SM) 限制。
  • 寄存器限制:每个线程使用的寄存器数量决定了一个线程块占用多少寄存器,进而限制SM内可同时驻留的线程块数。寄存器溢出(spill到L1缓存/局部内存)会降低有效性能,但不影响占用率的分母形式(CUDA不因溢出而减少驻留warp数,但会导致指令数激增)。
  • 共享内存限制:每个线程块声明的共享内存量决定了一个SM内最多可放置多少线程块,超出限制便无法启动更多块。
  • 其他资源:如Tensor Core使用、特殊内存一致性要求等可间接影响。

典型的资源约束图可表示为:

           硬件资源配置: 
           每个SM最大warp数: W_max(架构定)
           每个SM最大线程数: T_max(架构定)
           每个SM最大块数:   B_max(架构定)
           每个SM寄存器数量: R_total
           每个SM共享内存大小: S_total

           线程块配置: 
           每块线程数: threads_per_block
           每块寄存器:  regs_per_thread × threads_per_block (向上取整对齐)
           每块共享内存: smem_per_block

           线程维度限制:   floor(W_max * 32 / threads_per_block) 且 ≤ B_max
           寄存器限制:     floor(R_total / (regs_per_thread * threads_per_block))
           共享内存限制:   floor(S_total / smem_per_block)
           最终活跃warp数 = min(三个限制) * (threads_per_block / 32)

2. 延迟隐藏机制

在SM内部,每个warp有自己的程序计数器、寄存器堆和状态。当warp发出全局内存加载指令后,在数据返回前(400~800周期)该warp进入“等待”状态,调度器会立即从其他就绪warp中选择下一个发射指令。若活跃warp数N足够多,SM在每个周期几乎总能找到一个ready warp,使得功能单元利用率逼近100%。

公式化表达吞吐量饱和度所需的 N_required ≈ memory_latency × memory_throughput_per_warp / arithmetic_throughput。实际中,可以粗略认为 占用率越高,隐藏相同延迟所需的最小warp数越远低于实际提供量,从而更容易达到饱和。

过高的占用率会导致每个线程可用的寄存器数量被压缩。若寄存器不足,编译器会插入溢出/填充代码,不仅增加执行指令数,还可能因为反复存取缓存导致额外的内存压力,引发“伪隐藏”——看似占用率高,实则每周期有效计算指令比例下降。

3. 在AI算子中的典型权衡

以矩阵乘法为例,每个线程块通常从全局内存加载A/B矩阵瓦片到共享内存,再利用寄存器做多层复用(如外积累积)。要让一个线程计算多输出元素(即提高单个线程的计算/数据传输比),需要更多寄存器来保持中间累加器。但寄存器多了,一块的线程数就必须少,导致总warp数下降,会影响整体隐藏延迟的能力。因此,开发者常通过自动调优或启发式方法选择最优化分块(tiling)大小,使得占用率落在性能“甜点区”而不是最大值。使用CUDA Occupancy Calculator之类的工具可以直观地看到这种约束的互锁关系。

技术演进史

  • Fermi(2010)之前:硬件warp调度能力有限,占用率主要由线程槽位和寄存器总量决定。开发者通过手工分配寄存器数量(maxrregcount)来手动权衡。
  • Kepler(2012) - Maxwell(2014):改进了warp调度器的数量和调度策略;寄存器堆变大,SM可驻留warp数上限提升(Kepler SMX 每个SM多达64个warp),为更高占用率提供物理基础。独立线程调度在此阶段尚未引入(由Volta架构首次实现)。
  • Volta(2017):独立线程调度(Independent Thread Scheduling)出现,warp内线程可交错执行,占用率模型更复杂,但底层仍可用活跃warp数衡量并发度。同时Tensor Core引入,占用率中需额外考虑Tensor Core指令的发射依赖。
  • Ampere(2020) - Hopper(2022):SM结构进一步分裂为多个分区(如GA10x SM为4个处理分区),每个分区本地寄存器文件、warp调度器更独立,局部分区的占用率变得重要,而非整个SM的全局占用率。这一变化使得细粒度的warp分配和bank冲突躲避策略直接影响性能。
  • AI专用加速器时代:Google TPUv1/v2/v3 基于脉动阵列,没有传统GPU warp概念,但通过明确的MXU流水级维持大量并行操作,其“占用”等价于“保持流水线充满”所需的最小批次维度设置。Habana Gaudi等使用Tiled architecture,每个Tile内计算核的上下文数量类似占用率概念。

技术路线对比(量化表)

下表聚焦于不同计算架构在“占用率”相关指标上的定性对比,因各厂商未公开精确极限值,所以采用定性程度标注(依据公开编程指南及白皮书中的约束说明)。

架构 / 厂商并行单元粒度占用率核心指标资源约束要点调优工具
NVIDIA CUDAWarp(32线程)Active warps / Max warps per SM(或per分区)寄存器、共享内存、每个SM的块数Occupancy Calculator, NSight Compute
AMD ROCmWavefront(64线程)Wavefront occupancy per CU(与SM等价)向量寄存器、LDS(局部数据共享)rocProf, Radeon GPU Profiler
Intel Xe-HPCHardware thread (SIMD8)EU线程占用率,基于每个subslice的线程上下文数寄存器、SLM(共享本地内存)Intel VTune, GPU-Ocelot兼容分析
Google TPU脉动阵列的维度无直接warp概念;用“MXU利用率”度量VPU/MXU的批次并行度、向量存储器带宽TPU Profile/TensorBoard trace
华为昇腾标量/向量/Cube分组DaVinci架构的multi-core间任务并行;每个core内指令多发射向量寄存器、L1 buffer、数据搬运Ascend Profiling Tool(msprof)

注:具体每个架构的warp/块上限数字因代际而异,表中仅定性给出维度,具体数值需查阅最新硬件编程指南。

上下游

  • 上游——硬件设计:GPU架构师根据目标负载(如深度学习算子特征)决定SM内寄存器堆容量、warp调度器数、共享内存大小和分区数。占用率模型是架构仿真中评估资源尺寸的重要输入。
  • 上游——编译器与驱动:PTX/SASS编译器在寄存器分配、指令重排时影响最终寄存器用量和溢出情况;CUDA驱动层面亦有warp调度策略微调。
  • 中游——深度学习框架与算子库:PyTorch/TensorFlow调用cuBLAS/cuDNN或自实现Kernel时,launch configuration(grid/block尺寸、动态共享内存)直接影响占用率。通过融合算子(如FlashAttention)手工设计寄存器分块和共享内存分配,达到更优占用率和有效带宽。
  • 下游——大模型训练平台与云服务:GPU云实例的整机性能除受单卡占用率影响,还与多卡通信叠加、PCIe/NVLink带宽竞争有关。占用率优化好的算子可提高单卡吞吐,从而降低长期训练的总TCO(总体拥有成本)。

关键指标

  • 理论占用率:基于寄存器、共享内存、线程限制计算出的静态占用率上限(编译器可见)。
  • 实际达成占用率:运行时采样到的平均活跃warp数/理论最大warp数。通常通过Profiler(如ncu)测量,理想情况下接近理论占用率。
  • 每个warp的平均停滞周期来源:细分为内存等待、同步屏障、算术管道忙等,用于诊断“高占用率低利用率”的根因。
  • 有效计算密度(FLOPs/Byte):结合占用率与带宽使用,评判是否计算或访存受限。
  • 寄存器压力指数:编译器报告每个线程的寄存器使用量,与其上限的比值,结合溢出量评估占用率代价。

供需与市场数据

占用率作为微观技术指标,不存在独立的市场供需数据。但可间接观察:

  • GPU供不应求背景下,云厂商和AI实验室追求单位算力利用率最大化,正催生对底层Kernel优化的强劲需求,如FlashAttention、Cutlass模板库的广泛采用,这些优化的核心环节之一就是占用率-寄存器-共享内存的联合调优。
  • 据第三方机构[如Liftr Insights等云算力签约追踪],高性能GPU实例的预留利用率持续走高,表明提升每张卡的有效吞吐(含占用率等微观效率)的经济动机明确。
  • 各AI芯片创企在宣传中常强调“超越NVIDIA的利用率”,实际上是在自研架构上重做了类似占用率的并行度优化,体现为特定benchmark下的有效MAC利用率。未有公开关于“占用率”指标的规模统计。

代表公司与资本映射

  • NVIDIA:通过CUDA生态将占用率概念推广为GPU编程必备知识,其NVIDIA Nsight工具、Occupancy Calculator及GTC课程不断教育市场。资本层面,每一代架构的SM资源调整(如增加寄存器、扩大共享内存)均支持更灵活占用率-性能甜点区,构成软件和硬件的正向循环护城河。
  • AMD:AMD Instinct MI系列在ROCm栈中使用类似的Wavefront占用率作为性能调优核心,AMD在超算部署(如Frontier)中的性能表现离不开对占用率的精细优化。公司通过持续迭代ROCm编译器减少程序员显式管理占用率的负担。
  • NVIDIA的CUDA软件栈合作伙伴(如NVIDIA NGC上的Deep Learning Examples):提供开箱即用、占用率调优的模型实现,降低了企业的使用门槛。
  • AI算力租赁服务商(如CoreWeave, Lambda Labs):它们提供的裸机实例通常预装优化过的算子库;占用率更高的软件栈意味着相同硬件下能提供更多有效算力,这直接影响服务商的毛利率。
  • 初创公司:包括Modular(意在用新编译器及运行时自动优化类似占用率等底层资源)、各种AI编译框架公司(如OctoML),致力于通过自动搜索占用率-分块策略解放人力,从投资视角看是提升基础设施效率的重要一环。

投资逻辑

  1. “良构Kernel”溢价:能够自动或半自动生成高占用率、高数据复用算子的公司(如AI编译器、Mlir-based框架团队)将节省大量人力调优成本,加速模型部署和迭代,成为软件定义硬件效率的受益人。
  2. 架构弹性:新一代AI芯片若能在占用率类似指标上提供更宽的“甜点区”(即对块大小/寄存器用量不敏感),则能吸引更多算法开发者,减少迁移成本。投资GPU替代方案时可考察其开发工具对占用率的暴露程度和优化简易度。
  3. 大模型成本敏感性提升:随着推理成本成为生成式AI商业模型关键,针对小batch、低延迟场景的Kernel优化(常需极高占用率以隐藏延迟)成为刚需。因此,能提供相关优化工具或服务的公司(如DeepSpeed、vLLM等背后的团队)将随推理规模扩大而受益。
  4. 关注“利用率”与“占用率”区分:二级市场分析中常笼统讨论GPU利用率,不区分SM空闲与计算单元实际繁忙。真正理解占用率可分辨出某片GPU是“没活干”(调度不足)还是“慢活堵着”(峰值吞吐瓶颈),进而判断性能优化空间和软硬件迭代价值。

常见误读纠偏(≥2)

误读1:占用率越高,程序一定跑得越快。

事实:占用率仅衡量SM中活跃warp的充足程度,而不是计算效率。当每个warp因寄存器稀缺而频繁溢出,或每个线程块因太小导致重复加载大量数据、总指令数膨胀时,高占用率可能对应更低的单warp效率,最终端到端时间不降反升。性能优化中通常追求“最优占用率”(performance sweet spot),而非最大化。

误读2:占用率等于GPU利用率。

事实:GPU利用率(如nvidia-smi显示的GPU Utilization)通常指过去采样周期内是否有任何Kernel在运行,它远粗于占用率。一个kernel可能达到了90%占用率,但其内执行部件仍可能因指令依赖而导致只有30%的FPU活跃度;反之,低占用率的kernel若每个warp都是计算密集无停顿,也可能使SM的算术单元满载。两者不能混用。

误读3:整块GPU的占用率是一个恒定值。

事实:不同Kernel甚至同一Kernel的不同阶段(如预取数据 vs. 纯计算)占用率可能动态变化;现代GPU部分架构支持每SM分区的独立warp调度,各分区占用率可以不同。评估时需用profiler观察distribution,而非单取平均值。

学习路径

  • 第零步:阅读官方编程指南——NVIDIA CUDA C++ Programming Guide中的“Occupancy”一章(涵盖硬件能力、占用率计算API)。
  • 第一步:运行CUDA自带samples里的deviceQueryoccupancy相关样例,直观感受线程块配置如何影响驻留blocks数。
  • 第二步:使用NVIDIA Nsight Compute对深度学习算子(如cuBLAS矩阵乘法、自定义element-wise)进行 profiling,观察theoretical occupancyachieved occupancy差值,并结合stall原因分析。
  • 第三步:学习Cutlass或Triton语言中的自动调优(Auto-tuning)示例,理解分块循环顺序、寄存器分块与占用率的联合权衡。
  • 第四步:扩展到非NVIDIA平台(如AMD ROCm profiler、Intel VTune),比较不同架构在占用率语义上的差异。
  • 第五步:阅读大型开源项目(如FlashAttention、vLLM)中关于launch config和分块选择的代码注释,理解实际生产环境如何做占用率设计取舍。

一句话总结

占用率是GPU隐藏延迟的容量指标,但不是性能的唯一裁判;在深度学习算子里,找到占用率与寄存器、数据复用的妥协点,往往是实现极致吞吐的秘钥。

延伸阅读与来源

  • NVIDIA. CUDA C++ Programming Guide, Chapter “Compute Capabilities” & “Achieved Occupancy”. [公开文档]
  • NVIDIA. CUDA Occupancy Calculator (XLS/online). [公开工具]
  • AMD. ROCm Documentation: Wavefront Occupancy. [公开文档]
  • Mark Harris. “How to Access Global Memory Efficiently in CUDA C/C++”. NVIDIA Developer Blog. [博客]
  • P. Micikevicius. “GPU Performance Analysis and Optimization”. GTC talk. [会议材料]
  • 各AI芯片初创公司的架构白皮书(如Groq、Cerebras、Graphcore)有关利用并发隐藏延迟的设计理念,可作为对比理解占用率通用价值的参考。
  • 《Professional CUDA C Programming》(John Cheng, et al.) 第5章关于占用率的详细调优案例。

注:本文中所有未明确给出具体数值的量化参数均为通用原理说明,避免在未检索到确切厂商数字情况下给出不实规格。如需最新架构的precise warp/线程/寄存器上限,请查阅对应硬件厂商的最新编程参考手册。

source: 公开披露与公开资料整理 本页仅用于产业链学习、信息检索和研究辅助;不构成投资建议,不预测涨跌,不提供买卖、仓位或目标价建议。
完整概念页 复盘 13 节结构 公司投研页 沿产业链找到受益公司 投资课 把概念转成可跟踪模型