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生成的访问函数的名字。

相关推荐
Olrookie2 小时前
ruoyi-vue(十五)——布局设置,导航栏,侧边栏,顶部栏
前端·vue.js·笔记
使一颗心免于哀伤1 天前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
_落纸3 天前
三大基础无源电子元件——电阻(R)、电感(L)、电容(C)
笔记
Alice-YUE3 天前
【CSS学习笔记3】css特性
前端·css·笔记·html
2303_Alpha3 天前
SpringBoot
笔记·学习
Hello_Embed3 天前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中4 天前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
Grassto4 天前
RAG 从入门到放弃?丐版 demo 实战笔记(go+python)
笔记
Magnetic_h4 天前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
周周记笔记4 天前
学习笔记:第一个Python程序
笔记·学习