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

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

Multi-Level Intermediate Representation(MLIR)是创建可重用、可扩展编译器基础设施的新途径。本文为第 10 期,介绍如果通过 .td 定义一个 HelloDialect.

转载请注明出处!

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

接上回,本文继续新建一个 Dialect的内容。本文开始解析项目的各个实现部分之一——通过.td定义新 Dialect “Hello”。

复习

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

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

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

HelloDialect.td

hello.print 作为一个 Op,显而易见,hello Dialect、print Op 都需要被定义。

本文来看看如何定义一个新的 Dialect 以及一个 Op

通过声明式的 .td 文件以及 TableGen 工具可以便捷的生成相应的 C++ 代码。

代码来自 [mlir-hello]/include/Hello/HelloDialect.td

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef HELLO_DIALECT
#define HELLO_DIALECT

// 引入大基类 Dialect
include "mlir/IR/OpBase.td"

// 定义新 Hello_Dialect
def Hello_Dialect : Dialect {
// 定义名字空间 namespace,对应 C++ 的 getDialectNamespace 方法返回值
let name = "hello";
// 一行关于这个 Dialect 的介绍
let summary = "A hello out-of-tree MLIR dialect.";
// 更详细的关于这个 Dialect 的介绍
let description = [{
This dialect is minimal example to implement hello-world kind of sample code
for MLIR.
}];
// 产生一个返回名字空间名称的接口
let cppNamespace = "::hello";
// 该设置用于激活 materializeConstant 方法,这使得可以例如 Canonicalize 优化
let hasConstantMaterializer = 1;
}

// 定义一个 Op 作为后续其他具体 Op 的“基类”
class Hello_Op<string mnemonic, list<Trait> traits = []> :
Op<Hello_Dialect, mnemonic, traits>;

#endif // HELLO_DIALECT

TableGen

来看看这个 .td 能生成什么样子的代码?

$MLIR_TBLGEN -gen-dialect-decls HelloDialect.td -I$LOCAL_MLIR/include >> HelloDialect.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|* *|
|* Dialect Declarations *|
|* *|
|* Automatically generated file, do not edit! *|
|* *|
\*===----------------------------------------------------------------------===*/
// 名字空间
namespace hello {

class HelloDialect : public ::mlir::Dialect {
explicit HelloDialect(::mlir::MLIRContext *context);
// 用以注册 attributes, operations, types 等等
void initialize();
friend class ::mlir::MLIRContext;
public:
~HelloDialect() override;
// 定义的名字空间 name
static constexpr ::llvm::StringLiteral getDialectNamespace() {
return ::llvm::StringLiteral("hello");
}

/// Materialize a single constant operation from a given attribute value with
/// the desired resultant type.
// 设置的 hasConstantMaterializer 位
::mlir::Operation *materializeConstant(::mlir::OpBuilder &builder,
::mlir::Attribute value,
::mlir::Type type,
::mlir::Location loc) override;
};
} // namespace hello
MLIR_DECLARE_EXPLICIT_TYPE_ID(::hello::HelloDialect)

本期结语

本文对 mlir-hello 项目的源代码文件 HelloDialect.td 进行了学习,通过自定义的 .td 文件声明式的语法可以便捷的定义一个新的 Dialect。我们下期继续讲如何去定义新 Dialect 的 Op。

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

至少点个赞再走吧~

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

https://xlindo.com/kewenlu2022/posts/5409ad8a/

Author

xlindo

Posted on

2022-11-10

Updated on

2023-05-10

Licensed under

Comments