MLIR笔记(3)

4. 一些ODS定义

4.1. 特性(trait)

MLIR支持一个完全开放的生态系统,因为任意方言都可以定义适合特定抽象层次的属性(attribute)、操作(operation)以及类型(type)。特性(trait)是抽象出实现细节以及在许多不同属性/操作/类型等之间通用的属性(properties)的机制。特性可用于说明这个对象特殊的属性以及约束,包括一个操作是否有副作用,或者它的输出是否与输入有相同的类型。操作特性的一些例子有Commutative、SingleResult、Terminator等。

4.1.1. 特性AttrSizedOperandSegments

特性AttrSizedOperandSegments是这样定义的:

1777  def AttrSizedOperandSegments : NativeOpTrait<"AttrSizedOperandSegments">;

Mlir codegen看到这个特性会为Op对象生成一个名为operand_segment_sizes的字典属性项。这个属性说明每个ODS声明的操作数(变长或定长)对应多少个实际操作数。它用于具有多个变长操作数,但它们的大小关系静态未知。这个属性必须是与ODS声明操作数的元素个数相同的1维向量。这意味着即使某些操作数不是变长的,这个属性仍然需要有一个元素对应其大小,这将总是1。

4.1.2. 特性AttrSizedResultSegments

这个类与AttrSizedOperandSegments是类似的,只不过适用于Op的结果,对应于字典中"result_segment_sizes"一项。

4.2. Variadic

Variadic是这样定义的:

308  class Variadic<Type type> : TypeConstraint<type.predicate, type.description> {

309    Type baseType = type;

310  }

这个定义用在Op的arguments列表中,比如(AffineOps.td):

69  let arguments = (ins AffineMapAttr:$map, Variadic<Index>:$mapOperands);

这里,Index也是一个定义好的ODS类型:

434  def Index : Type<CPred<"$_self.isa<::mlir::IndexType>()">, "index">,

435              BuildableType<"$_builder.getIndexType()">;

一个Op允许使用任意多具有Variadic特性的操作数,前提是这些操作数所包含的子操作数的个数是相同;而且这些Variadic特性操作数可与非Variadic特性操作数混合使用。

区别:AttrSizedXXX用作操作的属性,描述的是操作所面对的操作数的形式。Variadic在这里通常用于描述为操作生成的方法的变长参数。

另外,在这里及其他地方看到的变长数据类型(比如VariadicRegion)都只是占位符,它们告诉mlir-tlbgen这个占位符对应的MLIR-IR是变长的,要相应地生成解析代码。

4.3. 区域

4.3.1. 定义

区域(region)是MLIR块的有序列表。区域里的语义不是IR施加的。相反,包含它的区域的操作定义了区域的语义。MLIR当前定义了两种类型的区域:SSACFG区域,它描述了基本块之间的控制流;以及Graph区域,它不要求基本块之间的控制流。操作里区域类型由RegionKindInterface描述。

区域没有名字或地址,仅包含在区域里的基本块有。区域被包含在操作内,并且没有类型或属性(attributes)。区域里的第一个基本块是称为“入口块”的特殊基本块。入口块的参数也是区域的参数。入口块不能作为其他基本块的后继者。

函数体是区域的一个例子:它包含一个基本块的CFG,并具有其他类型区域可能没有的额外的语义约束。例如,在函数体中,块终结符必须是去往另一个块的分支;或者从一个函数返回,其中return参数的类型必须匹配函数签名的结果类型。类似地,函数参数必须匹配区域参数的类型与数量。一般来说,具有区域的操作可以任意定义这些对应性(correspondances)。

4.3.2. 值作用域

区域提供了程序的分层封装(hierarchical encapsulation):引用(即分支到)不在同一个区域、作为引用源头的基本块(即一个终结符操作)是不可能的(it is impossible to reference, i.e. branch to, a block which is not in the same region as the source of the reference, i.e. a terminator operation)。类似地,区域提供了值可见性的一个自然的辖域:定义在一个区域里的值不会逃逸到包含它的区域(如果有的话)。默认地,区域里的操作可以援引定义在外部区域的值,只要包含它操作的操作数援引这些值是合法的,但这局限于使用特性(trait),比如OpTrait::IsolatedFromAbove,或定制的验证器。

例子:

  "any_op"(%a) ({ // if %a is in-scope in the containing region...
     // then %a is in-scope here too.
    %new_value = "another_op"(%a) : (i64) -> (i64)
  }) : (i64) -> (i64)

MLIR定义了一个泛化的“分层支配”的概念,它跨层次工作,定义一个值是否“在作用域内”可以被特定的操作使用。一个值是否可以被同一个区域里的另一个操作使用,由区域类型定义。定义在一个区域里的值可以被在同一个区域里有一个父亲的操作使用,当且仅当这个父亲可以使用这个值。由区域参数定义的值总是可以被深度包含在这个区域里的任何操作使用。在一个区域里定义的值不能在这个区域外使用。

4.3.3. 控制流与SSACFG区域

