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


更新时间：2026-05-25

本目录包含一套 Triton 入门到面试复盘教程，配套 6 张标准 `.excalidraw` 图。

## 文件

1. [`TUTORIAL`](TUTORIAL.qmd)：完整文字教程、练习题和面试题。
2. `00_triton_learning_roadmap.excalidraw`：学习路线。
3. `01_triton_programming_model.excalidraw`：编程模型。
4. `02_triton_vector_add_softmax.excalidraw`：Vector Add 与 Softmax。
5. `03_triton_matmul_tile_flow.excalidraw`：Matmul tile 数据流。
6. `04_triton_autotune_debug_workflow.excalidraw`：Autotune、debug、profile。
7. `05_triton_interview_map.excalidraw`：面试速查。
8. `generate_triton_tutorial.py`：重新生成教程和图。

## 资料来源

- Triton docs: https://triton-lang.org/main/index.html
- Triton tutorials: https://triton-lang.org/main/getting-started/tutorials/
- Triton installation: https://triton-lang.org/main/getting-started/installation.html
- Triton language API: https://triton-lang.org/main/python-api/triton.language.html
- Triton releases: https://github.com/triton-lang/triton/releases
- OpenAI Triton intro: https://openai.com/index/triton/

截至 2026-05-25，GitHub releases 页面显示最新 release 为 v3.7.0。

## 练习题

1. 把 Vector Add 改成 AXPY：`z = a * x + y`，比较 `BLOCK_SIZE=256/512/1024/2048` 的带宽。
2. 写 row-wise softmax，支持非 2 的幂列数，对齐 PyTorch baseline，并解释 mask 的必要性。
3. 写一个最小 matmul，修改 `BLOCK_M/BLOCK_N/BLOCK_K/num_warps/num_stages` 并记录延迟。
4. 将同一个 GEMM tile 用 Triton 和 TileLang 各画一遍，说明 program/grid 与 T.Kernel/T.copy 的对应关系。

## 面试题

1. Triton program 和 CUDA thread/block 的抽象差异是什么？
2. `tl.constexpr`、`tl.arange`、`tl.load mask` 分别解决什么问题？
3. matmul 中 program ordering 和 `GROUP_M` 为什么影响 L2 cache locality？
4. Triton 与 TileLang、CUDA、torch.compile/Inductor 的关系分别是什么？

## 图示

```{=html}
<!-- xboard:00_triton_learning_roadmap.excalidraw -->
<div class="xboard"><div class="xb-h1" style="--tc:#1e40af" data-a="c">Triton 入门学习路线</div><div class="xb-t" data-a="c">从第一个 @triton.jit 到能解释 matmul、softmax、attention kernel</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  Vector Add</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<br>理解 GPU memory hierarchy</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">pip install triton<br>确认 PyTorch CUDA 环境</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">program_id arange mask<br>掌握 launch grid</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  Fused Softmax</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  Matmul</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  Attention</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">一行一个 program<br>用 tl.max tl.sum 减少访存</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">BLOCK_M/N/K tl.dot<br>program 分组和 L2 复用</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">QK softmax PV 分块<br>理解 FlashAttention 风格</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">会从 PyTorch wrapper 调用 kernel<br>能解释 grid lambda 和 meta-parameters</div></div><div class="xb-box" style="--bc:#475569;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">会画 program 对应的数据 block<br>知道 mask 防越界和 constexpr 的作用</div></div><div class="xb-box" style="--bc:#475569;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">会用 triton.testing.do_bench 或 profiler<br>比较 baseline、Triton、torch 结果</div></div></div></div>
<!-- /xboard -->
```
<p class="caption">学习路线 · <a href="00_triton_learning_roadmap.excalidraw">Excalidraw 源文件</a></p>

