关于 design-cute-dsl-kernel
面向 GPU 内核开发者的 CuTe Python DSL 设计技能,用于决定何时从 cuTile 转向 CuTe DSL,并指导内核结构、自动调优与架构兼容性检查。
主要功能
- 01评估转用 CuTe DSL 的条件
- 02指导主机与设备端内核结构
- 03提供 CuteKernel 自动调优模式
- 04验证 GPU 架构与资源限制
- 05提示同步和内存使用陷阱
适用场景
- 01为需要 warpgroup 控制的优化选型
- 02设计显式 TMA 流水线内核
- 03检查 Blackwell GPU 指令集兼容性
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ pepperu96/ hyper-mla --skill design-cute-dsl-kernel安装后在 Claude Code 中输入/design-cute-dsl-kernel确认已加载。
详细介绍
CuTe Python DSL 内核设计
还要始终加载 /design-kernel,以获取通用的命名、版本管理和工作流规范。
还要加载 /cute-dsl-ref,以获取 API 参考、执行模型和架构操作相关内容。
何时使用 CuTe Python DSL
当 cuTile 的公共控制能力已不再满足需求,但仍适合采用 Python 编写内核的工作流时,请使用 CuTe Python DSL(cute-dsl)。
适用性判断
当下一步优化需要以下任何一种 cuTile 未提供的控制能力时,CuTe DSL 就是合适的选择:
- 线程/warp/warpgroup 标识——显式控制各线程的工作内容
- CTA 内同步——屏障、命名屏障、到达/等待模式
- Warpgroup 调度——生产者/消费者 warpgroup 角色、持久化 warpgroup 循环
- TMA 流水线控制——带屏障同步的显式多阶段异步复制流水线
- 集群编程——跨 CTA 共享内存访问、分布式共享内存
- 寄存器级数据移动——显式的寄存器间 shuffle、warp 级原语
- 自定义 epilogue——具备细粒度控制的融合后处理
何时继续使用 cuTile
如果仍可通过 tile 大小、CTA 重映射、occupancy/num_ctas 提示、延迟提示或 allow_tma 标志来实现优化,请继续使用 cuTile。CuTe DSL 会增加复杂性,因此只有在这份复杂性不可或缺时才使用它。
硬性设计约束
当性能分析显示每个 SM 仅有 1 个 CTA、符合条件的 warp 数较少,且解决方案需要显式的 warpgroup 或屏障调度时,cuTile 无法弥补差距。这是切换到 CuTe DSL 的典型触发条件。
命名与布局
- 公共语言键:
cute-dsl - Python 包路径:
cute_python - 内核布局:
src/mla_var3/kernel/cute_python/<layer>/<design>/<design>[_vN]/ - 模块:
<design>[_vN].py - 包装器:
CuteKernel
CuteKernel 运行时模式
运行时包装器位于 src/mla_var3/runtime/cute_kernel.py。
CuTe DSL 内核采用两级主机/设备模式:
@cute.jit主机函数负责设置 TMA 描述符、计算网格并启动内核@cute.kernel设备函数包含 GPU 代码
CuteKernel 数据类封装了此模式:
from mla_var3.runtime.cute_kernel import CuteKernel
# In KernelPlan.plan():
def plan(self, *inputs):
# Build a closure that captures inputs and calls the host function
def launch_fn(tiling):
# Convert tensors, set up TMA descriptors, compute grid
host_fn(tiling, *converted_inputs)
return CuteKernel(
kernel_fn=device_kernel, # The @cute.kernel function (for naming)
launch_fn=launch_fn, # Closure: (tiling) -> launches kernel
input_tensors=list(inputs),
output_tensors=[output],
tiling=self.tiling,
autotune_configs=self._autotune_configs(),
algorithmic_flops_bytes_fn=self._algorithmic_flops_bytes,
)
与 CtKernel 的主要区别
| Aspect | CtKernel (cuTile) | CuteKernel (CuTe DSL) |
|---|---|---|
| 启动机制 | grid_fn + args_fn + cuTile 编译器 | 封装 @cute.jit 主机函数的 launch_fn 闭包 |
| 编译 | cuTile 字节码 + MLIR | CuTe DSL JIT(自动缓存) |
| 自动调优 | 来自 cuda.tile_experimental 的 autotune_launch() | 针对每种配置调用 triton.testing.do_bench_cudagraph |
| 网格设置 | grid_fn(cfg) -> (x, y, z) | 在 launch_fn / 主机函数内部 |
| TMA 描述符 | 隐式(由 cuTile 处理) | 在主机函数中显式设置 |
自动调优
CuteKernel 会遍历 autotune_configs,使用 do_bench_cudagraph 对每种配置进行基准测试,并选择最快的配置。失败的配置会被捕获并跳过。
编译
CuTe DSL JIT 会自动缓存产物。compile() 方法会创建输出目录,但不会提取显式产物(可按内核扩展)。
分块数据类指南
CuTe DSL 分块通常包含 cuTile 分块没有的字段:
@dataclass
class Tiling:
# Standard tile dimensions
tile_m: int
tile_n: int
tile_k: int
# CuTe DSL-specific fields
num_warpgroups: int # Warpgroups per CTA (typically 2-4)
num_pipeline_stages: int # Async copy pipeline depth
num_tma_buffers: int # TMA double/triple buffering
cluster_m: int = 1 # Cluster shape (M dimension)
cluster_n: int = 1 # Cluster shape (N dimension)
def validate(self, pd) -> bool:
# Validate against problem dimensions and device limits
...
具体字段取决于内核设计。validate 方法应检查分块维度能否整除问题维度,并确保资源用量(寄存器、SMEM)不超过设备限制。
架构兼容性检查
内核可能会针对需要特定 SM 版本的架构专用指令。营销名称“Blackwell”涵盖多个 SM 版本,且它们的指令集不同:
- SM100(B200、B300)——数据中心 GPU,支持
tcgen05MMA、TMEM 和完整的集群功能 - SM120(GeForce RTX 5090、RTX 5080)——消费级 Blackwell,使用
sm_120a,不支持tcgen05操作
使用 tcgen05 操作的内核需要 SM100,即使 RTX 5090(SM120)和它们都属于“Blackwell”,该内核也无法在 RTX 5090 上运行。
运行、编译或分析 CuTe DSL 内核之前,务必确认可用设备:
nvidia-smi --query-gpu=name --format=csv,noheader
然后根据 GPU 名称确认其 SM 版本。如果内核的目标 SM 版本不匹配,请跳过运行/分析步骤。不要尝试执行——这要么会在编译时失败,要么会产生误导性结果。在内核开发日志中记录架构要求,并注明已跳过。
常见陷阱
- 切勿臆造 CuTe DSL API——请查阅
/cute-dsl-ref技能、docs/cute-dsl/文档或 CUTLASS 示例内核进行核实 @cute.kernel函数名必须与模块文件名一致(与 cuTile 规则相同)- TMA 描述符只能在主机端设置——没有适当的
@cute.jit主机端设置时,不要尝试在@cute.kernel内执行 TMA 操作 - 寄存器预算:每个线程最多 255 个;请通过
docs/devices/和src/mla_var3/conf/devices.json,根据活动设备的 SM 限制进行验证 - 共享内存因 SM 版本而异:SM100(B200/B300)每个 SM 最多 228 KB,每个区块可选择启用 227 KB;SM120(RTX 5090)为 96 KB——不要假设“Blackwell”就意味着数据中心级 SMEM 限制
- 流水线阶段数会影响 SMEM 用量(每个阶段都需要自己的缓冲区)——增加阶段数之前,请验证 SMEM 总量
- 屏障同步错误不会显式报错,会导致结果错误而非崩溃——务必使用
--check进行测试 - 集群编程要求启动时使用兼容集群的网格维度
参考资源
- API 参考:加载
/cute-dsl-ref,查看核心 API 表、执行模型和架构操作 - 官方文档:
docs/cute-dsl/(CuTe Python DSL)和docs/cutlass-cpp/cute/(CuTe C++ 概念) - 示例内核和学习路径:加载
/learn-cute-dsl,查看分类整理的 CUTLASS 示例内核索引
知识链接
- 共享优化知识:
docs/knowledge/optimizations/ - 共享反模式:
docs/knowledge/anti-patterns/ - CuTe Python DSL 覆盖文档:
docs/knowledge/languages/cute-dsl/
开发日志条目
使用 docs/kernels/<kernel>.md,并以 Python 包路径格式记录实现位置:
src/mla_var3/kernel/cute_python/mla/<kernel>/<kernel>[_vN]/