在MLIR里,区域的控制流语义由RegionKind::SSACFG表示。非正式地,这些区域支持这样的语义:区域里的操作“顺序执行”。在执行一个操作前,它的操作数有定义良好的值。在操作执行后,操作数有相同的值且结果也有定义良好的值。在操作执行后,执行基本块里的下一个操作,直到基本块末尾的终结符操作,在这个情形下将执行其他某个操作。确定下一条执行指令的是“控制流的传递”。

一般来说,当控制流被传递到一个操作时,MLIR不限制控制流何时进入或离开包含这个区域的操作。不过,当控制流进入一个区域时,它总是在这个区域的第一个块开始,这个块称为入口块。结束每个基本块的终结符操作通过显明说明这个块的后继者基本块来表达控制流。控制流仅能传递给其中一个后继者基本块,比如在一个branch操作,或者在一个回到封装操作的return操作里。没有后继者的终结符操作仅能将控制传递回封装它的操作。在这些约束中,终结符操作的特定语义是由所涉及的特定方言操作确定的。没有在终结符操作的后继者列表中的(入口块以外的)基本块被定义为不可到达,可以被删除而不影响封装操作的语义。

虽然控制流总是通过入口块进入一个区域,控制流可能通过任何一个具有合适终结符的基本块退出区域。Standard方言利用这个功能来定义具有单入口多出口(Single-Entry-Multiple-Exit,SEME)的区域,在区域中可能流经不同的基本块,并从任一带有return操作的基本块退出。这个行为类似于大多数编程语言中函数体的行为。另外,控制流还可能不能到达基本块或区域的末尾,例如,如果一个函数调用不返回。

例子:

