芯片层 开放阅读

Kernel 函数

GPU Kernel

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

Kernel 函数

3 秒看懂

GPU Kernel 是运行在图形处理器(GPU)上的最小编译单元,在深度学习中它把矩阵乘法、卷积、激活函数等算法映射到成千上万个线程并行执行。其本质是一段设备端代码,由主机端(CPU)调用,在 GPU 的流多处理器(SM)上以 SIMT 方式调度。理解 Kernel 就是理解大模型训练/推理性能的起点:一次 Transformer 的 forward pass 背后是数百个精心优化的 Kernel 在 flash attention、矩阵乘、layer normalization 等关键路径上协同工作。

3 分钟产业解释

在 “CPU 负责调度、GPU 负责密集计算” 的异构计算范式里,Kernel 是 GPU 能够理解并执行的程序单元。深度学习框架(PyTorch、TensorFlow)并不直接产生 GPU 指令,而是通过具备高度工程化特性的底层库——如 NVIDIA 的 cuBLAS、cuDNN、CUTLASS,或者 OpenAI 自研的 Triton 语言——将高层算子自动或手动分解为一系列 Kernel 调用。 一个典型的 GPU Kernel 在逻辑上描述一个 网格-块-线程 的三级计算组织。比如一个 [M, K] × [K, N] 的矩阵乘法,网格会被划分为若干线程块,每个线程块计算输出矩阵的一个子块;块内线程通过共享内存和寄存器协作,对全局内存的数据进行分片和复用,以最大化带宽利用。 产业上,GPU Kernel 性能直接影响大模型训练的 MFU(模型浮点运算利用率)和推理延迟。A100/H100 等高端 GPU 的理论峰值算力很高,但如果没有像 FlashAttention 那样通过 Kernel 融合、重计算、IO 感知等优化,实际利用率可能只有 20–30%。因此 Kernel 优化工程师 已成为各大 AI 实验室争夺的关键人才,他们需要精通 CUDA C++、PTX/SASS 指令、GPU 内存层次,甚至需要针对单一算子手写汇编级 Kernel。

15 分钟专家深入

把对 GPU Kernel 的理解提升到专家级,需要吃透三个维度:执行模型内存模型、以及与深度学习编译栈的互动

执行模型:SIMT 与 warp 调度

GPU 采用单指令多线程(SIMT)架构。一个 Kernel 启动时会配置网格和线程块尺寸,硬件上将每个线程块分配到某个 SM。在 NVIDIA 架构中,一个线程块的所有线程以 32 个线程为一组(一个 warp)进行调度。warp 内的线程在同一时刻执行相同指令,处理不同数据。如果一个 warp 遇到分支且线程走向不同,硬件会串行执行两条路径,掩蔽部分线程,导致线程束发散,这是 Kernel 优化的头号大敌。

Kernel 的并行粒度选择(blockDim 和 gridDim)需要匹配 SM 的可用寄存器文件和共享内存容量。每个 SM 能驻留的线程块和 warp 数量受限于寄存器压力、共享内存用量等。更高的占用率(occupancy)可以隐藏内存延迟,但若 Kernel 本身需要大量寄存器存储中间变量,过度追求 occupancy 反会因寄存器溢出到 L1 缓存或全局内存而严重拖慢速度。优化工程师会通过 __launch_bounds__ 或编译选项向编译器提示最大线程数,并利用 Nsight Compute 分析实际瓶颈。

内存模型:层次与延迟隐藏

GPU 内存体系从片上到片外依次是:寄存器(1 cycle 延迟,但每个线程私有)、共享内存(SRAM,约 20–40 cycles,块内线程共享)、L1 缓存/纹理缓存/常量缓存、L2 缓存(片上,数百 cycles)、全局内存(HBM/GDDR,最高带宽但延迟可达 600–800 cycles)。Kernel 的关键优化几乎全是围绕这一内存层次展开的数据搬运与计算的重叠

