土法炼钢兴趣小组的算法知识备份

【GPU 算子工程】算子库工程:dispatch、autotune cache 与 JIT

文章导航

分类入口
gpuarchitecture
标签入口
#cuda#nvrtc#jit#dispatch#autotune#kernel-library#aot

目录

算子库工程:dispatch、autotune cache 与 JIT

前面写的都是单个 kernel。但真实算子库要面对的是:同一个算子有几十种形状、好几种精度、多个 GPU 架构,每种组合的最优 kernel 还不一样。怎么在运行时选对 kernel、怎么缓存调优结果、怎么处理编译时机——这些工程问题决定了一个算子库能不能维护。这一篇讲这套机制,并以本系列实际使用的 NVRTC JIT 流程为例(本系列所有实测 kernel 都通过它编译运行)。

一、问题:一个算子,很多 kernel

以 GEMM 为例,第 10 篇 已经看到 tile 尺寸不同性能差几倍。一个生产级 GEMM 库要覆盖:

每个组合对应一个(或一组候选)kernel。库的核心工作就是:给定一次调用的 (shape, dtype, arch, layout),选出最快的 kernel 并启动。这个”选”的过程就是 dispatch。

二、Dispatch:运行时选 kernel

dispatch 把调用参数映射到具体 kernel 实现。常见做法分层:

flowchart TD
  A["算子调用<br/>(shape, dtype, arch, layout)"] --> B["按 dtype/arch 选 kernel 家族"]
  B --> C["按 shape 选 tile 配置<br/>(启发式 or 查表)"]
  C --> D["命中 autotune cache?"]
  D -->|是| E["用缓存的最优配置"]
  D -->|否| F["实测候选 / 用启发式默认"]
  F --> E
  E --> G["启动选定 kernel"]

dispatch 本身要快——它在每次算子调用的关键路径上。小算子场景下,dispatch 开销甚至可能和 kernel 本身相当,所以热路径的 dispatch 常用查表或缓存而非复杂决策。

三、Autotune 与缓存

Triton 篇 讲过 autotune:对一组候选配置实测、选最快。问题是 autotune 很慢(要把每个候选都跑一遍),不能每次调用都做。解决办法是缓存

缓存把”首次慢、后续快”做成常态:第一次遇到某 shape 时调优(或编译),结果存下来,之后零成本复用。

四、JIT vs AOT:编译时机

kernel 什么时候编译,是另一个核心选择:

JIT 的特化能力很关键:把 KBLOCK 这些当 constexpr 编译进 kernel,编译器能完全展开循环、消除边界判断,生成比”运行时传参”更快的代码。代价是每个特化都要编译一次——所以 JIT 也必须配编译结果缓存(缓存编译出的 PTX/cubin),否则反复编译同一个 kernel。

五、实例:本系列的 NVRTC JIT 流程

本系列所有实测 kernel 走的就是一套最小 JIT 流程,正好示范 JIT 的各个环节:

# 1. 运行时把 CUDA C++ 源码字符串编译成 PTX(NVRTC)
prog = nvrtc.nvrtcCreateProgram(src, ...)
nvrtc.nvrtcCompileProgram(prog, opts)   # opts 含 --gpu-architecture=compute_86、--include-path=<头文件目录>
ptx = nvrtc.nvrtcGetPTX(prog)
# 2. 把 PTX 加载成可启动的 module/function(驱动 API)
mod = driver.cuModuleLoadData(ptx)
fn = driver.cuModuleGetFunction(mod, b"my_kernel")
# 3. 用 driver API 启动,CUDA event 计时
driver.cuLaunchKernel(fn, grid, block, ..., args)

这套流程的几个工程点,正是生产 JIT 库的缩影:

六、其他工程关注点

一个可维护的算子库还要处理:

这些不性感,但决定了算子库在生产里能不能稳定跑、好不好维护——和 算法工程 里任何高性能库的工程问题同构。

七、小结与下一步

库工程的另一半是正确性。下一篇讲 调试与数值正确性:compute-sanitizer 与对齐测试

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-06-28 · gpu / architecture

【GPU 算子工程】Triton:tile 级编程模型与 autotune

Triton 用 tile(block of pointers)抽象替代 CUDA 的单线程视角,把合并访问、shared 管理、bank conflict 交给编译器,配合 autotune 自动搜配置。讲清它的编程模型、与手写 CUDA 的能力边界,以及为什么它成了算子开发主力。


By .