func @accelerator_compute(i64, i1) -> i64 { // An SSACFG region
^bb0(%a: i64, %cond: i1): // Code dominated by ^bb0 may refer to %acond_br %cond, ^bb1, ^bb2^bb1:// This def for %value does not dominate ^bb2%value = "op.convert"(%a) : (i64) -> i64br ^bb3(%a: i64)    // Branch passes %a as the argument^bb2:accelerator.launch() { // An SSACFG region^bb0:// Region of code nested under "accelerator.launch", it can reference %a but// not %value.%new_value = "accelerator.do_something"(%a) : (i64) -> ()}// %new_value cannot be referenced outside of the region^bb3:...
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/153323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现】泛微E-Office信息泄露漏洞(CVE-2023-2766)

漏洞描述 Weaver E-Office是中国泛微科技(Weaver)公司的一个协同办公系统。 Weaver E-Office 9.5版本存在安全漏洞。攻击者利用该漏洞可以访问文件或目录。 影响版本 Weaver E-Office 9.5版本 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵…

vim模式用法总结

0.前言 我们用gcc编译文件的时候&#xff0c;如果发生了下面的错误&#xff0c;那么如何用vim打开的时候就定位到&#xff1f; 我们可以知道&#xff0c;这是第6行出现了错误&#xff1b; 所以我们使用vim打开的时候多输入个这个&#xff0c;我们就可以快速定位了 vim test.c 6…

外卖小程序系统:数字化时代餐饮业的技术奇迹

在当今数字化时代&#xff0c;外卖小程序系统正以其强大的技术背后支持&#xff0c;成为餐饮业务的一项奇迹。这个系统不仅提供了便捷的点餐体验&#xff0c;更通过先进的技术手段&#xff0c;实现了高效订单处理、智能推荐以及实时配送追踪。下面&#xff0c;我们将深入探讨外…

【六祎 - Dubbo】Dubbo 应用 XML配置分析;Dubbo 配置篇;Dubbo参考手册

Dubbo 应用 XML配置分析 演示案例&#xff1a;提供者代码xml配置消费者代码xml配置 参考地址&#xff1a; 手动配置 https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/config/overview/ 配置说明 xml配置 https://cn.dubbo.apache.org/zh-cn/ov…

人工智能AI 全栈体系(十三)

第二章 计算机是如何学会下棋的 人类棋手在下棋时&#xff0c;会根据自己的经验只考虑在当前棋局下最重要的几个可能的走法&#xff0c;但是计算机没有这种经验。 知识太复杂了&#xff0c;需要考虑很多具体的情况&#xff0c;一旦知识总结的不到位&#xff0c;可能就会出现大…

#gStore-weekly | gBuilder功能详解之表单录入

gBuilder除了可以提供结构化数据映射以及非结构化数据抽取两种构建知识图谱的方式以外&#xff0c;还提供了表单录入的方式来构建知识图谱的数据&#xff0c;用户只需要根据设计好的schema将实体、属性以及关系通过填写表单的形式录入&#xff0c;再通过一键生成NT文件即可获得…

安装和初步使用 nn-Meter

安装和初步使用 nn-Meter nn-Meter: Towards Accurate Latency Prediction of Deep-Learning Model Inference on Diverse Edge Devices nn-Meter&#xff1a;精准预测深度学习模型在边缘设备上的推理延迟 Li Lyna Zhang, Shihao Han, Jianyu Wei, Ningxin Zheng, Ting Cao, Y…

ros2原来本是一个通信协议

3.1 分布式 猛狮集训营 人工智能应用领域教育领导者&#xff0c;更多内容请关注公众号 3.1 分布式 场景 在许多机器人相关的应用场景中都涉及到多台ROS2设备协作&#xff0c;比如&#xff1a;无人车编队、无人机编队、远程控制等等&#xff0c;那么不同的ROS2设备之间是如何…

酷开科技丨这么好用的酷开系统,不用真的会后悔!

掀开一幕幕精彩剧情&#xff0c;手机已经成为了我们身边必不可少的追剧神器。在这个信息爆炸的时代&#xff0c;我们渴望能够随时随地享受到精彩的影视作品&#xff0c;尤其是在家的休息的时候&#xff0c;希望电视也能同手机一样&#xff0c;想看啥就搜啥。酷开科技大内容战略…

如何在 ASP.NET Core 中使用 Quartz.NET

当我们在web开发中&#xff0c;常常会遇到这么一个需求&#xff0c;在后台执行某一项具体的任务&#xff0c;具体的说就是这些任务必须在后台定时执行。 Quartz.NET 是一个开源的 JAVA 移植版&#xff0c;它有着悠久的历史并且提供了强大的 Cron 表达式&#xff0c;这篇我们就…

系列五、线程间通信

一、synchronized实现 1.1、案例一&#xff08;2个线程交替对变量执行1、-1操作&#xff0c;来10轮&#xff09; 1.1.1、资源类ShareDataOne /*** Author : 一叶浮萍归大海* Date: 2023/11/20 10:44* Description: 资源类* 说明&#xff1a;2个线程使用if判断变量的值&#…

【微软技术栈】C#.NET 内置数值转换

本文内容 隐式数值转换显式数值转换 C# 提供了一组整型和浮点数值类型。 任何两种数值类型之间都可以进行隐式或显式转换。 必须使用强制转换表达式来执行显式转换。 1、隐式数值转换 下表显示内置数值类型之间的预定义隐式转换&#xff1a; From到sbyteshort、int、long、…

Linux 信号

目录 1.什么是信号 2.信号的产生 处理信号的常见方式&#xff1a; 如何理解这些组合键是如何变成信号的&#xff1f; 信号发送本质​编辑 信号的种类 ​编辑 3.信号处理常见方式概览 4.产生信号 5.信号其他相关常见概念 ​编辑 6.捕捉信号 signal函数&#xff1a; …

【Go语言实战】(26) 分布式搜索引擎

Tangseng 基于Go语言的搜索引擎 github地址&#xff1a;https://github.com/CocaineCong/tangseng 详细介绍地址&#xff1a;https://cocainecong.github.io/tangseng 这两周我也抽空录成视频发到B站的&#xff5e; 本来应该10月份就要发了&#xff0c;结果一鸽就鸽到现在hh…

Conditional GAN

Text-to-Image 对于根据文字生成图像的问题&#xff0c;传统的做法就是训练一个NN&#xff0c;然后输入一段文字&#xff0c;输出对应一个图片&#xff0c;输出图片与目标图片越接近越好。存在的问题就是&#xff0c;比如火车对应的图片有很多张&#xff0c;如果用传统的NN来训…

shell编脚本概述和变量解释

shell的基本概述和规范 shell面向的对象 面向过程语言 &#xff08;开发的时候&#xff0c;需要一步一步的执行&#xff09; 做一件事情&#xff0c;排出个步骤&#xff0c;第一步干什么&#xff0c;第二步干什么&#xff0c;如果出现情况A&#xff0c;做什么处理&#xff0…

澳洲猫罐头如何?我亲自喂养过的优质猫罐头分享

猫罐头要符合三点&#xff1a;营养配方完整均衡、原料新鲜优质、生产工艺科学可靠。只有具备这些特点&#xff0c;才是品质上乘的猫罐头。 猫罐头的三个要素&#xff0c;一个都不能少。配方不均衡&#xff0c;营养就不足&#xff1b;原料不新鲜&#xff0c;生产出来的猫罐头就…

NX二次开发UF_CAM_ask_lower_limit_plane_data 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 UF_CAM_ask_lower_limit_plane_data Defined in: uf_cam_planes.h int UF_CAM_ask_lower_limit_plane_data(tag_t object_tag, double origin [ 3 ] , double normal [ 3 ] ) overview 概述 Query …

鸿蒙开发|鸿蒙系统项目开发前的准备工作

文章目录 鸿蒙项目开发的基本流程介绍鸿蒙项目开发和其他项目有什么不同成为华为开发者-注册和实名认证1.登录官方网站 鸿蒙项目开发的基本流程介绍 直接上图&#xff0c;简单易懂&#xff01; 整个项目的开发通过4个模块进行&#xff1a;开发准备、开发应用、运行调试测试和发…

一道简单的无穷级数题目

求级数 ∑ n 1 ∞ n x n \sum _{n1} ^ {\infty} n x^n n1∑∞​nxn 解析&#xff1a; 设 s ∑ n 1 ∞ n x n s \sum _{n1} ^ {\infty} n x^n sn1∑∞​nxn s 1 ∑ n 1 ∞ n x n − 1 s_1 \sum _{n1} ^ {\infty} n x^{n-1} s1​n1∑∞​nxn−1 则 s s 1 x s s_1…