---
title: TileLang 入门教程与 Excalidraw 图解
jupyter: python3
---


更新时间：2026-05-25

本目录是一套 TileLang 入门到面试复盘教程，包含详细 Markdown 教程和 6 张标准 `.excalidraw` 图。

## 文件

1. [`TUTORIAL`](TUTORIAL.qmd)：完整文字教程。
2. `00_tilelang_learning_roadmap.excalidraw`：学习路线。
3. `01_tilelang_programming_model.excalidraw`：编程模型。
4. `02_tilelang_kernel_anatomy.excalidraw`：kernel 解剖。
5. `03_tilelang_gemm_tile_flow.excalidraw`：GEMM tile 数据流。
6. `04_tilelang_tuning_debug_workflow.excalidraw`：调优与调试。
7. `05_tilelang_interview_map.excalidraw`：面试速查。
8. `generate_tilelang_tutorial.py`：重新生成教程和图。

## 资料来源

- TileLang docs: https://tilelang.com/
- TileLang GitHub: https://github.com/tile-ai/tilelang
- TileLang releases: https://github.com/tile-ai/tilelang/releases
- TileLang paper: https://arxiv.org/abs/2504.17577
- TVM docs: https://tvm.apache.org/docs/

截至 2026-05-25，TileLang 文档站页面显示版本为 0.1.10，GitHub releases 页面最新稳定标签为 v0.1.9。

## 练习题

1. 把同一个 GEMM tile 分别用 CUDA thread/block、Triton program、TileLang `T.Kernel` 三种语言描述，比较抽象粒度。
2. 修改 `BM/BN/BK/num_threads/num_stages`，记录 shared memory、寄存器压力和 latency 的变化。
3. 给一个非整除矩阵 shape，补齐边界保护，并用小 shape 对齐 PyTorch baseline。
4. 读生成代码或 IR，标出 global -> shared -> fragment -> global 的每一次数据移动。

## 面试题

1. TileLang 为什么强调 tiled dataflow，而不是让用户直接写每个 thread 的计算？
2. `T.copy`、`T.gemm`、`T.Pipelined` 分别对应 GPU kernel 里的哪些性能关键路径？
3. TileLang 和 Triton 都能写 GEMM，二者在抽象层、编译基础设施和调优方式上有什么不同？
4. 如果 TileLang kernel 性能不如预期，你会先检查 tile shape、memory scope、pipeline、生成代码还是 profiler 证据？

## 图示

```{=html}
<!-- xboard:00_tilelang_learning_roadmap.excalidraw -->
<div class="xboard"><div class="xb-h1" style="--tc:#1e40af" data-a="c">TileLang 入门学习路线</div><div class="xb-t" data-a="c">从能跑示例到能讲清 GPU kernel DSL 的完整路径</div><div class="xb-row xb-flow n3"><div class="xb-box" style="--bc:#2563eb;flex-grow:33" data-d="1"><div class="xb-h2" style="--tc:#243042" data-a="c">0  背景</div></div><div class="xb-box" style="--bc:#2563eb;flex-grow:33" data-d="1"><div class="xb-h2" style="--tc:#243042" data-a="c">1  安装</div></div><div class="xb-box" style="--bc:#2563eb;flex-grow:33" data-d="1"><div class="xb-h2" style="--tc:#243042" data-a="c">2  读例子</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">复习 CUDA block warp shared memory<br>理解 TIR 和 tile 的关系</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">pip 或源码安装<br>确认 Python CUDA glibc 要求</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">VectorAdd GEMM FlashAttention<br>先看 program 再看 generated code</div></div></div><div class="xb-row xb-flow n3"><div class="xb-box" style="--bc:#2563eb;flex-grow:33" data-d="1"><div class="xb-h2" style="--tc:#243042" data-a="c">3  写 kernel</div></div><div class="xb-box" style="--bc:#2563eb;flex-grow:33" data-d="1"><div class="xb-h2" style="--tc:#243042" data-a="c">4  调优</div></div><div class="xb-box" style="--bc:#2563eb;flex-grow:33" data-d="1"><div class="xb-h2" style="--tc:#243042" data-a="c">5  面试输出</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">用 T.Kernel 定义网格<br>用 T.Parallel 和 memory scope 表达并行</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">tile size num threads pipeline stages<br>autotune 加 profile 验证</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">能解释 TileLang vs Triton CUDA TVM<br>能画出 GEMM tile 数据流</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#475569;flex-grow:33" data-d="1"><div class="xb-h2" style="--tc:#1e40af">每天怎么学</div><div class="xb-t" data-a="c">第一天  跑通安装与 VectorAdd<br>第二天  拆 T.Kernel 和 T.Parallel<br>第三天  手写 tiled GEMM 骨架</div></div><div class="xb-box" style="--bc:#475569;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">第四天  加 shared memory 和 pipeline<br>第五天  autotune 并看 profiler<br>第六天  对比 Triton CUDA TVM</div></div><div class="xb-box" style="--bc:#475569;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">第七天  复盘面试题<br>目标不是背 API<br>而是能解释编程模型和性能路径</div></div></div></div>
<!-- /xboard -->
```
<p class="caption">学习路线 · <a href="00_tilelang_learning_roadmap.excalidraw">Excalidraw 源文件</a></p>

