MLIR:新建一个Dialect(六),ODS框架小结

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

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

转载请注明出处!

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

接上回,本文继续新建一个 Dialect的内容。在实操了通过 mlir_tblgen 生成新的 Dialect/Operation C++ 代码后,本文小结一下 ODS 的作用。

复习

工具链、总览等等知识请自行翻看历史 MLIR 标签的相关文章

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

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

紧接着,介绍了如何通过 HelloDialect.tdHelloOps.td 定义新的 Dialect 和 Op。

回过头再来看看 ODS 是如何发挥作用的。

ODS 开发流程

Operation Definition Specification (ODS) 是一套规范。在编写了特定格式的 .td 文件后,通过 mlir_tblgen 可以便捷的生成手工编写起来很耗时的 C++ 代码,大幅的提升了开发效率。

一般分为三步,

  • 定义新的 Dialect
  • 定义新的 Op
  • 生成 C++ 代码

定义新的 Dialect

MLIR:新建一个Dialect(四),通过.td定义新Dialect

这一步,将通过类似“继承” Dialect 的方式创建新的 Dialect 的 namespace,

1
2
3
4
5
6
7
def Hello_Dialect : Dialect {
// 定义名字空间 namespace,对应 C++ 的 getDialectNamespace 方法返回值
let name = "hello";
...
let cppNamespace = "::hello";
// 该设置用于激活 materializeConstant 方法,这使得可以例如 Canonicalize 优化
}

定义新的 Op

MLIR:新建一个Dialect(五),通过.td定义新Op

这一步首先需要声明一个 Op 的基类,这个操作在 HelloDialect.td 中完成,

1
2
class Hello_Op<string mnemonic, list<Trait> traits = []> :
Op<Hello_Dialect, mnemonic, traits>;

可以看到,它说明了新的 Hello Op 需要遵循的参数。这里是 助记符 和 traits 说明。

然后,基于这个基类,可以自定义各种新的 Hello Op,例如 ConstantOp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def ConstantOp : Hello_Op<"constant", [Pure]> {
// 一行关于这个 Op 的介绍
let summary = "constant";
...
let builders = [
OpBuilder<(ins "mlir::DenseElementsAttr":$value), [{
build($_builder, $_state, value.getType(), value);
}]>,
OpBuilder<(ins "double":$value)>
];
...
let arguments = (ins F64ElementsAttr:$value);
let results = (outs F64Tensor);
}

通常,新的 Op 会至少包含 4 个要素,

  • summary
  • builders
  • arguments
  • results

生成 C++ 代码

工具安装:MLIR:Getting_started

在写完 .td 后,就可以通过 mlir_tblgen 生成相应的 C++ 代码了。主要分为两个部分,

  • -gen-op-decls$MLIR_TBLGEN -gen-op-decls HelloOps.td >> HelloOps.decls.h.inc 生成声明
  • -gen-op-defs$MLIR_TBLGEN -gen-op-defs HelloOps.td >> HelloOps.defs.cpp.inc 生成定义

本期结语

本文对 MLIR 体系中的 ODS 开发流程进行了小结。通过自定义的 .td 文件声明式的语法可以在新的 Dialect 中便捷的定义新的 Op。我们下期继续。

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

至少点个赞再走吧~

MLIR:新建一个Dialect(六),ODS框架小结

https://xlindo.com/kewenlu2022/posts/d6572eca/

Author

xlindo

Posted on

2022-12-01

Updated on

2023-05-10

Licensed under

Comments