编译器与 MLIR — AI 时代的编译器基础设施
编译器工程正在经历一场范式转移:传统三阶段(前端-中端-后端)的单一 IR 设计已难以承载 AI 编译器、异构计算、领域专用架构(DSA)对大跨度抽象和多级优化的需求。MLIR 作为 LLVM 生态的顶层演化,以”方言 + 渐进降阶”的方式统一了从张量计算、循环变换到硬件指令的整条编译链。
但目前 MLIR 的学习高度依赖演讲录像、源码和零散博客,缺乏一部将编译器工程方法与 MLIR 设计哲学融会贯通的系统性读物。这个系列试图填补这一空白。
推荐入口
- MLIR 全景图与设计哲学:先看懂 MLIR 要解决什么问题,“渐进降阶”和”方言可组合性”到底是什么意思。
- 从零构建一个微型 Tensor DSL:动手篇,用最简代码把方言设计、降阶 Pass、LLVM IR 生成串起来。
- 张量中端:Tensor 与 Linalg 方言:AI 编译的核心抽象,理解结构化操作如何表示矩阵乘法与卷积。
一、这个系列要回答的五个问题
为什么 LLVM IR 不够用了?MLIR 究竟解决了什么新问题? AI 编译器需要在张量级、循环级、向量级和标量级同时做优化,传统单一 IR 无法承载这种跨度。MLIR 用”方言”让每一层抽象都有自己的 IR,用”渐进降阶”把编译过程变成多条可组合的路径。详见第一、二部分。
方言(Dialect)只是另一种 DSL 吗?它的”基础设施复用”到底体现在哪? 方言不只是自定义 IR 语法,它共享 MLIR 的类型系统、Pass 管理、模式重写框架、TableGen 工具链和打印/解析基础设施。Pass 管理、打印/解析、验证与模式重写等通用设施可直接复用,方言作者主要投入语义与降阶设计。详见第二部分与第三部分。
从 Tensor 到 LLVM IR 的降阶路径是什么?每一步在做什么优化? 从高层的
tensor操作,经过linalg结构化操作、affine循环分析、scf控制流、memref内存化,最终到llvm方言的完整路径。每一步既是表示转换,也是优化机会。详见第四部分。MLIR 在 PyTorch、TensorFlow、JAX 等 AI 框架中是怎么接入的? 框架通过 Torch-MLIR、MHLO、ONNX-MLIR 等桥接层将各自的计算图翻译到 MLIR 方言栈,然后复用同一套编译管线。详见第十四章。
编译器与 AI 正在互相吞噬——AI 生成的编译器有未来吗? MLIR 的方言可组合性让”AI 搜索优化空间”和”AI 生成 Pass”变得可能。MLIR 2.0 规划中,编译器本身正在成为 AI 的下一个目标领域。详见第十八章。
二、篇目依赖关系与推荐阅读路径
全书共五部分、18 章。各章按「问题—机制—代码—边界」组织;动手实验集中在第 03、15 章,调试工具箱集中在第 16 章。
强依赖
flowchart TD
A["01–02 编译器挑战 + MLIR 全景"] --> B["03 环境搭建 + 第一个 Pass"]
B --> C["04 Operation / 方言 / IR"]
C --> D["05 类型系统"]
C --> E["06 ODS + TableGen"]
C --> F["07 Region 与 Block"]
D --> G["08–09 Pass + 模式重写"]
E --> G
F --> G
G --> H["10 方言转换与渐进降阶"]
H --> I["11 Tensor / Linalg"]
H --> J["12 Affine / SCF"]
H --> K["13 GPU 代码生成"]
I --> L["14 AI 框架桥接"]
J --> L
K --> L
L --> M["15 实战微型 DSL"]
M --> N["16 调试工作流"]
M --> O["17 IREE 集成"]
M --> P["18 未来趋势"]
推荐阅读路径
编译器工程师入门 MLIR 01 → 02 → 03 → 04 → 06 → 08 → 09 → 10 → 11 → 15
LLVM 用户转向 MLIR 02 → 04 → 05 → 06 → 07 → 08 → 09 → 10 → 16
AI 框架开发者 02 → 03 → 04 → 06 → 10 → 11 → 12 → 13 → 14 → 15
对编译器基础设施感兴趣的学生 01 → 02 → 03 → 04 → 05 → 06 → 08 → 09 → 15
端侧推理 / 部署工程师 02 → 03 → 04 → 06 → 08 → 10 → 11 → 13 → 15 → 17
三、目录与每篇一句话价值
第一部分:编译器工程的再思考与 MLIR 缘起
- 01. 编译器的挑战与 IR 的裂变:从经典三阶段编译流程的局限出发,串联 Halide、TVM、XLA 等领域的 IR 方案,回答”为什么需要元 IR”。
- 02. MLIR 全景图与设计哲学:渐进降阶、方言可组合性、基础设施复用三条设计原则,配合 Google、ARM、Intel 的落地案例建立心智模型。
- 03.
环境搭建与第一个 MLIR 程序:从零构建 LLVM/MLIR 工程,用
mlir-opt理解.mlir文本表示,运行并读懂第一个 Pass。
第二部分:MLIR 核心概念深入
- 04. 操作、方言与 IR 的 C++ 表示:Operation、Op、Value、Block、Region 的内存视图与 C++ 继承体系,这是后续所有 Pass 写作的基础。
- 05. 类型系统与属性:内建类型与自定义类型的注册和使用;属性作为编译期常量元数据的设计意图。
- 06. 表驱动定义:ODS 与声明式编程:用 TableGen 描述方言与算子,自动生成构建器、验证器、解析/打印逻辑,显著减少手写样板代码。
- 07. Region 与 Block:IR 的控制流骨架:嵌套区域的 CFG 表示能力、Lambda 式降阶、与经典 SSA 的对比。
第三部分:编译流水线与变换基础设施
- 08. Pass 管理与分析:OperationPass 与 ModulePass 的分类与适用场景,Pass 依赖管理、流水线构建与调试。
- 09. 模式重写与规范化框架:RewritePattern 的驱动模型,Canonicalization 规则编写,折叠与代数简化的最佳实践。
- 10. 方言转换与渐进降阶策略:完全转换与部分转换的适用边界,类型转换与边界追踪,以 tensor bufferization 为例展示渐进降阶。
第四部分:面向 AI 的编译优化核心
- 11. 张量中端:Tensor 与 Linalg 方言:结构化操作(逐元素、归约、收缩)的语义与表示,通用矩阵乘如何在 Linalg 中描述和优化。
- 12.
循环分析与变换:Affine 与
SCF:仿射循环的依赖分析与调度,与 Polyhedral
模型的联系,
affine.for到scf.for的降阶。 - 13. 面向异构硬件的代码生成:GPU 方言、SPIR-V 出口、内存层次抽象与 tiling 策略,与 Triton、IREE 的协作关系。
- 14. 与 AI 框架的接口设计:PyTorch FX、ONNX、TensorFlow、JAX 各自到 MLIR 的桥接方案对比,MHLO 生态的地位。
第五部分:实战、工具链与未来演进
- 15. 从零构建一个领域专用的微型 Tensor DSL:设计方言、写降阶 Pass、经标准管线生成 LLVM IR,走完编译链闭环(参考 MLIR Toy 教程)。
- 16.
调试与分析工作流:
mlir-opt流水线诊断、mlir-tblgen的用法、性能剖析与 IR 可视化的实用技巧。 - 17. 在实际框架中集成 MLIR(以 IREE 为例):IREE 编译流程剖析、运行时设计、部署到移动端或边缘设备的完整链路。
- 18. 总结与未来趋势:MLIR 2.0 规划、AI 生成编译器(LLM + 编译器合成)、编译器工程的前沿议题与开放问题。
四、读者定位与先修要求
| 维度 | 说明 |
|---|---|
| 主要读者 | AI 框架开发者、编译器工程师、系统架构师、高性能计算研究员 |
| 次要读者 | 对编译器基础设施感兴趣的高年级本科生、研究生,以及从 LLVM 转向 MLIR 的工程师 |
| 先修知识 | 熟悉 C++、基本数据结构与算法;了解编译原理(词法/语法分析、IR、优化 pass);有 LLVM 使用经验更佳,非必须 |
五、写作方法与风格
- “问题-方案”式叙述:每章开篇先抛出传统方案的痛点,再引出 MLIR 给出的解法,避免”字典式”罗列。
- 代码优先,最小可行示例:每个概念配以精简的手写 IR 和 C++ Pass,确保 1 小时内可复现。
- 可视化与类比:使用降阶图、依赖图、编译流水线泳道图辅助理解。
- 持续更新的开源协同:初稿完成后在 GitHub 公开源文件,吸纳社区反馈。
六、关键参考资料
核心官方文档(A 级)
- MLIR Language Reference
- MLIR Dialects 文档
- MLIR TableGen 手册
- LLVM Language Reference Manual
经典论文(A 级)
- Lattner, C. et al. MLIR: A Compiler Infrastructure for the End of Moore’s Law, arXiv:2002.11054, 2020.
- Lattner, C. & Adve, V. LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation, CGO 2004.
- Linalg: A Universal DSL for MLIR — MLIR 社区设计文档
社区项目(B 级)
- IREE:MLIR-based end-to-end compiler and runtime
- CIRCT:硬件设计的 MLIR 方言生态
- Torch-MLIR:PyTorch 到 MLIR 的桥接
- ONNX-MLIR:ONNX 到 MLIR 的编译路径
标杆书籍(A 级)
- Cooper, K. & Torczon, L. Engineering a Compiler, 3rd Edition. Morgan Kaufmann, 2022.
- Lopes, B. C. & Auler, R. Getting Started with LLVM Core Libraries. Packt, 2014.
七、与其他系列的关联
- AI 框架的底层 GPU 计算栈(CUDA、Triton)请看 llm-infra 系列。
- 深度学习模型架构(Transformer、Attention)请看 transformer 系列。
- 分布式系统的编译与部署请看 分布式系统百科。
八、本系列的承诺与不承诺
承诺:
- 核心概念配以可编译的 C++ 代码示例(第 06、08–10、15 章提供完整片段);
- 主要降阶路径给出来源方言到目标方言的
mlir-opt命令(标注适用 MLIR 版本); - 解释”为什么这样设计”而不仅是”有哪些 API”;
- 配套可构建示例代码计划随系列发布(尚未上线独立仓库)。
不承诺:
- 不承诺替代 MLIR 官方文档,本系列是学习路径不是 API 参考;
- 不列举所有方言和所有 Pass,只挑有教学价值的核心路径;
- 不预测工业界哪家方案会赢,那是商业判断不是技术分析。
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【编译器与 MLIR】张量中端:Tensor 与 Linalg 方言
解析 AI 编译的核心抽象层:Tensor 方言的不可变语义与操作、Linalg 方言的结构化操作(逐元素、归约、收缩)及其通用表示 linalg.generic,以矩阵乘法为例展示从高层表示到底层循环的完整降阶路径。
【编译器与 MLIR】MLIR 全景图与设计哲学
从 Module-Operation-Region-Block 四层结构出发,系统讲解 MLIR 的三条核心设计原则:渐进降阶、方言可组合性、基础设施复用,配合 IREE、CIRCT、Torch-MLIR 等实际案例建立心智模型。
【编译器与 MLIR】类型系统与属性
解析 MLIR 的类型体系:内建类型(Integer、Float、Tensor、MemRef)与自定义方言类型的注册机制;区分 Type 与 Attribute 的设计意图;通过 OpBuilder 理解类型和属性在 IR 构造中的实际角色。
【编译器与 MLIR】表驱动定义:ODS 与声明式编程
深入 MLIR 的 ODS 与 TableGen 工具链:从 .td 定义到自动生成的构建器、验证器、解析/打印器,理解声明式 IR 定义如何减少手写样板代码。