以矩阵乘法 Kernel 为例,经典策略是每个线程块将输入矩阵的子块从全局内存通过 coalesced 方式加载到共享内存(保证相邻线程访问连续地址),再利用共享内存上的数据块进行乘累加,结果写回寄存器,最终将寄存器中的部分和写出到全局内存。同时,每个线程块会使用双缓冲(double buffering)技术,在计算当前分片的同时,异步预取下一个分片的数据(从全局内存到共享内存),从而掩盖内存延迟。在较新的架构中,可以直接使用异步拷贝指令(如 cp.async)将数据直接从全局内存加载到共享内存,而无需浪费计算指令。

FlashAttention 系列 Kernel 的突破正在于通过分块(tiling)与重计算(recomputation) 将 softmax 的归约操作完全限定在 SRAM 内,避免频繁读写 HBM 的 attention 矩阵。这种 IO-aware Kernel 设计已成为大模型推理/训练的标准范式。

深度学习编译器与 Kernel 生成

手写 CUDA Kernel 虽然能榨干性能,但开发成本极高、跨架构迁移困难。近年来,TVM、Halide、Triton、MLIR 等工具链应运而生,希望自动生成高性能 Kernel。OpenAI 的 Triton 语言允许程序员用类 Python 语法描述块级别的数据流,编译器自动完成线程级映射、共享内存分配、warp 级优化和硬件的细粒度调优。Triton Kernel 在很多场景下能达到与手写 cuBLAS 相当的性能,极大降低了 Kernel 门槛。

在编译栈中,Kernel 通常先被编译成中间表示(如 LLVM IR 或 MLIR 的 GPU 方言),再翻译为 PTX(并行线程执行)伪汇编,最后由 GPU 驱动编译为机器码(SASS)。PTX 具有一定的前向兼容性,而 SASS 则与具体架构绑定。专家级优化时常直接阅读 SASS 指令,确认是否存在非预期的寄存器溢出、过剩的 load/store 指令或 bank conflict 等。

技术原理

目的:拆解 GPU Kernel 的运行时机制,聚焦对深度学习至关重要的几个硬核细节。

1. 线程层级与索引映射

global_idx = blockIdx * blockDim + threadIdx;

这是一个典型的一维映射。对于二维矩阵计算,通常将 threadIdx 映射到输出矩阵的行/列:

row = blockIdx.y * blockDim.y + threadIdx.y;
col = blockIdx.x * blockDim.x + threadIdx.x;

Kernel 启动时,这些内建变量由硬件自动填充。

2. 内存请求合并(Coalescing)

全局内存带宽能否跑满,关键在于 warp 内的所有线程在一个指令内访问的地址是否落在同一个 32 字节、64 字节或 128 字节对齐的段内。当 coalesced 条件满足,一次内存事务即可为整个 warp 服务 32/64/128 字节;否则会拆分为多个事务,带宽利用率断崖下降。深度学习的特征图张量通常以 NCHW/NHWC 格式存储,不同的布局会显著影响 convolve Kernel 的 coalescing 效率,由此催生了各种 layout 重排 Kernel。

3. 共享内存 bank conflict

