跳到主要内容
TileLang 系统教程

tilelang-tutorial.huandu.me

第 33 章 TileKernels(上):一份算法,两个后端

/code/33-tilekernels-two-backends/

03-map-and-diff/README.md4522 字节
# 示例 03:清点三层结构 + 产出后端结构对照表

## 目的

正文 §2 与 §4.4 的**数据来源**。这个脚本不 import `torch`、不 import `tilelang`、
不需要任何加速器:它只读源码文本,做三件事:

1. 扫描一个 TileKernels 源码树,列出所有 `*_kernel.py` / `*_cuda.py` / `*_asc.py`
   三元组(缺哪个也照实报告);
2. 对每一对 `*_cuda.py` / `*_asc.py`,统计一组**结构性标记**的出现次数,
   产出对照表(正文 §4.4 那张表就是它的第一行);
3. 在 TileLang 锁定源码树里核对本章点名过的 API 是否**真的存在**。

它是「本章的结论不靠记忆、靠可复现的机械核对」这句话的落实。

## 运行前提

* Python 3.9+,**仅标准库**;
* 一个 TileKernels 源码树(默认指向 corpus 快照,
  见 `../references.md` 的 `T1`);
* 可选的 TileLang 锁定源码树(用于第 3 步;默认指向 `_vendor/tilelang-v0.1.15/`)。

## 运行命令

```bash
# 用默认路径(本章写作时用的 corpus 快照与 vendor 树)
python3 map_and_diff.py

# 指定别的 TileKernels 检出(例如 git clone 下来的最新 main)
python3 map_and_diff.py --root /path/to/TileKernels/tile_kernels

# 只做前两步(不核对 API)
python3 map_and_diff.py --skip-api-check
```

## 作者实际运行过的输出(`--root` 用默认值)

### 第 1 步:三层结构清单

```
扫描根目录:.../tilelang-corpus/14-deepseek-ascend-stack/raw/TileKernels/tile_kernels
== 1. 三层结构清单 ==

engram/engram_fused_weight                    ✓       ✓     ✓
engram/engram_gate_bwd                        ✓       ✓     ✓
...
moe/moe_topk_gate_forward                     ✓       ✓     ✓
moe/normalize_weight                          ✓       ✓     ✓
moe/topk_gate                                 ✓       ✓     ✓
quant/per_token_cast                          ✓       ✓     ✓
quant/swiglu_forward                          ✓       ✓     ✓
rand/randn                                    ✓       —     ✓
transform/rope                                ✓       ✓     ✓
------------------------------------------------------------------
合计 33 个算子家族;三件齐全的 32 个。
```

`rand/randn` 是唯一没有 CUDA 实现的一个——正文 §6.2 专门讲了它。

### 第 2 步:结构性对照(本章的核心样本)

```
--- moe/topk_gate ---
结构性标记                               cuda   asc
CUDA 版按 token 开网格                      1     0  <-- 只在一边
Ascend 版按 Vector 核开网格                  0     1  <-- 只在一边
显式线程数(SIMT)                            1     0  <-- 只在一边
fragment(寄存器)                          5     0  <-- 只在一边
reducer(延迟归约)                          2     0  <-- 只在一边
shared / UB                            1     3
显式缓冲版本                                 0     1  <-- 只在一边
软件流水                                   0     1  <-- 只在一边
SIMD 向量作用域                             0     2  <-- 只在一边
手写同步                                   0     1  <-- 只在一边
PDL(CUDA-only)                         1     0  <-- 只在一边
显式向量宽度                                 0    15  <-- 只在一边
位视图                                    0     1  <-- 只在一边
```

这张表把 §4.4 的每一行都变成了可复算的计数。注意 `显式向量宽度` 是 **0 : 15**
——「昇腾把宽度写出来」不是修辞,是 15 处 `vector_length` 相关引用。

### 第 3 步:API 存在性核对

```
== 3. 本章用到的 API 在锁定版本里的存在性 ==
alloc_reducer              ok  (tilelang/language/allocate.py)
reducer_init               ok  (tilelang/language/reduce_op.py)
reducer_update             ok  (tilelang/language/reduce_op.py)
finalize_reducer           ok  (tilelang/language/reduce_op.py)
pdl_sync                   ok  (tilelang/cuda/language/pdl.py)
pdl_trigger                ok  (tilelang/cuda/language/pdl.py)
view                       ok  (tilelang/language/customize.py)
SimdVF                     ok  (tilelang/ascend/language/frame.py)
SimtVF                     ok  (tilelang/ascend/language/frame.py)
Kernel                     ok  (tilelang/ascend/language/kernel.py, ...)  (+5 more)
annotate_buffer_versions   ok  (tilelang/ascend/language/annotations.py)
Pipelined                  ok  (tilelang/language/loop.py)
Persistent                 ok  (tilelang/language/loop.py)
import_source              ok  (tilelang/language/common.py)
rng_init                   ok  (tilelang/ascend/language/random.py, tilelang/cuda/language/random.py)
rng_rand_float             ok  (tilelang/cuda/language/random.py)
warp_reduce_min            ok  (tilelang/language/reduce_op.py, ...)
warp_reduce_max            ok  (tilelang/language/reduce_op.py, ...)
warp_reduce_sum            ok  (tilelang/language/reduce_op.py, ...)
get_thread_binding         ok  (tilelang/ascend/language/kernel.py, tilelang/language/kernel.py)  (+6 more)
device_assert              ok  (tilelang/ascend/debug.py, tilelang/cuda/debug.py)

21/21 命中;缺:无
```

**这一步只证明「名字存在」,不证明签名与语义**——本章正文的每条 API 结论
都是另外逐行读定义得到的(见 `../references.md` 的核验方式一栏)。

## 验证级别

**CPU 逻辑验证**:作者在 macOS (Apple Silicon)、Python 3.11 上**实际运行过**,
输出就是上面这三段(行号与语料快照 commit `66258df6175d` 对应)。

## 已知局限

* 结构性标记是**字符串计数**,不是 AST 分析:注释里出现的同名子串也会被计入。
  它用来做「一边有一边没有」的快速对照,不用于精确统计。
* 默认的 `--root` / `--vendor` 是相对于本文件的路径;把示例复制到别处时请显式传参。
* 换一个 TileKernels 版本,计数会变;对照结论只对本章锁定的快照成立。

← 浏览本章全部代码