LLVM、MLIR的编译
先行编译基础的工具,后期用到别的工具再进行编译
1 | git clone https://github.com/llvm/llvm-project.git |
等待编译完成后,检查一下install目录下都生成了哪些工具,依次来学习一下。
以下内容都需要在后续学习中用到后,再次进行更新,确认当前查询到的信息是正确的。
一、MLIR核心工具
mlir-opt用途:MLIR优化与转换的核心工具
功能:
- 执行自定义Pass管道(如
--pass-pipeline="builtin.module(my-pass)") - 验证IR合法性(
-verify) - 调试方言降级(如从
tensor到memref的转换)
- 执行自定义Pass管道(如
示例:
bash
1
mlir-opt input.mlir --convert-linalg-to-loops -o output.mlir
mlir-translate用途:MLIR与其他中间表示(LLVM IR/SPIR-V)的互转
常用选项:
--mlir-to-llvmir:将MLIR转换为LLVM IR--export-llvmir:导出为LLVM可读格式
示例:
bash
1
mlir-translate --mlir-to-llvmir input.mlir -o output.ll
mlir-tblgen- 用途:生成MLIR方言(Dialect)的C++代码
- 场景:定义新方言时自动生成ODS(Operation Definition Specification)代码。
mlir-cpu-runner用途:在CPU上直接运行MLIR代码(支持JIT编译)
示例:
bash
1
mlir-cpu-runner --entry-point-result=void input.mlir
二、LLVM核心工具
llc用途:将LLVM IR编译为特定目标(如CPU/GPU)的汇编代码
关键选项:
-mtriple=amdgcn-amd-amdhsa:指定AMD GPU目标-O3:启用优化级别3
示例:
bash
1
llc -O3 input.ll -o output.s
opt用途:LLVM IR优化器,用于调试自定义Pass
示例:
bash
1
opt -passes='loop-unroll' input.ll -o output.ll
llvm-dis/llvm-as用途:LLVM IR二进制格式(bitcode)与文本格式互转
示例:
bash
1
2llvm-dis input.bc -o output.ll # 反汇编
llvm-as input.ll -o output.bc # 汇编
三、调试与分析工具
llvm-objdump用途:反汇编目标文件(如检查生成的GPU二进制)
示例:
bash
1
llvm-objdump -d output.o
llvm-dwarfdump用途:调试信息分析(DWARF格式),用于检查符号表与源码映射
示例:
bash
1
llvm-dwarfdump output.o
FileCheck用途:LLVM测试框架核心工具,用于验证输出是否符合预期模式
示例:
bash
1
mlir-opt input.mlir | FileCheck check.txt
四、硬件相关工具
amdgpu-arch/nvptx-arch用途:检测当前系统的AMD/NVIDIA GPU架构
示例:
bash
1
nvptx-arch # 输出如 "sm_80"(对应NVIDIA A100)
llvm-mca用途:静态分析机器代码的流水线吞吐量(用于性能调优)
示例:
bash
1
llc -O3 input.ll -o output.s && llvm-mca output.s
五、辅助开发工具
clang-format用途:格式化C++/MLIR代码(维护代码风格一致性)
示例:
bash
1
clang-format -i my_pass.cpp
mlir-reduce用途:自动缩小触发错误的MLIR测试用例(类似Delta Debugging)
示例:
bash
1
mlir-reduce crash.mlir --bugpoint=mlir-opt -o reduced.mlir
mlir-lsp-server- 用途:MLIR语言服务器,支持IDE语法高亮与自动补全(如VSCode插件)。
编译其他库时遇到的llvm编译问题
ld64.lld: error: undefined symbol:
divdc3
场景:在编译torch-mlir的时候会依赖三方库stablehlo,在链接StableHLO 的 C++ 引用实现(libStablehloReferenceElement.a)时找不到复数除法符号divdc3,这是compiler-rt/libgcc 提供的运行时辅助函数。原因:可以从最前面的编译选项中看到我们在编译llvm的时候,并没有编译compiler-rt,加上重新编译就可以了
-DLLVM_ENABLE_PROJECTS="mlir;llvm;clang;lldb;lld;compiler-rt" \-DLLVM_ENABLE_RUNTIMES=compiler-rt。
(直接在llvm_enable_projects 中添加compiler-rt未来会被废弃)找不到Python对应的库
场景:在编译torch-mlir的时候发现开启-DMLIR_ENABLE_BINDINGS_PYTHON=ON之后会出现找不到mlir python相关的库。原因:编译llvm/MLIR的时候也需要开启
-DMLIR_ENABLE_BINDINGS_PYTHON=ONnanobind找不到头文件
场景:开启python binding之后找不到nanobind的头文件原因:
- 没有安装nanobind
brew install nanobind或者pip install nanobind - 找不到路径
在编译选项中增加`-Dnanobind_DIR=$(python -c “import nanobind, pathlib, sys; print(pathlib.Path(nanobind.file).parent / ‘cmake’)”)。
- 没有安装nanobind
The dependency target "FileCheck"/"not"/"count" of xxx does not exist.
原因:这些都是llvm的测试工具,某些测试套件依赖,需要增加编译选项bash -DLLVM_INSTALL_UTILS=ON