9 月 15 日晚,多范式算子开发实战营邀请九齿 DSL 技术负责人黄嘉成老师,带来《九齿的设计思想与核心编程范式》。
本节课将介绍九齿的设计思想与核心编程范式,并结合九齿、Triton、TileLang 等多种 DSL,介绍不同 DSL 的设计理念及适用场景,还将结合概念验证阶段的实际开发需求,帮助大家了解 DSL 如何用于算子开发与硬件适配,以及不同开发方式之间的特点和差异。
一、 领域特定语言(DSL)
什么是 DSL?
1.Domain Specific Language 的定义与优势
2.AI/深度学习领域的常见 DSL:Triton, TileLang, 九齿
三者横向对比:以“向量加法”为例
1. 向量加法:并行编程界的 "Hello World"
2. 代码风格差异:
- Triton:显式 Program ID + 指针/索引运算
- TileLang:Pythonic
with语法 + Tiling 控制 - 九齿:Arrangement(排布)+ Application(应用)分离

设计出发点
1. Triton:屏蔽 CUDA 底层细节,保留 Block 级并行语义,跨平台性较好但仍有硬件差异
2. TileLang:显式暴露存储层级与流水线控制,追求更底层的手动优化空间
3. 九齿:进一步抽象掉指针与偏移量计算,追求更好的跨平台性与初学者友好度;以编译器优化换取高层抽象的性能损失

二、 Triton 编程基础
为什么需要 Triton?
- CUDA 的痛点:语法复杂、硬件门槛高、内存/线程管理繁琐
- Triton 的优势:Block-level 抽象、代码量少、快速达到专家级 80%-90% 性能

核心概念:从 Thread 到 Block
- 无需显式管理 Thread 级执行细节、Shared Memory 等底层资源
- 聚焦 SM 间调度与 Block 级数据访问

四大核心 API
program_id:定位当前 Worker 身份arange:生成递增向量,构造数据访问区域load:带 Mask 边界检查的数据读取(Pointer + Mask + Other)store:带 Mask 的安全数据写回

三、 九齿(NineToothed)核心设计思想
九齿是什么?
- 提供张量级抽象的 DSL
- 无指针、无 Program ID、无 Load/Store,一切皆张量
- 以 Triton 为主要编译后端(支持 TensorFlow/CUDA 扩展中)

为什么需要九齿?
- PyTorch 等框架层:接口简洁但定制化难
- Triton 等指针级 DSL:仍需并行思维转换,入门有门槛
- 九齿定位:让未接触并行编程的用户也能高效编写 Kernel

核心范式
- Arrangement(排布):描述数据如何切分与分布(Tile, Expand, Squeeze 等原语)
- Application(应用):描述单个 Tile 上的具体计算逻辑
代码对比:矩阵乘法(GEMM)
- Triton:厚重的 PID 变换、Offset 计算、指针 Increment
- 九齿:零指针运算,代码贴近算法自然语言描述

四、 DSL 的实际用途
Kernel vs Operator 的概念区分
- Kernel:纯计算单元,不负责内存分配与通信
- Operator:包含 Kernel 调用、内存管理、通信等广义算子

核心应用场景
- 现有算子融合/优化:如 FlashAttention,减少内存读写开销
- 新算子敏捷概念验证(PoC):快速搭建,验证有效性后再投入底层优化
- 新模型伴随新算子,DSL 加速“模型-算子”协同迭代
五、 向量加法
Triton 实现

九齿实现


范式推广:从向量加法到 GEMM/FlashAttention
- 万能公式:若干 Tensor → Arrangement 生成多组 Tiles → Application 逐组 Apply
- 核心理念:记住这三行关系,即掌握了九齿的所有复杂算子编写逻辑

双重可视化辅助理解
- 嵌套张量可视化:展示 Tile 后的多层结构(如长度 16 向量 → 外层 8×内层 2 的嵌套向量)

- 排布可视化:交互展示每组 Tile 与原张量的位置对应关系

完整代码示例与作业请访问课程仓库。如有疑问欢迎在 Issue 区交流讨论。
关注与交流

