wheatfox 2025.1

编译 MLIR

首先从 https://github.com/llvm/llvm-project clone 下来 LLVM 的源码(目前 LLVM 的所有代码贡献提交已转移到 Github Pull Request,之前是一个独立的 review 平台):

clone 完成后进入源码根目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mkdir build
cd build

cmake -G Ninja ../llvm \
-DLLVM_ENABLE_PROJECTS="mlir" \
-DLLVM_TARGETS_TO_BUILD="host" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_ENABLE_RTTI=ON \
-DLLVM_ENABLE_LIBEDIT=OFF

# -DCMAKE_BUILD_TYPE=Debug 用于调试
# 但是请确保你的硬盘空间足够,带 debug 信息的 binary 大小在几百 MB
# 单是编译 MLIR 就可能占用若干 GB 的硬盘空间

cmake --build . -- ${MAKEFLAGS}
cmake --build . --target check-mlir

源码目录结构

  • benchmark contains benchmarks for sparse tensors
  • cmake MLIR 相关的 cmake modules
  • docs MLIR 文档
  • examples
    • standalone 一个自定义 dialect 和相关工具的 demo
    • toy 一个通过 MLIR 实现的 Toy 编程语言
    • minimal-opt 一个展示如何利用 MLIR 制作一个 minimal 的优化器的 demo
    • transform 如何使用 Transform Dialect 进行 IR 转换
    • transform-opt 基于 Transform Dialect 的优化器 demo
  • include 里面的 mlir 和 mlir-c 对应 C++ 和 C 两个编程接口
  • lib 核心代码,包括所有功能的实现
  • python MLIR 的 python 编程接口
  • test 集成测试和功能测试,主要基于文本(如 mlir 源码)和辅助工具进行测试,例如在 mlir 源码中写 test 脚本和 expect
  • tools 包含基于 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
2
3
C. Lattner et al., "MLIR: Scaling Compiler Infrastructure for Domain Specific Computation," 
2021 IEEE/ACM International Symposium on Code Generation and Optimization (CGO), Seoul,
Korea (South), 2021, pp. 2-14, doi: 10.1109/CGO51591.2021.9370308.

三个设计原则:

  1. Parsimony(简洁性):Occam's Razor,对内置语义、概念和编程接口应用奥卡姆剃刀原则;通过抽象操作和类型的属性,驾驭内在复杂性和附带复杂性。
  2. Traceability(可追溯性):“保留”而不是“恢复”信息;通过声明规则和属性实现变换,而非逐步命令式的指定,即描述“是什么”而不是“怎么做”。
  3. Progressivity(渐进性):“过早降低抽象层次”是最大的”evil“;实现多种路径的去抽象化,而不是单一路径的抽象化;并且未来在多个 IR 层次进行复用,需要一些 abstraction-independent 的设计,即其设计之后可以用于所有的层次。

然而,三个原则之间是往往是冲突的,例如操作系统的分层设计符合 Progressivity,但是不符合 Parsimony(层次之间的接口非常复杂)。

MLIR 的贡献:

  1. 找到构建可拓展和模块化的编译器系统的问题与挑战。
  2. 设计出 MLIR,一个新型的编译器基础设施。
  3. 探索在不同领域的应用以验证 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/