MLIR:Getting_started

文章来自微信公众号“科文路”,欢迎关注、互动。转发须注明出处。

Multi-Level Intermediate Representation(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
# LLVM as submodule
git submodule update --init

Install

一步到位式安装 clangmlirpolygeist

如果要使用RISCV,可以在LLVM_TARGETS_TO_BUILD中附加;RISCV

1
2
3
4
5
6
7
8
9
10
11
mkdir build
cd build
cmake -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 实例内容的学习。

都看到这儿了,不如关注每日推送的“科文路”、互动起来~

至少点个赞再走吧~

Author

xlindo

Posted on

2022-09-15

Updated on

2023-05-10

Licensed under

Comments