```{=html}
<!-- xboard:01_tilelang_programming_model.excalidraw -->
<div class="xboard"><div class="xb-h1" style="--tc:#1e40af" data-a="c">TileLang 编程模型总览</div><div class="xb-t" data-a="c">Python DSL 前端到 TVM IR 再到可运行 kernel</div><div class="xb-row xb-flow n3"><div class="xb-box" style="--bc:#2563eb;flex-grow:29" data-d="1"><div class="xb-h2" style="--tc:#1e40af">用户写的部分</div><div class="xb-t" data-a="c">@tilelang.jit<br>Python 函数返回 T.prim_func</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:35" data-d="1"><div class="xb-h2" style="--tc:#1e40af">Tile 级 DSL</div><div class="xb-t" data-a="c">循环<br>T.Parallel T.serial T.Pipelined T.unroll</div></div><div class="xb-box" style="--bc:#7c3aed;flex-grow:36" data-d="1"><div class="xb-h2" style="--tc:#1e40af">编译和运行</div><div class="xb-t" data-a="c">Lowering 到 TVM IR<br>检查结构是否符合硬件映射</div></div></div><div class="xb-row xb-flow n3"><div class="xb-box" style="--bc:#2563eb;flex-grow:29" data-d="1"><div class="xb-t" data-a="c">T.Tensor 和 T.Buffer<br>描述形状 dtype 与输入输出</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:35" data-d="1"><div class="xb-t" data-a="c">存储层级<br>global shared local fragment</div></div><div class="xb-box" style="--bc:#7c3aed;flex-grow:36" data-d="1"><div class="xb-t" data-a="c">生成目标代码<br>CUDA HIP CPU 或其他后端</div></div></div><div class="xb-row xb-flow n3"><div class="xb-box" style="--bc:#2563eb;flex-grow:29" data-d="1"><div class="xb-t" data-a="c">T.Kernel grid threads<br>描述 CTA 网格和线程块</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:35" data-d="1"><div class="xb-t" data-a="c">算子原语<br>T.copy T.gemm T.clear T.reduce_sum</div></div><div class="xb-box" style="--bc:#7c3aed;flex-grow:36" data-d="1"><div class="xb-t" data-a="c">Runtime 调用<br>传入 torch tensor 并执行</div></div></div><div class="xb-row xb-flow n3"><div class="xb-box" style="--bc:#d97706;flex-grow:33" data-d="1"><div class="xb-h2" style="--tc:#1e40af">三层心智模型</div><div class="xb-t" data-a="c">Beginner<br>用模板写出正确 kernel<br>先让数据路径可解释</div></div><div class="xb-box" style="--bc:#ea580c;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">Developer<br>控制 tile 形状、线程绑定、共享内存、pipeline<br>开始做性能调优</div></div><div class="xb-box" style="--bc:#dc2626;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">Expert<br>检查 IR、生成代码、tensorize、layout<br>把 DSL 映射到具体 GPU 指令</div></div></div></div>
<!-- /xboard -->
```
<p class="caption">编程模型 · <a href="01_tilelang_programming_model.excalidraw">Excalidraw 源文件</a></p>

