MLIR 实践1,搭建环境

1,下载源代码

$ git clone --mirror https://github.com/llvm/llvm-project.git
$ git clone ./llvm-project.git

2,编译 Debug 版本 mlir工具

编译:

$ cd llvm-project
$ git checkout llvmorg-16.0.1
$ mkdir build
$ cd build

cmake -G Ninja ../llvm \
   -DCMAKE_INSTALL_PREFIX=../../locald_16.0.6_x86_mlir \
   -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lldb;lld;polly;mlir" \
   -DLLVM_BUILD_EXAMPLES=ON \
   -DLLVM_TARGETS_TO_BUILD="Native;NVPTX;AMDGPU" \
   -DCMAKE_BUILD_TYPE=Debug \
   -DLLVM_USE_SPLIT_DWARF=ON \
   -DLLVM_ENABLE_ASSERTIONS=ON \
   -DLLVM_INSTALL_UTILS=ON



「注:关于 utils,

   -DLLVM_INSTALL_UTILS=ON

是 in order to install `FileCheck` to the chosen installation prefix.

至少当 build  /llvm-project/mlir/examples/standalone/CMakeLists.txt 时会用到。

build standalone of mlir example:

$ export UILD_DIR=/home/hipper/ex_mlir/tmp2/llvm-project/build
$ export BUILD_DIR=/home/hipper/ex_mlir/tmp2/llvm-project/build
$ cmake -G Ninja .. -DMLIR_DIR=$PREFIX/lib/cmake/mlir -DLLVM_EXTERNAL_LIT=$BUILD_DIR/bin/llvm-lit

编译:

$ ninja


#or cmake --build . --target check-mlir
# 后一种 or 的方式测试不太好用,会遗漏许多目标的构建

安装:

$ cmake -DCMAKE_INSTALL_PREFIX=../../locald_16.0.6_x86_mlir -P cmake_install.cmake

or 的那种方式会遗漏一些目标,可以后补。

可能的错误处理:

如果出现找不到libclang-cpp.so:
 llvm-project/build/lib/libclang-cpp.so": No such file or directory.

则考虑手动生成:

$ ninja libclang-cpp.so

然后重新执行install:
 

$ cmake -DCMAKE_INSTALL_PREFIX=../../locald_16.0.6_x86_mlir -P cmake_install.cmake

还有可能遇到的其他类似 target,需要手动生成:

$ ninja libclang-cpp.so
$ ninja lldb
$ ninja liblldbIntelFeatures.so
$ ninja lldb-vscode
$ ninja lldb-server

然后重新执行install:
 

$ cmake -DCMAKE_INSTALL_PREFIX=../../locald_16.0.6_x86_mlir -P cmake_install.cmake

其中,

关于构建 lldb-server 时,可能的 libpanel 符号不匹配问题,比如,安装了多个版本的 ncurses lib等导致lib 互相不匹配。


$ ninja lldb-server
nm -D /usr/lib/x86_64-linux-gnu/libpanel.so | grep is_linetouched
nm -D /usr/lib/x86_64-linux-gnu/libncurses.so | grep is_linetouched

找到 ld 的curses lib 和 panel lib 的符号匹配关系。

若有必要,可以手动mv掉一些错误link的lib,根据 链接 配置参数,建立正确的符号连接。

3,编译 Release 版 mlir

$ cd llvm-project
$ git checkout llvmorg-16.0.1
$ mkdir build
$ cd build

cmake -G Ninja ../llvm \
   -DCMAKE_INSTALL_PREFIX=../../locald_16.0.6_x86_mlir \
   -DLLVM_ENABLE_PROJECTS="clang;lld;mlir" \
   -DLLVM_BUILD_EXAMPLES=ON \
   -DLLVM_TARGETS_TO_BUILD="Native;NVPTX;AMDGPU" \
   -DCMAKE_BUILD_TYPE=Release \
   -DLLVM_ENABLE_ASSERTIONS=ON \
   -DLLVM_INSTALL_UTILS=ON

4,检测环境

../../locald_16.0.6_x86_mlir/bin/mlir-opt --version

$ ../../locald_16.0.6_x86_mlir/mlir-opt --version

显示版本号:

5,简单应用

MLIR 的 Hello World!

写一个文本文件:

文件名 hello_world.mlir, 内容如下,

module {
        memref.global "private" constant @string : memref<13xi8> = dense<[0x48,0x65,0x6c,0x6c,0x6f,0x2c,0x20,0x4d,0x4c,0x49,0x52,0x21,0]>
        llvm.func external @puts(!llvm.ptr<i8>) -> ()
        func.func @main() -> i64 {
                %c0_i64 = arith.constant 0 : i64
                %0 = memref.get_global @string : memref<13xi8>
                %1 = memref.extract_aligned_pointer_as_index %0 : memref<13xi8> -> index
                %2 = arith.index_cast %1 : index to i64
                %3 = llvm.inttoptr %2 : i64 to !llvm.ptr<i8>
                llvm.call @puts(%3) : (!llvm.ptr<i8>) -> ()
                return %c0_i64 : i64
        }
}

编译成为 llvm 方言:

$ ../locald_16.0.6_x86_mlir/bin/mlir-opt --convert-func-to-llvm --convert-memref-to-llvm --convert-arith-to-llvm --reconcile-unrealized-casts hello_world.mlir -o hello_world.llvm.mlir 

生成内容见下图,

将 llvm 方言 编译为 llvm IR:

$ mlir-translate --mlir-to-llvmir hello_world.llvm.mlir -o hello_world.ll

具体文件名无关紧要,

内容为见下图,可以使用lli来运行,

或者使用clang 将 .ll 文件 编译成为可执行文件: 

6,mlir 的 toy

        因为在cmake 配置中加入了选项 

-DLLVM_BUILD_EXAMPLES=ON

所以, 可以在安装目录中看到example文件夹:

这里的 toyc-ch1 ~ 7 就是mlir/examples/toy/ 中的源码编译出来的,我们下一节分析一下它们。

7,tableGen 的应用

由td文件生成纪录,直接生成hpp文件;

将 td 文件转换成纪录:

$ ../../locald_16.0.6_x86_mlir/bin/llvm-tblgen \
-I ../../llvm-project/llvm/include \
-I ../../llvm-project/llvm/lib/Target/RISCV  \
--print-records \
../../llvm-project/llvm/lib/Target/RISCV/RISCV.td

 内容比较长,效果图:

生成指令匹配表:

$ ../../locald_16.0.6_x86_mlir/bin/llvm-tblgen \
-I ../../llvm-project/llvm/include \
-I ../../llvm-project/llvm/lib/Target/RISCV  \
-gen-dag-isel \
../../llvm-project/llvm/lib/Target/RISCV/RISCV.td  \
> hello_RISCV_td.hpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值