```{=html}
<!-- xboard:01_triton_programming_model.excalidraw -->
<div class="xboard"><div class="xb-h1" style="--tc:#1e40af" data-a="c">Triton 编程模型</div><div class="xb-t" data-a="c">Triton program 是比 CUDA thread 更粗的 block-level 单元</div><div class="xb-row xb-flow n3"><div class="xb-box" style="--bc:#2563eb;flex-grow:31" data-d="1"><div class="xb-h2" style="--tc:#1e40af">Host 侧</div><div class="xb-t" data-a="c">Python wrapper<br>准备 torch tensors<br>计算 grid</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:35" data-d="1"><div class="xb-h2" style="--tc:#1e40af">Kernel 侧</div><div class="xb-t" data-a="c">@triton.jit<br>函数被 JIT 编译为 GPU kernel</div></div><div class="xb-box" style="--bc:#7c3aed;flex-grow:35" data-d="1"><div class="xb-h2" style="--tc:#1e40af">数据与计算</div><div class="xb-t" data-a="c">tl.load / tl.store<br>mask + other 处理边界</div></div></div><div class="xb-row xb-flow n3"><div class="xb-box" style="--bc:#2563eb;flex-grow:31" data-d="1"><div class="xb-t" data-a="c">kernel[grid](args,<br>BLOCK_SIZE=..., num_warps=...)</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:35" data-d="1"><div class="xb-t" data-a="c">tl.program_id(axis)<br>当前 program 在 grid 中的位置</div></div><div class="xb-box" style="--bc:#7c3aed;flex-grow:35" data-d="1"><div class="xb-t" data-a="c">tl.dot / reductions / math ops<br>在 block tensor 上表达计算</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#16a34a;flex-grow:50" data-d="1"><div class="xb-t" data-a="c">tl.arange / pointer arithmetic<br>构造 block 内 offsets</div></div><div class="xb-box" style="--bc:#7c3aed;flex-grow:50" data-d="1"><div class="xb-t" data-a="c">compiler lowering<br>TTIR -&gt; TTGIR -&gt; LLVM/PTX/AMDGPU</div></div></div><div class="xb-row xb-flow n3"><div class="xb-box" style="--bc:#d97706;flex-grow:28" data-d="1"><div class="xb-h2" style="--tc:#1e40af">和 CUDA 的映射</div><div class="xb-t" data-a="c">CUDA thread<br>细粒度线程<br>显式 threadIdx/blockIdx</div></div><div class="xb-box" style="--bc:#ea580c;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">Triton program<br>一个 block-level 程序<br>一次处理向量或矩阵 tile</div></div><div class="xb-box" style="--bc:#dc2626;flex-grow:39" data-d="1"><div class="xb-t" data-a="c">meta-parameters<br>BLOCK_M/N/K num_warps num_stages<br>决定编译特化和性能</div></div></div></div>
<!-- /xboard -->
```
<p class="caption">编程模型 · <a href="01_triton_programming_model.excalidraw">Excalidraw 源文件</a></p>

```{=html}
<!-- xboard:02_triton_vector_add_softmax.excalidraw -->
<div class="xboard"><div class="xb-h1" style="--tc:#1e40af" data-a="c">Vector Add 与 Fused Softmax</div><div class="xb-t" data-a="c">先用两个基础 kernel 建立 block tensor 和 mask 心智模型</div><div class="xb-row"><div class="xb-box" style="--bc:#2563eb;flex-grow:50" data-d="1"><div class="xb-h2" style="--tc:#1e40af">Vector Add</div><div class="xb-t" data-a="c">grid = ceildiv(N, BLOCK_SIZE)<br>每个 program 处理一段连续元素</div></div><div class="xb-box" style="--bc:#d97706;flex-grow:50" data-d="1"><div class="xb-h2" style="--tc:#1e40af">Fused Softmax</div><div class="xb-t" data-a="c">一个 program 处理一行<br>BLOCK_SIZE 取 next_power_of_2</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#0891b2;flex-grow:50" data-d="1"><div class="xb-t" data-a="c">offsets = pid * BLOCK_SIZE + arange<br>mask = offsets &lt; N</div></div><div class="xb-box" style="--bc:#ea580c;flex-grow:50" data-d="1"><div class="xb-t" data-a="c">load row<br>x - max(x)<br>exp / sum / normalize</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#16a34a;flex-grow:50" data-d="1"><div class="xb-t" data-a="c">tl.load x y<br>z = x + y<br>tl.store mask</div></div><div class="xb-box" style="--bc:#7c3aed;flex-grow:50" data-d="1"><div class="xb-t" data-a="c">只读写一次 global memory<br>比 PyTorch 多 op 路径更省 HBM</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#475569;flex-grow:26" data-d="1"><div class="xb-h2" style="--tc:#1e40af">共同检查点</div><div class="xb-t" data-a="c">program_id 是否映射到正确数据块</div></div><div class="xb-box" style="--bc:#475569;flex-grow:26" data-d="1"><div class="xb-t" data-a="c">mask 是否覆盖尾部和 padding</div></div><div class="xb-box" style="--bc:#475569;flex-grow:29" data-d="1"><div class="xb-t" data-a="c">BLOCK_SIZE 是否影响 occupancy 和寄存器</div></div><div class="xb-box" style="--bc:#475569;flex-grow:20" data-d="1"><div class="xb-t" data-a="c">结果要和 torch baseline 对齐</div></div></div></div>
<!-- /xboard -->
```
<p class="caption">Vector Add 与 Softmax · <a href="02_triton_vector_add_softmax.excalidraw">Excalidraw 源文件</a></p>