```{=html}
<!-- xboard:02_tilelang_kernel_anatomy.excalidraw -->
<div class="xboard"><div class="xb-h1" style="--tc:#1e40af" data-a="c">TileLang Kernel 解剖图</div><div class="xb-t" data-a="c">把一段 TileLang 程序拆成 shape、grid、loop、memory、primitive</div><div class="xb-row xb-flow n3"><div class="xb-box" style="--bc:#475569;flex-grow:42" data-d="1"><div class="xb-h2" style="--tc:#1e40af">程序骨架</div><div class="xb-t" data-a="c">def kernel(M, N, K, dtype):<br>    @T.prim_func<br>    def main(A, B, C):<br>        with T.Kernel(grid, threads):</div></div><div class="xb-box" style="--bc:#2563eb;flex-grow:29" data-d="1"><div class="xb-t" data-a="c">形状和 dtype<br>决定 buffer 维度<br>决定 index 计算边界</div></div><div class="xb-box" style="--bc:#0891b2;flex-grow:29" data-d="1"><div class="xb-t" data-a="c">grid 和 threads<br>决定 CTA 数量<br>决定每个 CTA 的并行资源</div></div></div><div class="xb-row xb-flow n4"><div class="xb-box" style="--bc:#16a34a;flex-grow:26" data-d="1"><div class="xb-h2" style="--tc:#1e40af">GPU 映射</div><div class="xb-t" data-a="c">Block 或 CTA<br>处理一个 tile<br>例如 C 的 BM x BN 子矩阵</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:26" data-d="1"><div class="xb-t" data-a="c">Threads<br>T.Parallel 负责并行索引<br>threadIdx 负责合作搬运或计算</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:26" data-d="1"><div class="xb-t" data-a="c">Memory scopes<br>global 到 shared 到 fragment<br>减少 HBM 往返</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:23" data-d="1"><div class="xb-t" data-a="c">Primitives<br>copy gemm reduce clear<br>表达常见 tile 操作</div></div></div><div class="xb-h2" style="--tc:#1e40af">写程序时按这个顺序检查</div><div class="xb-row xb-steps"><div class="xb-box xb-step" style="--bc:#d97706;flex-grow:1" data-d="1"><span class="xb-num">1</span><div class="xb-t" data-a="c">每个 CTA 负责哪块输出</div></div><div class="xb-box xb-step" style="--bc:#d97706;flex-grow:1" data-d="1"><span class="xb-num">2</span><div class="xb-t" data-a="c">输入 tile 从哪搬到 shared</div></div><div class="xb-box xb-step" style="--bc:#d97706;flex-grow:1" data-d="1"><span class="xb-num">3</span><div class="xb-t" data-a="c">K 维怎么循环和 pipeline</div></div><div class="xb-box xb-step" style="--bc:#d97706;flex-grow:1" data-d="1"><span class="xb-num">4</span><div class="xb-t" data-a="c">fragment 上怎么累加</div></div><div class="xb-box xb-step" style="--bc:#d97706;flex-grow:1" data-d="1"><span class="xb-num">5</span><div class="xb-t" data-a="c">边界和 dtype 是否正确</div></div><div class="xb-box xb-step" style="--bc:#d97706;flex-grow:1" data-d="1"><span class="xb-num">6</span><div class="xb-t" data-a="c">调优参数是否可枚举</div></div></div></div>
<!-- /xboard -->
```
<p class="caption">kernel 解剖 · <a href="02_tilelang_kernel_anatomy.excalidraw">Excalidraw 源文件</a></p>

