构建运行基于MLIR的独立项目

总字数:3130字,预计阅读时间 05分 13秒。

MLIR是多层次中间表示形式(Multi-Level Intermediate Representation),是LLVM项目中提供的一项新编译器开发基础设施,使得编译器开发者能够在源代码和可执行代码之间定义多层IR来保留程序信息指导编译优化。本博客指导如何创建一个独立(out-of-tree)的MLIR项目。

编译LLVM和MLIR

考虑到大多数的Linux发行版在打包LLVM时不会编译MLIR,因此自行编译安装包括MLIR项目的LLVM就成为开发独立MLIR项目的前置条件。

首先在GitHub上下载LLVM的源代码包,我这里选择最新的稳定版本20.1.0

wget https://github.com/llvm/llvm-project/releases/download/llvmorg-20.1.0/llvm-project-20.1.0.src.tar.xz

下载之后解压进入,准备进行构建。

tar xvf llvm-project-20.1.0.src.tar.xz
cd llvm-project-20.1.0.src

创建build文件夹,使用下面的命令进行生成构建文件。在这里选择使用Release构建类型,安装的位置是~/.local/share/llvm文件夹,构建的项目包括llvmclangmlir三个项目,并指定使用系统上的clangclang++编译器作为编译过程中使用的编译器。

mkdir build
cd build
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="/home/ricardo/.local/share/llvm-20.1.0" -DLLVM_ENABLE_PROJECTS="llvm;clang;mlir" -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLLVM_INSTALL_UTILS=true ../llvm

image-20250319192618697

生成构建文件之后使用ninja进行构建。

ninja

image-20250319194742171

构建在我的i5-13600K上大约需要20分钟。

构建完成之后进行安装。

ninja install

编译MLIR官方的独立项目

MLIR的官方提供了一个独立项目,项目文件夹在mlir/examples/standalone中,将这个文件夹中的内容复制到我们需要的地方,尝试使用上面构建的mlir进行构建。

cp -r ~/Downloads/llvm-project-20.1.0.src/mlir/examples/standalone mlir-standalone 
cd mlir-standalone

不启用测试

编译过程中可能遇到的最大问题是llvm-lit,这个使用python编写的LLVM集成测试工具,在standaloneREADME.md中要求编译过程中使用LLVM_EXTERNAL_LIT变量指定到LLVM编译过程中生成的llvm-lit可执行文件。

也许就是因为llvm-lit是用Python撰写的,所以llvm-lit不会安装到PREFIX指定的位置。

不过我们可以禁用测试(笑)。在CMakeLists.txt文件中注释对于测试文件夹的添加:

add_subdirectory(include)
add_subdirectory(lib)
if(MLIR_ENABLE_BINDINGS_PYTHON)
  message(STATUS "Enabling Python API")
  add_subdirectory(python)
endif()
#add_subdirectory(test)
add_subdirectory(standalone-opt)
add_subdirectory(standalone-plugin)
add_subdirectory(standalone-translate)

回到构建文件夹,使用如下的cmake指令生成构建文件。

export LLVM_DIR=/home/ricardo/.local/share/llvm-20.1.0
cmake -G Ninja -DMLIR_DIR=$LLVM_DIR/lib/cmake/mlir  ..

可以顺利通过编译。

image-20250319202218503

启用测试

但是测试还是非常重要的。我们尝试启动测试看看,取消对于测试文件夹的注释:

rm -rf build && mkdir build && cd build
cmake -G Ninja -DMLIR_DIR=$LLVM_DIR/lib/cmake/mlir  ..

很好顺利报错,报错的提示是缺失FileCheckcountnot

image-20250319202553644

那么按照README.md中的提示添加上来自构建目录的llvm-lit会怎么样呢?

rm -rf build && mkdir build && cd build
export LLVM_BUILD_DIR=/home/ricardo/Downloads/llvm-project-20.1.0.src/build
cmake -G Ninja -DMLIR_DIR=$LLVM_DIR/lib/cmake/mlir -DLLVM_EXTERNAL_LIT=$LLVM_BUILD_DIR/bin/llvm-lit ..

同样的报错,看来问题不是出在这里。

经过对于LLVM文档的仔细研究,发现原来是没有启动这个变量:

image-20250319204057832

遂修改最初的LLVM编译指令。

重新运行来自README.md的构建文件生成指令之后,测试也完美运行通过:

ninja test-standalone

image-20250319204522857

不过这个还是有一点令我不是特别满意,这依赖了一个来自于构建目录的工具llvm-lit,如果我编译安装的时候眼疾手快的删除了编译目录不就完蛋了。而且我都standalone了还依赖似乎有点说不过去?

于是发现了一篇从pip上下载使用llvm-lit博客和一个LLVM Discourse上面的帖子,遂进行尝试。

首先在当前目录下创建一个虚拟环境,并下载安装llvm-lit

python -m venv .llvm-lit
source .llvm-lit/bin/activate
pip install lit

不过这个库似乎没有提供运行入口点,需要我们手动创建一个可执行的python文件:

#!/usr/bin/env python
from lit.main import main
if __name__ == '__main__':
    main()

经哥们纠正说lit包在某个版本之后会安装lit的可执行文件,在安装之后可以直接在命令行调用lit。因此在激活虚拟环境之后,cmake中直接在LLVM_EXTERNAL_LIT配置为$(which lit)即可。

cmake -G Ninja -DMLIR_DIR=$LLVM_DIR/lib/cmake/mlir -DLLVM_EXTERNAL_LIT=$(which lit) ..
ninja test-standalone

image-20250319205520649

文章作者:Ricardo Ren
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,诸位读者如有兴趣可任意转载,不必征询许可,但请注明“转载自 Ricardo's Blog ”。

2021 - 2025 © Ricardo Ren ,由 .NET 9.0.2 驱动。

Build Commit # a662ecc14b

蜀ICP备2022004429号-1