LLVM、MLIR的编译

先行编译基础的工具,后期用到别的工具再进行编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
git clone https://github.com/llvm/llvm-project.git
cd llvm-project
mkdir build && cd build

# CMake配置(仅编译LLVM和MLIR, clang也可以加上)
cmake -G Ninja ../llvm \
-DLLVM_ENABLE_PROJECTS="mlir;llvm;clang" \
-DLLVM_TARGETS_TO_BUILD="host" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DCMAKE_INSTALL_PREFIX=./install

ninja -j$(nproc)
ninja install

等待编译完成后,检查一下install目录下都生成了哪些工具,依次来学习一下。
以下内容都需要在后续学习中用到后,再次进行更新,确认当前查询到的信息是正确的。

一、MLIR核心工具

  1. mlir-opt

    • 用途:MLIR优化与转换的核心工具

    • 功能

      • 执行自定义Pass管道(如 --pass-pipeline="builtin.module(my-pass)"
      • 验证IR合法性(-verify
      • 调试方言降级(如从 tensor 到 memref 的转换)
    • 示例

      bash

      1
      mlir-opt input.mlir --convert-linalg-to-loops -o output.mlir
  2. 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
  3. mlir-tblgen

    • 用途:生成MLIR方言(Dialect)的C++代码
    • 场景:定义新方言时自动生成ODS(Operation Definition Specification)代码。
  4. mlir-cpu-runner

    • 用途:在CPU上直接运行MLIR代码(支持JIT编译)

    • 示例

      bash

      1
      mlir-cpu-runner --entry-point-result=void input.mlir

二、LLVM核心工具

  1. llc

    • 用途:将LLVM IR编译为特定目标(如CPU/GPU)的汇编代码

    • 关键选项

      • -mtriple=amdgcn-amd-amdhsa:指定AMD GPU目标
      • -O3:启用优化级别3
    • 示例

      bash

      1
      llc -O3 input.ll -o output.s
  2. opt

    • 用途:LLVM IR优化器,用于调试自定义Pass

    • 示例

      bash

      1
      opt -passes='loop-unroll' input.ll -o output.ll
  3. llvm-dis / llvm-as

    • 用途:LLVM IR二进制格式(bitcode)与文本格式互转

    • 示例

      bash

      1
      2
      llvm-dis input.bc -o output.ll  # 反汇编
      llvm-as input.ll -o output.bc # 汇编

三、调试与分析工具

  1. llvm-objdump

    • 用途:反汇编目标文件(如检查生成的GPU二进制)

    • 示例

      bash

      1
      llvm-objdump -d output.o
  2. llvm-dwarfdump

    • 用途:调试信息分析(DWARF格式),用于检查符号表与源码映射

    • 示例

      bash

      1
      llvm-dwarfdump output.o
  3. FileCheck

    • 用途:LLVM测试框架核心工具,用于验证输出是否符合预期模式

    • 示例

      bash

      1
      mlir-opt input.mlir | FileCheck check.txt

四、硬件相关工具

  1. amdgpu-arch / nvptx-arch

    • 用途:检测当前系统的AMD/NVIDIA GPU架构

    • 示例

      bash

      1
      nvptx-arch  # 输出如 "sm_80"(对应NVIDIA A100)
  2. llvm-mca

    • 用途:静态分析机器代码的流水线吞吐量(用于性能调优)

    • 示例

      bash

      1
      llc -O3 input.ll -o output.s && llvm-mca output.s

五、辅助开发工具

  1. clang-format

    • 用途:格式化C++/MLIR代码(维护代码风格一致性)

    • 示例

      bash

      1
      clang-format -i my_pass.cpp
  2. mlir-reduce

    • 用途:自动缩小触发错误的MLIR测试用例(类似Delta Debugging)

    • 示例

      bash

      1
      mlir-reduce crash.mlir --bugpoint=mlir-opt -o reduced.mlir
  3. mlir-lsp-server

    • 用途:MLIR语言服务器,支持IDE语法高亮与自动补全(如VSCode插件)。