【LLVM|更新于 2025.1.26】MLIR学习笔记
wheatfox 2025.1
编译 MLIR
首先从 https://github.com/llvm/llvm-project clone 下来 LLVM 的源码(目前 LLVM 的所有代码贡献提交已转移到 Github Pull Request,之前是一个独立的 review 平台):
clone 完成后进入源码根目录:
1 | mkdir build |
源码目录结构
benchmark
contains benchmarks for sparse tensorscmake
MLIR 相关的 cmake modulesdocs
MLIR 文档examples
standalone
一个自定义 dialect 和相关工具的 demotoy
一个通过 MLIR 实现的 Toy 编程语言minimal-opt
一个展示如何利用 MLIR 制作一个 minimal 的优化器的 demotransform
如何使用 Transform Dialect 进行 IR 转换transform-opt
基于 Transform Dialect 的优化器 demo
include
里面的 mlir 和 mlir-c 对应 C++ 和 C 两个编程接口lib
核心代码,包括所有功能的实现python
MLIR 的 python 编程接口test
集成测试和功能测试,主要基于文本(如 mlir 源码)和辅助工具进行测试,例如在 mlir 源码中写 test 脚本和 expecttools
包含基于 MLIR 的命令行工具的 C++ 源码unittests
单元测试,通过 C++ 代码实现,使用用 LLVM gtest (https://llvm.org/docs/TestingGuide.html)utils
开发中用到的辅助脚本的代码
论文笔记
MLIR: Scaling Compiler Infrastructure for Domain Specific Computation
https://ieeexplore.ieee.org/document/9370308
1 | C. Lattner et al., "MLIR: Scaling Compiler Infrastructure for Domain Specific Computation," |
三个设计原则:
- Parsimony(简洁性):Occam's Razor,对内置语义、概念和编程接口应用奥卡姆剃刀原则;通过抽象操作和类型的属性,驾驭内在复杂性和附带复杂性。
- Traceability(可追溯性):“保留”而不是“恢复”信息;通过声明规则和属性实现变换,而非逐步命令式的指定,即描述“是什么”而不是“怎么做”。
- Progressivity(渐进性):“过早降低抽象层次”是最大的”evil“;实现多种路径的去抽象化,而不是单一路径的抽象化;并且未来在多个 IR 层次进行复用,需要一些 abstraction-independent 的设计,即其设计之后可以用于所有的层次。
然而,三个原则之间是往往是冲突的,例如操作系统的分层设计符合 Progressivity,但是不符合 Parsimony(层次之间的接口非常复杂)。
MLIR 的贡献:
- 找到构建可拓展和模块化的编译器系统的问题与挑战。
- 设计出 MLIR,一个新型的编译器基础设施。
- 探索在不同领域的应用以验证 MLIR 的通用性。
相关链接
在macOS编译MLIR的相关资料 - https://mlir.llvm.org/getting_started/,https://github.com/onnx/onnx-mlir/blob/main/docs/BuildOnLinuxOSX.md
Polygeist: A Polyhedral Compiler for High-Level Synthesis - https://github.com/llvm/Polygeist
MLIR 代码文档 - https://mlir.llvm.org/docs/