MLIR 编译器主线

8 课现代 AI 编译器基础与 Dialect 演进

MLIR 编译器核心主线

深入 LLVM MLIR 体系,学习下一代 AI 编译器的多层 IR 设计、方言生态、转换重写与针对 GPU/LLVM 的逐级 Lowering 流水线。

学习目标

  1. 掌握 Operation、Block、Region、SSA Value 的核心数据结构;

  2. 掌握 ODS (Operation Definition Specification) 与 TableGen 声明式语法;

  3. 掌握 PatternRewriter、贪心重写与 Dialect Conversion 框架;

  4. 理解 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
1. IR 心智模型

Operation / Value
Region / Block
Type / Attribute / Location
2. Dialect 与 ODS

命名空间和语义边界
TableGen 描述 op
traits / interfaces / verifier
3. Pass 与 Rewrite

PassManager pipeline
PatternRewriter
canonicalize / cse / FileCheck
4. Lowering 主线

ConversionTarget
TypeConverter
linalg -> memref/vector/gpu/llvm
第 1 周
读 IR + 跑工具
验收:能解释 def-use
第 2 周
跟 Toy Tutorial
验收:能写一个 ODS op
第 3 周
写 pass/rewrite
验收:有 FileCheck 测试
第 4 周
做小 lowering
验收:source dialect 到 target dialect
最终小项目:极简 tensor DSL dialect
mydsl.add / relu / matmul -> linalg / arith
讲得清:为什么保留高层语义,为什么逐步 lowering

MLIR 学习路线总览 · Excalidraw 源文件

MLIR IR 结构与 Dialect 核心概念
嵌套结构
builtin.module
顶层 Operation
Region
op 内部的嵌套区域
Block
参数 + operation 列表
Operation
operands / results / attrs / regions
读 IR 时先找嵌套结构,再追 SSA def-use,最后看每个 op 属于哪个 dialect
语义与数据流
Dialect
一组 op/type/attribute 的命名空间
例:func / arith / linalg / memref / gpu / llvm
Value
SSA 值:op result 或 block argument
每个 use 都指向一个定义
Type / Attribute / Location
类型约束、编译期常量、源码位置
verifier 依赖这些不变量
Traits / Interfaces
把 op 语义抽象出来
让 generic pass 可以理解不同 dialect

MLIR IR 结构与 Dialect 核心概念 · Excalidraw 源文件

MLIR Pass 与 Pattern Rewrite 工作流
核心反馈循环:每加一个 pass,都看 IR before/after,用 verifier 和 FileCheck 把语义钉住
输入 IR
多 dialect 混合
PassManager
嵌套 pipeline
builtin.module(func.func(...))
Analysis
支配关系 / use-def
shape / alias / side effect
RewritePattern
matchAndRewrite
替换 op DAG
输出 IR
verifier 通过
FileCheck 固化
调试与验收清单
看变化
-mlir-print-ir-before-all
-mlir-print-ir-after-change
查性能
-mlir-timing
-mlir-pass-statistics
查失败
-mlir-print-ir-after-failure
crash reproducer
写测试
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
结构化算子

linalg / tensor / arith
保留计算语义
内存化

bufferization -> memref
tensor value 到 buffer
循环与向量

scf / affine / vector
tiling / fusion / vectorize
GPU 目标

gpu / nvgpu / nvvm
launch / thread / intrinsic
底层出口

llvm dialect
LLVM IR / PTX / object
Dialect Conversion 三件套
ConversionTarget
定义 legal / illegal / dynamic legal
ConversionPattern
把非法 op 改写成目标合法 op
TypeConverter
处理 tensor/memref/index/llvm type 等类型变化
学习时要能回答
1. 当前 op 为什么还需要保留高层语义?
2. 目标 dialect 的合法边界是什么?
3. 类型变化后 uses 如何保持安全?
4. pass 前后 IR 是否通过 verifier?
lowering 调试重点:合法性失败通常比 C++ 崩溃更有信息量,先读 IR 和 conversion debug 输出。

MLIR Lowering 到 GPU / LLVM 路径 · Excalidraw 源文件