```{=html}
<!-- xboard:03_tilelang_gemm_tile_flow.excalidraw -->
<div class="xboard"><div class="xb-h1" style="--tc:#1e40af" data-a="c">Tiled GEMM 数据流</div><div class="xb-t" data-a="c">用一张图理解 TileLang 为什么要显式表达 tile、shared memory 和 pipeline</div><div class="xb-row"><div class="xb-box" style="--bc:#2563eb;flex-grow:11" data-d="1"><div class="xb-h2" style="--tc:#1e40af">全局内存</div><div class="xb-h2" style="--tc:#243042" data-a="c">A matrix<br>M x K</div></div><div class="xb-box" style="--bc:#2563eb;flex-grow:11" data-d="1"><div class="xb-h2" style="--tc:#243042" data-a="c">B matrix<br>K x N</div></div><div class="xb-box" style="--bc:#2563eb;flex-grow:11" data-d="1"><div class="xb-h2" style="--tc:#243042" data-a="c">C matrix<br>M x N</div></div><div class="xb-box" style="--bc:#475569;flex-grow:22" data-d="1"><div class="xb-h2" style="--tc:#1e40af">一个 CTA 的工作</div><div class="xb-row"><div class="xb-box" style="--bc:#0891b2;flex-grow:50" data-d="2"><div class="xb-t" data-a="c">A tile<br>BM x BK<br>shared</div></div><div class="xb-box" style="--bc:#0891b2;flex-grow:50" data-d="2"><div class="xb-t" data-a="c">B tile<br>BK x BN<br>shared</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#d97706;flex-grow:100" data-d="2"><div class="xb-t" data-a="c">Accumulator<br>BM x BN<br>fragment</div></div></div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:15" data-d="1"><div class="xb-h2" style="--tc:#1e40af">K 维主循环</div><div class="xb-t" data-a="c">for ko in K tiles<br>load A tile and B tile</div></div><div class="xb-box" style="--bc:#ea580c;flex-grow:15" data-d="1"><div class="xb-t" data-a="c">pipeline stages<br>当前 tile 计算<br>下一 tile 预取</div></div><div class="xb-box" style="--bc:#7c3aed;flex-grow:15" data-d="1"><div class="xb-t" data-a="c">store C tile<br>写回 global</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#dc2626;flex-grow:25" data-d="1"><div class="xb-h2" style="--tc:#1e40af">性能要点</div><div class="xb-t" data-a="c">tile size 太小<br>访存复用不足<br>launch 和同步开销占比高</div></div><div class="xb-box" style="--bc:#dc2626;flex-grow:25" data-d="1"><div class="xb-t" data-a="c">tile size 太大<br>shared memory 或 register 压力升高<br>occupancy 下降</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:25" data-d="1"><div class="xb-t" data-a="c">pipeline 合理<br>隐藏 global memory 延迟<br>提高 tensor core 利用</div></div><div class="xb-box" style="--bc:#d97706;flex-grow:25" data-d="1"><div class="xb-t" data-a="c">边界处理清晰<br>非整除 shape 也能跑<br>先正确再调优</div></div></div></div>
<!-- /xboard -->
```
<p class="caption">GEMM tile 数据流 · <a href="03_tilelang_gemm_tile_flow.excalidraw">Excalidraw 源文件</a></p>

```{=html}
<!-- xboard:04_tilelang_tuning_debug_workflow.excalidraw -->
<div class="xboard"><div class="xb-h1" style="--tc:#1e40af" data-a="c">TileLang 调优与调试工作流</div><div class="xb-t" data-a="c">从正确性到性能，再回到 IR 和 profiler 定位瓶颈</div><div class="xb-row xb-flow n3"><div class="xb-box" style="--bc:#2563eb;flex-grow:33" data-d="1"><div class="xb-h2" style="--tc:#243042" data-a="c">写 baseline</div></div><div class="xb-box" style="--bc:#2563eb;flex-grow:33" data-d="1"><div class="xb-h2" style="--tc:#243042" data-a="c">打印和检查</div></div><div class="xb-box" style="--bc:#2563eb;flex-grow:33" data-d="1"><div class="xb-h2" style="--tc:#243042" data-a="c">加 pipeline</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">先写最直观 tile kernel<br>用小 shape 对齐 torch 结果</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">用 T.print 或生成代码<br>确认索引和边界</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">T.Pipelined 控制阶段<br>检查 shared memory 生命周期</div></div></div><div class="xb-row xb-flow n3"><div class="xb-box" style="--bc:#2563eb;flex-grow:33" data-d="1"><div class="xb-h2" style="--tc:#243042" data-a="c">autotune</div></div><div class="xb-box" style="--bc:#2563eb;flex-grow:33" data-d="1"><div class="xb-h2" style="--tc:#243042" data-a="c">profile</div></div><div class="xb-box" style="--bc:#2563eb;flex-grow:33" data-d="1"><div class="xb-h2" style="--tc:#243042" data-a="c">固化模板</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">枚举 block size num threads<br>记录 latency 和 best config</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">Nsight 看 occupancy memory tensor core<br>不要只看单次耗时</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">把 shape family 和配置记录下来<br>形成可复用 kernel</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#dc2626;flex-grow:30" data-d="1"><div class="xb-h2" style="--tc:#1e40af">常见失败模式</div><div class="xb-t" data-a="c">结果错误<br>索引越界、mask 缺失、dtype 累加错误</div></div><div class="xb-box" style="--bc:#dc2626;flex-grow:35" data-d="1"><div class="xb-t" data-a="c">性能不涨<br>tile 形状不匹配硬件、访存未合并、pipeline 没隐藏延迟</div></div><div class="xb-box" style="--bc:#dc2626;flex-grow:35" data-d="1"><div class="xb-t" data-a="c">只会调参数<br>没有先画数据流<br>不知道瓶颈在 HBM shared 还是 register</div></div></div></div>
<!-- /xboard -->
```
<p class="caption">调优与调试 · <a href="04_tilelang_tuning_debug_workflow.excalidraw">Excalidraw 源文件</a></p>

