学习资料
多范式算子开发实战营: 《九齿的设计思想与核心编程范式》课程回顾

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 区交流讨论。

关注与交流