MLIR 编译器主线
8 课现代 AI 编译器基础与 Dialect 演进
MLIR 编译器核心主线
深入 LLVM MLIR 体系,学习下一代 AI 编译器的多层 IR 设计、方言生态、转换重写与针对 GPU/LLVM 的逐级 Lowering 流水线。
学习目标
掌握 Operation、Block、Region、SSA Value 的核心数据结构;
掌握 ODS (Operation Definition Specification) 与 TableGen 声明式语法;
掌握 PatternRewriter、贪心重写与 Dialect Conversion 框架;
理解 Tensor 到 MemRef 的 Bufferization 别名与显存分配机制。
课程目录
| 课程名称 | 模块归属 |
|---|---|
| 第 1 课:IR 层级、SSA 与 Region | MLIR 编译器主线 |
| 第 2 课:Dialect、Type、Attribute 与接口 | MLIR 编译器主线 |
| 第 3 课:ODS/TableGen 与自定义 Operation | MLIR 编译器主线 |
| 第 4 课:Pass、PatternRewriter 与贪心重写 | MLIR 编译器主线 |
| 第 5 课:Dialect Conversion 与类型转换 | MLIR 编译器主线 |
| 第 6 课:Tensor→MemRef Bufferization 与别名 | MLIR 编译器主线 |
| 第 7 课:逐级 Lowering 到 LLVM Dialect | MLIR 编译器主线 |
| 第 8 课:Transform Dialect、Pipeline 调试与面试设计 | MLIR 编译器主线 |
核心架构图稿
MLIR 入门学习路线总览
目标:读懂 IR -> 会跑 mlir-opt -> 写 pass/rewrite -> 自定义 dialect -> 理解 lowering 到 LLVM/GPU
0. 环境与工具
构建 llvm-project
mlir-opt / mlir-translate
mlir-tblgen / FileCheck
构建 llvm-project
mlir-opt / mlir-translate
mlir-tblgen / FileCheck
1. IR 心智模型
Operation / Value
Region / Block
Type / Attribute / Location
Operation / Value
Region / Block
Type / Attribute / Location
2. Dialect 与 ODS
命名空间和语义边界
TableGen 描述 op
traits / interfaces / verifier
命名空间和语义边界
TableGen 描述 op
traits / interfaces / verifier
3. Pass 与 Rewrite
PassManager pipeline
PatternRewriter
canonicalize / cse / FileCheck
PassManager pipeline
PatternRewriter
canonicalize / cse / FileCheck
4. Lowering 主线
ConversionTarget
TypeConverter
linalg -> memref/vector/gpu/llvm
ConversionTarget
TypeConverter
linalg -> memref/vector/gpu/llvm
第 1 周
读 IR + 跑工具
验收:能解释 def-use
读 IR + 跑工具
验收:能解释 def-use
第 2 周
跟 Toy Tutorial
验收:能写一个 ODS op
跟 Toy Tutorial
验收:能写一个 ODS op
第 3 周
写 pass/rewrite
验收:有 FileCheck 测试
写 pass/rewrite
验收:有 FileCheck 测试
第 4 周
做小 lowering
验收:source dialect 到 target dialect
做小 lowering
验收:source dialect 到 target dialect
最终小项目:极简 tensor DSL dialect
mydsl.add / relu / matmul -> linalg / arith
讲得清:为什么保留高层语义,为什么逐步 lowering
mydsl.add / relu / matmul -> linalg / arith
讲得清:为什么保留高层语义,为什么逐步 lowering
MLIR 学习路线总览 · Excalidraw 源文件
MLIR IR 结构与 Dialect 核心概念
嵌套结构
builtin.module
顶层 Operation
顶层 Operation
Region
op 内部的嵌套区域
op 内部的嵌套区域
Block
参数 + operation 列表
参数 + operation 列表
Operation
operands / results / attrs / regions
operands / results / attrs / regions
读 IR 时先找嵌套结构,再追 SSA def-use,最后看每个 op 属于哪个 dialect
语义与数据流
Dialect
一组 op/type/attribute 的命名空间
例:func / arith / linalg / memref / gpu / llvm
一组 op/type/attribute 的命名空间
例:func / arith / linalg / memref / gpu / llvm
Value
SSA 值:op result 或 block argument
每个 use 都指向一个定义
SSA 值:op result 或 block argument
每个 use 都指向一个定义
Type / Attribute / Location
类型约束、编译期常量、源码位置
verifier 依赖这些不变量
类型约束、编译期常量、源码位置
verifier 依赖这些不变量
Traits / Interfaces
把 op 语义抽象出来
让 generic pass 可以理解不同 dialect
把 op 语义抽象出来
让 generic pass 可以理解不同 dialect
MLIR IR 结构与 Dialect 核心概念 · Excalidraw 源文件
MLIR Pass 与 Pattern Rewrite 工作流
核心反馈循环:每加一个 pass,都看 IR before/after,用 verifier 和 FileCheck 把语义钉住
输入 IR
多 dialect 混合
多 dialect 混合
PassManager
嵌套 pipeline
builtin.module(func.func(...))
嵌套 pipeline
builtin.module(func.func(...))
Analysis
支配关系 / use-def
shape / alias / side effect
支配关系 / use-def
shape / alias / side effect
RewritePattern
matchAndRewrite
替换 op DAG
matchAndRewrite
替换 op DAG
输出 IR
verifier 通过
FileCheck 固化
verifier 通过
FileCheck 固化
调试与验收清单
看变化
-mlir-print-ir-before-all
-mlir-print-ir-after-change
-mlir-print-ir-before-all
-mlir-print-ir-after-change
查性能
-mlir-timing
-mlir-pass-statistics
-mlir-timing
-mlir-pass-statistics
查失败
-mlir-print-ir-after-failure
crash reproducer
-mlir-print-ir-after-failure
crash reproducer
写测试
lit + FileCheck
检查 op 是否被替换
lit + FileCheck
检查 op 是否被替换
常见坑:pattern 反复匹配自己导致不收敛;改 result type 后没有处理 uses;没有 verifier/FileCheck 就合入 pass。
MLIR Pass 与 PatternRewrite 工作流 · Excalidraw 源文件
MLIR Lowering 到 GPU 和 LLVM 的主路径
Lowering 是基于合法性目标的逐步转换,不是一次性把文本改成 LLVM IR
前端 Dialect
torch / tf / stablehlo
或自定义 DSL
torch / tf / stablehlo
或自定义 DSL
结构化算子
linalg / tensor / arith
保留计算语义
linalg / tensor / arith
保留计算语义
内存化
bufferization -> memref
tensor value 到 buffer
bufferization -> memref
tensor value 到 buffer
循环与向量
scf / affine / vector
tiling / fusion / vectorize
scf / affine / vector
tiling / fusion / vectorize
GPU 目标
gpu / nvgpu / nvvm
launch / thread / intrinsic
gpu / nvgpu / nvvm
launch / thread / intrinsic
底层出口
llvm dialect
LLVM IR / PTX / object
llvm dialect
LLVM IR / PTX / object
Dialect Conversion 三件套
ConversionTarget
定义 legal / illegal / dynamic legal
定义 legal / illegal / dynamic legal
ConversionPattern
把非法 op 改写成目标合法 op
把非法 op 改写成目标合法 op
TypeConverter
处理 tensor/memref/index/llvm type 等类型变化
处理 tensor/memref/index/llvm type 等类型变化
学习时要能回答
1. 当前 op 为什么还需要保留高层语义?
2. 目标 dialect 的合法边界是什么?
3. 类型变化后 uses 如何保持安全?
4. pass 前后 IR 是否通过 verifier?
2. 目标 dialect 的合法边界是什么?
3. 类型变化后 uses 如何保持安全?
4. pass 前后 IR 是否通过 verifier?
lowering 调试重点:合法性失败通常比 C++ 崩溃更有信息量,先读 IR 和 conversion debug 输出。
MLIR Lowering 到 GPU / LLVM 路径 · Excalidraw 源文件