MLIR:新建一个Dialect(三),待编译的mlir文件

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

Multi-Level Intermediate Representation(MLIR)是创建可重用、可扩展编译器基础设施的新途径。本文为第 9 期,继续介绍一个简单的 MLIR Dialect.

转载请注明出处!

MLIR 项目的核心是 Dialect,MLIR 自身就拥有例如linalgtosaaffine 这些 Dialect。各种不同的 Dialect 使不同类型的优化或转换得以完成。

接上回,本文继续新建一个 Dialect的内容。本文开始解析项目的各个实现部分之一——待编译的 .mlir 文件。

项目内容

mlir-hello 项目的目标就是使用自建的 Dialect 通过 MLIR 生态实现一个 hello world,具体做法为:

  1. 创建 hello-opt 将原始 print.mlir (可以理解成 hello world 的 main.cpp)转换为 print.ll 文件
  2. 使用 LLVM 的 lli 解释器直接运行 print.ll 文件

今天先通过 print.mlir 理解一下 MLIR 世界的语法,该文件在 mlir-hello/test/Hello/print.mlir

1
2
3
4
5
func.func @main() {
%0 = "hello.constant"() {value = dense<[[1.000000e+00, 2.000000e+00, 3.000000e+00], [4.000000e+00, 5.000000e+00, 6.000000e+00]]> : tensor<2x3xf64>} : () -> tensor<2x3xf64>
"hello.print"(%0) : (tensor<2x3xf64>) -> ()
return
}

print.mlir

  1. @main 这个 FuncOp 里,首先定义了一个 hello.constant 存放于 %0
  2. %0 的内容为一个 $2\times3$ 的二维 const 的 tensor,数值类型为 float64
  3. 在第二个自定义的 Dialect Op hello.print 中,%0 作为参数被传入(打印)

图最下的蓝框内为 MLIR 的一般形式,它与 SSA 相似,可参考MLIR:静态单赋值,SSA。更多语法信息参看MLIR:LangRef

可以猜测,该代码最终的效果为“打印出这个二维矩阵”。

本期结语

本文对 mlir-hello 项目的源代码文件 print.mlir 进行了学习,通过自定义的 Dialect 实现可以将该文件“编译”为 LLVM lli 解释器可直接运行的 .ll 文件。我们下期继续。

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

至少点个赞再走吧~

MLIR:新建一个Dialect(三),待编译的mlir文件

https://xlindo.com/kewenlu2022/posts/5cc96e19/

Author

xlindo

Posted on

2022-11-03

Updated on

2023-05-10

Licensed under

Comments