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

相关推荐
代码游侠8 小时前
ARM开发——阶段问题综述(二)
运维·arm开发·笔记·单片机·嵌入式硬件·学习
张祥6422889048 小时前
误差理论与测量平差基础笔记十
笔记·算法·机器学习
云边散步11 小时前
godot2D游戏教程系列二(4)
笔记·学习·游戏开发
BORN(^-^)12 小时前
《产品经理方法论》阅读笔记
笔记·产品经理
jrlong12 小时前
DataWhale大模型基础与量化微调task4学习笔记(第 2 章:高级微调技术_RLHF 技术详解)
笔记·学习
傻小胖12 小时前
13.BTC-思考-北大肖臻老师客堂笔记
笔记·区块链
風清掦13 小时前
【江科大STM32学习笔记-04】0.96寸OLED显示屏
笔记·stm32·学习
胡西风_foxww13 小时前
ObsidianAI_学习一个陌生知识领域_建立学习路径和知识库框架_写一本书
人工智能·笔记·学习·知识库·obsidian·notebooklm·写一本书
AI视觉网奇13 小时前
huggingface-cli 安装笔记2026
前端·笔记
idontknow23315 小时前
DPDK学习笔记(1):二层转发应用例代码解析
c语言·网络·笔记·学习