共享内存被划分为多个 bank(NVIDIA 普遍为 32 个 bank),若同一 warp 内的多个线程访问相同 bank 的不同地址(且宽度为 4 字节),将发生 bank conflict,导致请求串行化。优化 Kernel 常用的一种技巧是填充(padding) 共享内存数组的维度,例如将 float sA[32](#src-32)[32](#src-32) 改成 float sA[32](#src-32)[33](#src-33),以打破 bank 冲突的模式。在矩阵乘法 Kernel 中,bank conflict 的消解对性能影响可达 10–30%。

4. 计算与数据移动的重叠(Compute-Memory Overlap)

除双缓冲外,现代 GPU 支持异步内存拷贝引擎。Kernel 可以手动插入 __pipeline_memcpy_async 等指令,将下一批数据从全局内存加载到共享内存,而当前 warp 立即进入计算阶段,不等待拷贝完成。当计算用到了这批数据时,通过 __pipeline_wait_prior 等同步原语确保数据已到达。这是实现接近 roofline 上限性能的核心手法。

5. 算术强度与 roofline 模型

Kernel 的算术强度(FLOP/Byte)决定了其性能瓶颈在算力还是带宽。例如逐元素激活函数 Kernel 的算术强度极低(每个元素数条指令,但仅读写一次),几乎永远带宽受限。而大矩阵乘法的算术强度可达数百,是算力受限。通过 Kernel 融合(将 element-wise 操作合并到一个 Kernel 中,减少中间结果的全局内存读写),可以显著提升低强度算子的有效带宽利用,这是 XLA、TorchInductor 等编译器大力推行的优化。


技术演进史

  • 2006 年之前:GPGPU 萌芽,开发者通过图形 API(OpenGL/DirectX)伪装为渲染操作进行计算,Kernel 概念为 shader 程序。
  • 2006 年:NVIDIA 发布 CUDA 1.0,提出 grid/block/thread 执行模型和 CUDA C 语言,Kernel 函数以 __global__ 声明,大规模通用并行计算成为可能。
  • 2010–2012 年:Fermi 架构引入可缓存全局内存(L1/L2),共享内存与 L1 可配置。cuBLAS、cuFFT 等库将常用 Kernel 模板化,深度学习尚在萌芽。
  • 2014–2016 年:Maxwell/Pascal 架构大幅提升能效。cuDNN 针对卷积、池化等提供预优化 Kernel。Kernel 自动调优(auto-tuning)出现,如 CUDA 的 cudaOccupancyMaxPotentialBlockSize 等工具。
  • 2017–2018 年:Volta 架构引入 Tensor Core,支持混合精度矩阵乘累加。需要专门编写 Warp-level Matrix Multiply-Accumulate (WMMA) 指令或使用 nvcuda::wmma 的 C++ 封装来调用 Tensor Core Kernel。深度学习进入 Transformer 时代,注意力矩阵的内存瓶颈凸显。
  • 2019–2021 年:Turing/Ampere 增强了 Tensor Core 的稀疏化和细粒度结构化稀疏支持。Triton 语言逐渐成熟,简化 Kernel 开发。
  • 2022 年至今:Hopper 架构引入 TMA(Tensor Memory Accelerator)和 FP8 支持,Kernel 编写更依赖异步拷贝和新的编程模型。FlashAttention (2022) 通过分块+重计算 Kernel 震撼业界,说明极致 IO-aware Kernel 能带来数量级的提速和节省内存。CUTLASS 3.x 将 Kernel 抽象为可组合的模板,加速了针对新硬件的手工优化。同时,PyTorch 2.0 的 TorchInductor 用 Triton 编译器后端自动生成 Kernel,推高了自动化水平。

技术路线对比

维度手写 CUDA KernelcuBLAS/cuDNN 库Triton 语言编译器自动生成 (TorchInductor/TVM)
性能潜力最高(可榨干硬件特性)高(厂商精细调优)很高(接近手写)中–高(视模板与调优程度)
开发效率低(需要深入 GPU 微架构)高(调用 API)中(块级别编程)高(Python 前端,自动优化)
可移植性差(绑定 CUDA 生态)中(同库跨代,不同库需适配)较高(支持 NVIDIA/AMD 等)高(IR 可接多后端)
典型应用场景新一代注意力机制、奇特激活函数标准卷积、GEMM、归一化研究型算子、快速迭代的定制融合图级别优化、常见算子组合
学习曲线陡峭平缓中等平缓
硬件利用率上限极近 Roofline接近 Roofline接近 Roofline常为 60–80% 厂商峰值

注:数据为定性评估,无具体对标基准。


上下游

  • 上游(硬件与驱动):GPU 架构设计(NVIDIA、AMD、Intel)、CUDA 驱动、PTX/SASS 编译器。硬件团队定义的 ISA 和内存层次直接决定 Kernel 能用到什么指令和带宽上限。
  • 中游(底层库与编译器):cuBLAS、cuDNN、CUTLASS、Thrust、cuSPARSE、Triton、MLIR 的 GPU 方言。它们是封装 Kernel 的中间件,将高层算子映射到优化后的 Kernel 集合。
  • 下游(框架与模型):PyTorch、TensorFlow、JAX、PaddlePaddle 等框架,以及 GPT、Llama、Stable Diffusion 等模型。框架的调度器通过算子分发机制,将用户的 torch.matmul 调用路由到最佳的底层 Kernel 实现。
  • 下游的末端:大模型训练/推理服务,比如 vLLM 框架中通过 PagedAttention Kernel 管理 KV 缓存,显著提升推理吞吐。这些自定义 Kernel 直接面向业务指标调优。

关键指标

评估 GPU Kernel 性能的常用指标(未注出处为通用度量):

  • 执行时间/延迟:单次 Kernel 调用的耗时,通常用纳秒或微秒。
  • 吞吐量(TFLOPS):实际达到的浮点运算次数,与理论峰值的比值即 MFU
  • 带宽利用率(%):实际数据传输速率与设备带宽的比例。
  • 占用率(Occupancy, %):每个 SM 上活跃 warp 与理论最大 warp 数的比值,反应延迟隐藏能力,但不是越高越好。
  • 寄存器用量/共享内存用量:每个线程所用寄存器数量、每线程块所用共享内存量,直接影响 occupancy 和溢出风险。
  • 算术强度(FLOP/Byte):决定 Kernel 为带宽受限还是算力受限。
  • Bank conflict 率:可通过分析工具获得,影响共享内存带宽。

供需与市场数据

由于检索未返回具体数据,以下为基于公开信息的定性描述:

  • 人才需求:AI 基础设施领域对 GPU Kernel 工程师的需求三年内呈指数增长,尤其在大模型公司、云厂商和 AI 芯片初创企业。职位涵盖 CUDA 开发、高性能计算(HPC)以及 ML 编译器工程师。据行业观察,资深 GPU Kernel 优化专家的薪酬位于 AI 人才金字塔顶端。
  • 工具链市场:NVIDIA 的 CUDA 生态仍占据绝对主导,其编译器与库是事实标准。Triton 在顶尖 AI 实验室渗透率快速上升,并有部分企业将其用于自研加速硬件。开源编译器(如 MLIR)的进展可能降低市场集中度。
  • 硬件供给:NVIDIA 数据中心 GPU 供应紧张长期持续,每代新架构的发布都会引发大量 Kernel 重写和适配需求,从而拉动对 Kernel 开发的投资。
  • 行业趋势:随着模型规模的增速超越单芯片显存增长,手工融合 Kernel 从可选项变为必选项。从 FlashAttention 到各类自定义融合算子的需求激增,Kernel 已成为大模型公司的核心技术壁垒之一。

(具体人才规模、市占率数字未充分披露)


代表公司与资本映射

  • NVIDIA:GPU Kernel 生态构建者,CUDA、cuBLAS、cuDNN 等库的提供者,持续通过新指令集(Tensor Core, TMA)定义 Kernel 优化的硬件基础。
  • AMD:ROCm 生态中的 HIP 可转换 CUDA 代码为运行于 AMD GPU 的 Kernel,正加大在 AI 框架兼容性上的投入。
  • Intel:通过 oneAPI 的 DPC++ 和 SYCL 瞄准 Kernel 可移植性,其 GPU 产品在数据中心崭露头角。
  • AI 芯片初创公司(如 Groq、Tenstorrent、Graphcore 等):很多采用专用架构或数据流架构,其 Kernel 概念与传统 GPU 差异显著,需要专门的软件栈,其成功很大程度上取决于编译器和 Kernel 库的完备度。
  • 核心实验室:OpenAI(Triton 语言与 FlashAttention 的原创者)、Meta(PyTorch 及 TorchInductor)、Google(JAX/XLA)、Microsoft(DeepSpeed 中的自定义 Kernel)。这些组织掌握大量优化过的 Kernel IP,并以此作为技术护城河。
  • 资本关注点:GPU Kernel 能力强的公司往往在训练成本、推理吞吐上有碾压性优势,因而获得更高估值。VC 在审视 AI Infra 创业项目时,会重点考察团队是否具备自研高性能 Kernel 的能力。

投资逻辑

  1. 算力利用率是成本核心:GPU 硬件成本巨大,训练一个大模型需要成千上万块 GPU。Kernel 优化能将 MFU 从 30% 提升至 60% 甚至更高,相当于同等硬件下节省一半的训练时间和电费,具备直接的投资回报逻辑。
  2. 锁定生态护城河:定制 Kernel 一旦与模型结构深度绑定,迁移到其他框架或硬件的成本极高。这使某些大模型公司的训练/推理系统具有排他性优势,有利于其 SaaS/API 业务的毛利率。
  3. 下游推理降本:推理场景对延迟极度敏感,手写 Kernel 在 Batch Size=1 的低吞吐场景下效果远超市面通用库。能够提供极致端到端延迟的公司将在企业级 AI 应用中占得先机。
  4. 警惕硬件依赖性:当前大部分 Kernel 优化系针对 NVIDIA GPU 设计。若未来 AI 硬件格局走向多元化,过度依赖单一平台的手工 Kernel 可能成为迁移负担。编译器自动生成技术路径的价值因此凸显,相关工具链(如 Modular/MLIR)值得关注。
  5. 人才密集型企业价值:顶级 Kernel 工程团队稀缺,拥有这类团队的公司具备长期的技术迭代能力,应视为核心资产。

常见误读纠偏

误读 1:“Kernel 就是算子(operator),两者可以互换。”

纠正:在深度学习语境下,算子(如卷积、softmax)是数学定义,而 Kernel 是特定硬件上实现该算子的可执行代码。一个算子可能对应多个 Kernel(不同输入形状、数据类型、优化策略),运行时由框架的分发器动态选择。两者不是同一抽象层级。

误读 2:“GPU 的线程是独立并行的,越多越快。”

纠正:GPU 线程的执行不是完全独立的,它们以 warp 为单位锁步执行。过多的线程块可能导致每个线程的寄存器资源减少,引发寄存器溢出到慢速内存,反而拖慢性能。而且,线程块尺寸过小可能造成 SM 内控制开销增大,无法充分利用硬件。合理的 Kernel 设计需要精确权衡并行粒度与资源占用。


学习路径

基础阶段

  • 掌握 C/C++ 和计算机体系结构基础(缓存、内存层次)。
  • 学习《CUDA C++ Programming Guide》,理解 grid/block/thread、共享内存、同步原语。
  • 在 Nsight Systems 中运行官方 matrix multiplication 示例,观察 Kernel 时间线。

进阶阶段

  • 阅读 CUTLASS 源码,理解 tiled GEMM 的软件流水线和 Tensor Core 映射。
  • 完成 Triton 官方教程,手写一个融合的 LayerNorm+Dropout Kernel并比较与 PyTorch 的性能。
  • 使用 Nsight Compute 分析 Kernel 的 roofline、bank conflict 和 occupancy。

高级阶段

  • 攻读 NVIDIA PTX ISA 参考手册,逐步从 PTX 角度理解编译器的优化决策。
  • 深入研究 FlashAttention-2 的 CUDA 实现,体会如何通过分块避免 HBM 读写全局 attention 矩阵。
  • 结合 MLIR 的 GPU 方言,尝试从高层 IR 生成 Kernel。
  • 参与开源项目(如 vLLM、FastTransformer)贡献定制 Kernel,获取实战经验。

推荐书籍/资料

  • Programming Massively Parallel Processors (Kirk & Hwu)
  • NVIDIA GPU 技术大会(GTC)关于 CUDA 的演讲录像
  • CUDA Toolkit Documentation
  • 论文 FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness

一句话总结

GPU Kernel 是将深度学习的数学描述转化为 GPU 并行机器的最后“一公里”,是大模型性能和成本的关键控制点,理解它等于掌握 AI 基础设施的性能命脉。


延伸阅读与来源

  • CUDA C++ Programming Guide, NVIDIA.
  • CUTLASS: CUDA Templates for Linear Algebra Subroutines and Solvers, NVIDIA, github.com/NVIDIA/cutlass.
  • Dao, T., et al., FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness, NeurIPS 2022.
  • Tillet, P., et al., Triton: an intermediate language and compiler for tiled neural network computations, MAPS 2019.
  • Lattner, C., et al., MLIR: Scaling Compiler Infrastructure for Domain Specific Computation, IEEE 2021.
  • 相关公司官网与公开发布的白皮书。

注:因检索未返回数据,所有具体规格和数字均为定性描述或基于公开领域知识,未作硬量声明。

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