```{=html}
<!-- xboard:03_triton_matmul_tile_flow.excalidraw -->
<div class="xboard"><div class="xb-h1" style="--tc:#1e40af" data-a="c">Triton Matmul Tile 数据流</div><div class="xb-t" data-a="c">理解 BLOCK_M/N/K、tl.dot、program grouping 和 L2 复用</div><div class="xb-row"><div class="xb-box" style="--bc:#16a34a;flex-grow:31" data-d="1"><div class="xb-h2" style="--tc:#1e40af">输出 tile</div><div class="xb-t" data-a="c">program_id 映射到 C 的<br>BLOCK_M x BLOCK_N tile</div></div><div class="xb-box" style="--bc:#2563eb;flex-grow:21" data-d="1"><div class="xb-h2" style="--tc:#1e40af">K 维循环</div><div class="xb-t" data-a="c">A block<br>BLOCK_M x BLOCK_K</div></div><div class="xb-box" style="--bc:#2563eb;flex-grow:21" data-d="1"><div class="xb-t" data-a="c">B block<br>BLOCK_K x BLOCK_N</div></div><div class="xb-box" style="--bc:#ea580c;flex-grow:26" data-d="1"><div class="xb-h2" style="--tc:#1e40af">性能控制</div><div class="xb-t" data-a="c">num_warps<br>影响并行度和调度</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#16a34a;flex-grow:37" data-d="1"><div class="xb-t" data-a="c">pid_m, pid_n<br>决定 A/B/C 的指针偏移</div></div><div class="xb-box" style="--bc:#d97706;flex-grow:32" data-d="1"><div class="xb-t" data-a="c">accumulator<br>BLOCK_M x BLOCK_N<br>float32</div></div><div class="xb-box" style="--bc:#ea580c;flex-grow:32" data-d="1"><div class="xb-t" data-a="c">num_stages<br>影响软件流水和寄存器压力</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#ea580c;flex-grow:100" data-d="1"><div class="xb-t" data-a="c">GROUP_M<br>让相邻 program 复用 B tile<br>改善 L2 locality</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">为什么 accumulator 用 fp32<br>减少 K 维累加误差</div></div><div class="xb-box" style="--bc:#7c3aed;flex-grow:25" data-d="1"><div class="xb-t" data-a="c">为什么要分组 program order<br>提高 L2 cache 复用</div></div><div class="xb-box" style="--bc:#7c3aed;flex-grow:28" data-d="1"><div class="xb-t" data-a="c">BLOCK_K 过大或过小分别怎样<br>寄存器压力 vs 复用不足</div></div><div class="xb-box" style="--bc:#7c3aed;flex-grow:22" data-d="1"><div class="xb-t" data-a="c">mask 在非整除 M/N/K 时如何保护<br>load/store 都要考虑</div></div></div></div>
<!-- /xboard -->
```
<p class="caption">Matmul tile 数据流 · <a href="03_triton_matmul_tile_flow.excalidraw">Excalidraw 源文件</a></p>

