MLIR笔记(5)

4.3.4. 图区域

在MLIR中,区域里类似图的语义由RegionKind::Graph来表示。对没有控制流的并发语义,以及通用有向图数据结构的建模,图区域是合适的。图区域适用于表示耦合值之间的循环关系,这些关系没有基本的序。例如,一个图区域里的操作可能表示独立线程的控制流,具有表示数据流的值。就像通常在MLIR里一样,区域的特定语义完全由它包含的操作确定。图区域可能仅包含单个基本块(入口块)。

**基本原理:**当前的图区域被随意限制为单个基本块,虽然这个限制没有特别的语义方面的原因。加入这个限制使得稳定遍基本架构以及常用于处理图区域的遍恰当地处理反馈循环更容易。未来可能允许多基本块区域,如果出现要求它的用例。

在图区域中,MLIR操作自然地代表节点,而每个MLIR值代表连接源节点与多个目的节点的一条多边(multi-edge)。所有在区域里定义作为操作结果的值,作用域在区域内,可以被区域里的任意其他操作访问。在图区域中,一个基本块内存在的次序以及一个区域内基本块的次序是没有语义意义的,例如非终结符操作可以通过规范化任意重排。其他类型图,比如带有多个源节点与多个目的节点的图,也可以被图区域表示为MLIR操作。

注意,在图区域中的单个基本块里,或者基本块之间,会出现环。

"test.graph_region"() ({ // A Graph region

%1 = "op1"(%1, %3) : (i32, i32) -> (i32) // OK: %1, %3 allowed here

%2 = "test.ssacfg_region"() ({

%5 = "op2"(%1, %2, %3, %4) : (i32, i32, i32, i32) -> (i32) // OK: %1, %2, %3, %4 all defined in the containing region

}) : () -> (i32)

%3 = "op2"(%1, %4) : (i32, i32) -> (i32) // OK: %4 allowed here

%4 = "op3"(%1) : (i32) -> (i32)

}) : () -> ()

4.3.5. 参数与结果

区域第一个基本块的参数被视为该区域的参数。这些参数的源由父操作的语义定义。它们可能对应这个操作本身使用的一些值。

区域产生(可能是空C的)一组值。操作语义定义了区域结果与操作结果之间的关系。

4.3.6. 一些ODS定义

在ODS里region是这样的定义:

1638 class Region<Pred condition, string descr = ""> :

1639 RegionConstraint<condition, descr>;

基类RegionConstraint的定义是:

185 class RegionConstraint<Pred predicate, string description = ""> :

186 Constraint<predicate, description>;

在MLIR里,操作可能包含各种形式的region,因此有这些region派生定义:

  • 表示任意region的AnyRegion:

1642 def AnyRegion : Region<CPred<"true">, "any region">;

  • 表示包含指定数量基本块的SizedRegion:

1645 class SizedRegion<int numBlocks> : Region<

1646 CPred<"::llvm::hasNItems($_self, " # numBlocks # ")">,

1647 "region with " # numBlocks # " blocks">;

  • 表示包含0或多个基础region的变长VaridadicRegion:

1650 class VariadicRegion<Region region>

1651 : Region<region.predicate, region.description>;

一个使用这些Region派生类定义的例子是(TestOps.td):

1230 def SSACFGRegionOp : TEST_Op<"ssacfg_region", [

1231 DeclareOpInterfaceMethods<RegionKindInterface>]> {

1232 let summary = "operation with an SSACFG region";

1233 let description = [{

1234 Test op that defines an SSACFG region.

1235 }];

1236

1237 let regions = (region VariadicRegion<AnyRegion>:$regions);

1238 let arguments = (ins Variadic<AnyType>);

1239 let results = (outs Variadic<AnyType>);

1230 }

上面1230行的region是MLIR引入的关键字,而$regions里的regions将是由mlir-tblgen生成的访问函数的名字。

相关推荐
冷眼看人间恩怨2 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
Hejjon7 小时前
SpringBoot 整合 SQLite 数据库
笔记
西洼工作室10 小时前
【java 正则表达式 笔记】
java·笔记·正则表达式
初学者7.10 小时前
Webpack学习笔记(2)
笔记·学习·webpack
新手上路狂踩坑11 小时前
Android Studio的笔记--BusyBox相关
android·linux·笔记·android studio·busybox
stm 学习ing12 小时前
HDLBits训练3
c语言·经验分享·笔记·算法·fpga·eda·verilog hdl
尘觉12 小时前
算法的学习笔记—扑克牌顺子(牛客JZ61)
数据结构·笔记·学习·算法
bohu8313 小时前
sentinel学习笔记1-为什么需要服务降级
笔记·学习·sentinel·滑动窗口
初学者7.14 小时前
Webpack学习笔记(3)
笔记·学习·webpack
bohu8315 小时前
sentinel学习笔记5-资源指标数据统计
笔记·sentinel·statisticslot