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

相关推荐

  1. MLIR笔记5

    2023-12-07 19:04:04       31 阅读
  2. MLIR

    2023-12-07 19:04:04       5 阅读
  3. css学习笔记5

    2023-12-07 19:04:04       41 阅读
  4. HTML5笔记

    2023-12-07 19:04:04       36 阅读
  5. python笔记5

    2023-12-07 19:04:04       33 阅读
  6. mysql笔记5. 运算符

    2023-12-07 19:04:04       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 19:04:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 19:04:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 19:04:04       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 19:04:04       20 阅读

热门阅读

  1. CSS新手入门笔记整理:CSS列表样式

    2023-12-07 19:04:04       37 阅读
  2. 1.什么是html

    2023-12-07 19:04:04       37 阅读
  3. Linux之rsync免密登录

    2023-12-07 19:04:04       30 阅读
  4. 【力扣100】1.两数之和__231206

    2023-12-07 19:04:04       45 阅读
  5. 用户管理 --汇总

    2023-12-07 19:04:04       42 阅读
  6. Hive增强的聚合、多维数据集、分组和汇总

    2023-12-07 19:04:04       38 阅读
  7. Chart 6 Adreno GPUs内核优化建议

    2023-12-07 19:04:04       30 阅读