```{=html}
<!-- xboard:04_triton_autotune_debug_workflow.excalidraw -->
<div class="xboard"><div class="xb-h1" style="--tc:#1e40af" data-a="c">Triton Autotune 与 Debug 工作流</div><div class="xb-t" data-a="c">正确性、benchmark、autotune、profile 要按证据闭环</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">写 Triton</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">benchmark</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">torch reference<br>小 shape assert_close</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">先固定 BLOCK_SIZE<br>只求索引正确</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">triton.testing.do_bench<br>warmup + repeat</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">debug</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><div class="xb-row"><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">triton.Config<br>key 决定何时重新搜索</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">static_print device_print<br>Triton interpreter</div></div><div class="xb-box" style="--bc:#94a3b8;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">Nsight/Proton<br>看内存、寄存器、occupancy</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">只测整除 shape<br>尾部 mask 没覆盖</div></div><div class="xb-box" style="--bc:#dc2626;flex-grow:36" data-d="1"><div class="xb-t" data-a="c">autotune kernel 有副作用<br>没有 reset_to_zero 或 restore_value</div></div><div class="xb-box" style="--bc:#dc2626;flex-grow:34" data-d="1"><div class="xb-t" data-a="c">只看平均耗时<br>忽略 p95、冷启动、cache 状态</div></div></div></div>
<!-- /xboard -->
```
<p class="caption">Autotune、debug、profile · <a href="04_triton_autotune_debug_workflow.excalidraw">Excalidraw 源文件</a></p>

```{=html}
<!-- xboard:05_triton_interview_map.excalidraw -->
<div class="xboard"><div class="xb-h1" style="--tc:#1e40af" data-a="c">Triton 面试速查图</div><div class="xb-t" data-a="c">把 Triton 学习收束成可讲述的题目框架</div><div class="xb-row"><div class="xb-box" style="--bc:#2563eb;flex-grow:53" data-d="1"><div class="xb-h2" style="--tc:#1e40af">一句话定义</div><div class="xb-t" data-a="c">Triton 是 Python-based GPU kernel DSL 和 compiler<br>让用户用 block-level program 写 DNN 自定义算子<br>常用于 PyTorch 生态中的 fusion 和 matmul/attention 优化</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:22" data-d="1"><div class="xb-h2" style="--tc:#1e40af">必须讲清的机制</div><div class="xb-t" data-a="c">program_id 和 grid<br>决定数据块映射</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:24" data-d="1"><div class="xb-t" data-a="c">mask 和 pointer arithmetic<br>决定边界安全</div></div></div><div class="xb-row"><div class="xb-box" style="--bc:#16a34a;flex-grow:48" data-d="1"><div class="xb-t" data-a="c">meta-parameters<br>决定编译特化和搜索空间</div></div><div class="xb-box" style="--bc:#16a34a;flex-grow:52" data-d="1"><div class="xb-t" data-a="c">tl.dot / reductions<br>决定 block tensor 计算</div></div></div><div class="xb-row"><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">vs CUDA<br>Triton 更少样板 更适合块级 DNN kernel<br>CUDA 控制更细</div></div><div class="xb-box" style="--bc:#d97706;flex-grow:35" data-d="1"><div class="xb-t" data-a="c">vs TileLang<br>Triton 生态更成熟<br>TileLang 更强调 tiled dataflow + TVM 衔接</div></div><div class="xb-box" style="--bc:#d97706;flex-grow:33" data-d="1"><div class="xb-t" data-a="c">vs torch.compile<br>Inductor 可生成 Triton<br>手写 Triton 用于更可控的热点 kernel</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">先画数据块<br>再讲 program/grid<br>再讲 tl.load/tl.store/tl.dot<br>最后讲调优证据和边界条件</div></div></div></div>
<!-- /xboard -->
```
<p class="caption">面试速查 · <a href="05_triton_interview_map.excalidraw">Excalidraw 源文件</a></p>
