MLIR:新建一个Dialect(六),ODS框架小结
文章来自微信公众号“科文路”,欢迎关注、互动。转发须注明出处。
Multi-Level Intermediate Representation(MLIR)是创建可重用、可扩展编译器基础设施的新途径。本文为第 12 期,继续介绍一个简单的 MLIR Dialect.
转载请注明出处!
MLIR 项目的核心是 Dialect,MLIR 自身就拥有例如linalg
,tosa
,affine
这些 Dialect。各种不同的 Dialect 使不同类型的优化或转换得以完成。
接上回,本文继续新建一个 Dialect的内容。在实操了通过 mlir_tblgen
生成新的 Dialect/Operation C++ 代码后,本文小结一下 ODS 的作用。
复习
工具链、总览等等知识请自行翻看历史 MLIR 标签的相关文章
前文介绍了mlir-hello 项目的目标就是使用自建的 Dialect 通过 MLIR 生态实现一个 hello world,具体做法为:
- 创建
hello-opt
将原始print.mlir
(可以理解成 hello world 的main.cpp
)转换为print.ll
文件 - 使用 LLVM 的 lli 解释器直接运行
print.ll
文件
紧接着,介绍了如何通过 HelloDialect.td
和 HelloOps.td
定义新的 Dialect 和 Op。
回过头再来看看 ODS 是如何发挥作用的。
ODS 开发流程
Operation Definition Specification (ODS) 是一套规范。在编写了特定格式的 .td
文件后,通过 mlir_tblgen
可以便捷的生成手工编写起来很耗时的 C++ 代码,大幅的提升了开发效率。
一般分为三步,
- 定义新的 Dialect
- 定义新的 Op
- 生成 C++ 代码
定义新的 Dialect
这一步,将通过类似“继承” Dialect
的方式创建新的 Dialect 的 namespace,
1 | def Hello_Dialect : Dialect { |
定义新的 Op
这一步首先需要声明一个 Op 的基类,这个操作在 HelloDialect.td
中完成,
1 | class Hello_Op<string mnemonic, list<Trait> traits = []> : |
可以看到,它说明了新的 Hello Op 需要遵循的参数。这里是 助记符 和 traits 说明。
然后,基于这个基类,可以自定义各种新的 Hello Op,例如 ConstantOp
,
1 | def ConstantOp : Hello_Op<"constant", [Pure]> { |
通常,新的 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框架小结