当前位置: 首页 > news >正文

MLIR Introduction

简介

MLIR 项目是一个构建可重用和可扩展编译器基础设施创新项目,旨在解决软件碎片化问题,显著降低构建特定领域编译器的成本。

基于MLIR,可以实现:

  • 数据流图表达(如TensorFlow),包含dynamic shape,用户扩展op等;
  • 数据流图的优化和变换,如Grappler;
  • 跨Kernel实现HPC风格的循环优化(如fusion,interchange,tiling等),数据在内存中的layout变换;
  • 针对1D(如CPU)和2D(如GPU)寄存器架构的代码生成“lowering”转换,如DMA指令插入,显式cache管理,内存Tiling,矢量化;
  • 表达特定硬件后端的的op,如加速器的高级操作;
  • 深度学习图变换,如量化等;
  • 多面体原语;
  • 硬件综合工具。

常用术语

语言

Dialect

一组扩展MLIR系统的功能。Dialect创建了一个唯一的namespace,包含operations,attributes,types。可以把MLIR看作一种meta-IR,所有的Dialects都是MLIR的一部分。使用dialect而不是language是想强调Dialect不是一个独立的IR。

转换

Translation

将非MLIR的形式转换为MLIR的形式(Import),或者反之(Export)。

Export

将MLIR形式转换为语义等价的外部IR的形式(如LLVM IR)。

Import

将外部IR(如Torch IR)转换为语义等价的MLIR的形式。

Conversion

将代码从一种Dialect表示转换为语义等价的同一种(intra-dialect)或另一种Dialect(inter-dialect)表示。在MLIR的上下文中,conversion表示MLIR内的转换,既不转换到MLIR Dialect以外的表示(如LLVM IR),否则是Translation。

Round-trip

将源格式转换为目标格式,再转换回源格式的过程。

Lowering

将高级IR表达的operation转换为语义等价的低级IR表达。在MLIR中通常通过dialect conversion来实现。

Legalization

将operations转换为符合转换目标所设定要求的语义等价表示的过程。通常是Lowering中的一部分。

Transitive lowering

一种A->B->C的lowering方式,多个模式(patterns)需要按顺序应用,以将一个对target非法的操作完全转换为一组合法操作。

CSE (Constant Subexpression Elimination)

公共子表达式消除,消除不可达的代码和值未被使用的表达式。

DRR(Declarative Rewrite Rule)

声明式重写规则。在编译时,这些规则会被扩展成等价的mlir::RewritePattern子类。

结构

Operation (op)

MLIR代码单元。Operations是MLIR所有代码和计算的构建单元。高度支持扩展(没有固定的operation列表,可以灵活自定义),支持应用特定语义。

在MLIR中,有2个主要的Operation相关的类:Operation和Op。Operation是一个对用户透明的实例,表达了Operation实例的通用API。Op是派生Operation(如ConstantOp)的基类,派生类可以为每个具体的操作提供特定的方法和属性,同时,Op也是Operation的一个智能指针,两个类之间可以灵活的互相转换。

Module

一个Operation,包含一个Region,Region中包含一个Block,Block包含一个或多个Operations。提供了MLIR Operations的组织结构,是IR中的top-level Operation。

Function

一个有名的Operaiton,包含一个Region。Region可以隐式捕获function外的值,所有外部引用必须使用function arguments或者attributes的形式,建立一个符号链接。

Region

一个Blocks组成的CFG。

Block(Basic Block)

一个没有控制流的顺序Operation列表。

Terminator operation

终止1个Block的Operation,有2个作用:

  • 结束当前块的执行:终止操作明确地表示当前块的结束,防止代码继续执行到下一个操作。

  • 控制程序的下一步行为:终止操作通常会决定程序的下一步行为,例如:

  1. 跳转到另一个块:使用 br(分支)操作跳转到另一个块。
  2. 返回函数结果:使用 return 操作返回函数的结果。
  3. 抛出异常。

参考资料:

MLIR

Glossary - MLIR

http://www.xdnf.cn/news/1242595.html

相关文章:

  • android内存作假通杀补丁(4GB作假8GB)
  • History 模式 vs Hash 模式:Vue Router 技术决策因素详解
  • ZYNQ-按键消抖
  • JavaScript 中的流程控制语句详解
  • 3.JVM,JRE和JDK的关系是什么
  • 第二十四天(数据结构:栈和队列)队列实践请看下一篇
  • SQL注入SQLi-LABS 靶场less39-50详细通关攻略
  • 基于实时音视频技术的远程控制传输SDK的功能设计
  • 【ECCV2024】AdaCLIP:基于混合可学习提示适配 CLIP 的零样本异常检测
  • [GESP202306 四级] 2023年6月GESP C++四级上机题超详细题解,附带讲解视频!
  • 刷题记录0804
  • ref和reactive的区别
  • 8位以及32位的MCU如何进行选择?
  • ArrayDeque双端队列--底层原理可视化
  • Redis 常用数据结构以及单线程模型
  • LeetCode 140:单词拆分 II
  • Array容器学习
  • app-1
  • 优选算法 力扣 11. 盛最多水的容器 双指针降低时间复杂度 贪心策略 C++题解 每日一题
  • Javascript面试题及详细答案150道之(031-045)
  • python包管理器uv踩坑
  • 力扣面试150题--加一
  • PCL统计点云Volume
  • ArcGIS的字段计算器生成随机数
  • 配置Mybatis环境
  • 【多智能体cooragent】CoorAgent 系统中 5 个核心系统组件分析
  • 一起学springAI系列一:流式返回
  • 【实战】Dify从0到100进阶--中药科普助手(1)
  • 嵌入式硬件中三极管原理分析与控制详解
  • 零售消费行业研究系列报告