```{=html}
<!-- xboard:05_tilelang_interview_map.excalidraw -->
<div class="xboard"><div class="xb-h1" style="--tc:#1e40af" data-a="c">TileLang 面试速查图</div><div class="xb-t" data-a="c">把学习内容收束成可讲清楚的问答框架</div><div class="xb-row"><div class="xb-box" style="--bc:#2563eb;flex-grow:51" data-d="1"><div class="xb-h2" style="--tc:#1e40af">一句话定义</div><div class="xb-t" data-a="c">TileLang 是面向高性能算子的 Python DSL<br>核心是用 tile 级抽象表达 GPU kernel<br>再经由 TVM 体系 lowering 到目标代码</div></div><div class="xb-box" style="--bc:#d97706;flex-grow:24" data-d="1"><div class="xb-h2" style="--tc:#1e40af">和其他工具比较</div><div class="xb-t" data-a="c">vs CUDA<br>CUDA 控制最细 但样板多<br>TileLang 更接近算法 tile 表达</div></div><div class="xb-box" style="--bc:#d97706;flex-grow:25" data-d="1"><div class="xb-t" data-a="c">vs Triton<br>Triton 编程体验更成熟<br>TileLang 更强调 TVM IR 和调度体系衔接</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#16a34a;flex-grow:23" data-d="1"><div class="xb-h2" style="--tc:#1e40af">必须能画出的图</div><div class="xb-t" data-a="c">GEMM tile<br>A/B global 到 shared<br>fragment 累加<br>C 写回</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:27" data-d="1"><div class="xb-t" data-a="c">FlashAttention tile<br>Q block 扫 K/V tile<br>online softmax 更新 m l O</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:25" data-d="1"><div class="xb-t" data-a="c">调优循环<br>baseline correctness<br>autotune profile 固化</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:25" data-d="1"><div class="xb-t" data-a="c">编译路径<br>Python DSL 到 TIR<br>到 CUDA source<br>到 runtime</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#7c3aed;flex-grow:25" data-d="1"><div class="xb-h2" style="--tc:#1e40af">常见追问</div><div class="xb-t" data-a="c">为什么要 shared memory<br>减少 global memory 访问<br>提升 tile 复用</div></div><div class="xb-box" style="--bc:#7c3aed;flex-grow:25" data-d="1"><div class="xb-t" data-a="c">pipeline 解决什么<br>隐藏 global load 延迟<br>让搬运和计算重叠</div></div><div class="xb-box" style="--bc:#7c3aed;flex-grow:25" data-d="1"><div class="xb-t" data-a="c">autotune 调什么<br>tile size threads stages<br>目标是延迟和资源平衡</div></div><div class="xb-box" style="--bc:#7c3aed;flex-grow:25" data-d="1"><div class="xb-t" data-a="c">怎么验证<br>小 shape 对齐 torch<br>大 shape profile<br>再看生成代码</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#475569;flex-grow:100" data-d="1"><div class="xb-h2" style="--tc:#1e40af">回答模板</div><div class="xb-h2" style="--tc:#243042" data-a="c">先讲算法 tile<br>再讲 GPU 映射<br>最后讲调优和验证<br>不要一上来背 API</div></div></div></div>
<!-- /xboard -->
```
<p class="caption">面试速查 · <a href="05_tilelang_interview_map.excalidraw">Excalidraw 源文件</a></p>
