文章来自微信公众号“科文路”,欢迎关注、互动。转发须注明出处。
M ulti-L evel I ntermediate R epresentation(MLIR)是创建可重用、可扩展编译器基础设施的新途径。本文为第 4 期,介绍 MLIR 的安装。
MLIR 目前已经是 LLVM 项目的一部分,所以编译安装过程类似于 LLVM 其他项目的过程。
这里推荐从 Polygeist 入手,MLIR 也将在过程中安装。Polygeist 是 MLIR 的 C/C++ 前端,用以将原始 C/C++ 转为 MLIR,从而接入 MLIR 生态。
Clone 1 2 3 git clone https://github.com/llvm/Polygeist git submodule update --init
Install 一步到位式安装 clang
,mlir
,polygeist
。
如果要使用RISCV,可以在LLVM_TARGETS_TO_BUILD
中附加;RISCV
1 2 3 4 5 6 7 8 9 10 11 mkdir buildcd buildcmake -G Ninja ../llvm-project/llvm \ -DLLVM_ENABLE_PROJECTS="clang;mlir" \ -DLLVM_EXTERNAL_PROJECTS="polygeist" \ -DLLVM_EXTERNAL_POLYGEIST_SOURCE_DIR=.. \ -DLLVM_TARGETS_TO_BUILD="host" \ -DLLVM_ENABLE_ASSERTIONS=ON \ -DCMAKE_BUILD_TYPE=RELEASE ninja ninja check-polygeist-opt && ninja check-cgeist
C test 用 C 写一个简单的矩阵乘函数,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #define N 200 #define M 300 #define K 400 #define DATA_TYPE float void matmul (DATA_TYPE A[N][K], DATA_TYPE B[K][M], DATA_TYPE C[N][M]) { int i, j, k; for (int i = 0 ; i < N; i++) { for (int j = 0 ; j < M; j++) { for (int k = 0 ; k < K; k++) { C[i][j] += A[i][k] * B[k][j]; } } } }
使用上一步的编译结果,运行 $POLYGEIST/build/bin/cgeist matmul.c -function=matmul -S -o matmul.scf.mlir
,可以得到 matmul.scf.mlir
如下,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 module attributes {...省略...} { func .func @matmul(%arg0: memref<?x400xf32>, %arg1: memref<?x300xf32>, %arg2: memref<?x300xf32>) attributes {llvm.linkage = #llvm.linkage<external>} { %c400 = arith.constant 400 : index %c300 = arith.constant 300 : index %c200 = arith.constant 200 : index %c0 = arith.constant 0 : index %c1 = arith.constant 1 : index scf.for %arg3 = %c0 to %c200 step %c1 { scf.for %arg4 = %c0 to %c300 step %c1 { scf.for %arg5 = %c0 to %c400 step %c1 { %0 = memref.load %arg0[%arg3, %arg5] : memref<?x400xf32> %1 = memref.load %arg1[%arg5, %arg4] : memref<?x300xf32> %2 = arith.mulf %0 , %1 : f32 %3 = memref.load %arg2[%arg3, %arg4] : memref<?x300xf32> %4 = arith.addf %3 , %2 : f32 memref.store %4 , %arg2[%arg3, %arg4] : memref<?x300xf32> } } } return } }
结束 OK,本期内容就到此为止。编译工具链将会耗费一些时间,取决于宿主机的性能,请保持耐心。后面将会开始 MLIR 实例内容的学习。
都看到这儿了,不如关注每日推送的“科文路”、互动起来~
至少点个赞再走吧~