[MLIR] CodeGen Pipeline总结

news/2025/4/2 5:14:34/

参考资料:

[MLIR] CodeGen Pipeline总结 - 知乎 (zhihu.com)

本文主要以 tensorflow 为例,介绍了其接入 MLIR 后的 CodeGen 过程,以及简要分析了一些现在常用的 CodeGen pipeline。本文是本人在结合博客(Codegen Dialect Overview - MLIR - LLVM Discussion Forums)以及相关资料而写成,主体内容来源于翻译。

现状

Classification

MLIR 中与代码生成相关的 dialects 大致可以沿着两个轴进行分解:tensor/buffer 和 payload/structure

简单来说,MLIR是一种编译器中间表示语言,它可以帮助我们更好地处理机器学习代码。在MLIR中,dialects是指不同的语言方言,可以分为tensor/buffer和payload/structure两个方面。tensor/buffer主要是指不同的数据类型和内存管理方式,payload/structure则是指不同的计算操作和执行方式。这些dialects之间存在相互依存的关系,它们共同构成了MLIR的多层次抽象结构。

Dialects of Interest

我们写机器学习代码时,我们通常会使用高级别的数据结构,比如tensor。但是,这些高级别的结构不能直接在硬件上执行,需要经过一些中间步骤将它们转换为低级别的表示形式,比如buffer。这些中间步骤通常涉及到dialects,也就是不同的语言方言。在转换的过程中,我们会使用最近引入的dialects,也就是最适合当前转换的语言方言。这些dialects的目的是将高级别的结构转换为低级别的表示形式,以便最终在硬件上执行。 

"Dialects" 是 MLIR 中的一个概念,它可以根据它所抽象的特征的级别来组织成一个堆栈,就像一个抽象的塔一样。在这个堆栈中,越高级别的抽象表示越抽象,越低级别的抽象表示越接近实际的底层实现。将较高级别的抽象表示向下转化成较低级别的抽象表示通常比较容易,因为较低级别的抽象已经包含了较高级别抽象的所有特征,相当于是将抽象的东西转化为更具体的东西。但是,反过来将较低级别的抽象表示提升到较高级别的抽象表示通常比较困难,因为较低级别的抽象不一定包含较高级别抽象的所有特征,需要通过一些复杂的技术和算法来推导和计算出来。

在编译器一系列转换程序的过程中,越来越多的高层次的简明信息被打散,转换为低层次的细碎指令,这个过程被称为代码表示递降lowerinng ,与之相反的过程被称为代码表示递升raising 。raising远比lowering困难,因为需要在庞杂的细节中找出宏观脉络。

在MLIR中,我们可以使用不同的“方言”(即不同的语言变体)来表示不同的操作和计算。

其中,Linalg方言是用于表示结构化计算的一种方言,它支持使用通用的表示形式来表示结构化数据上的结构化计算,并且支持在不改变操作本身的情况下将tensor转换为buffer。此外,Linalg方言还提供了一些特定的操作(如矩阵乘法和卷积),以及用于定义结构的通用操作。这些操作可以相互转换,并且可以通过迭代结构转换为向量操作或循环操作。这些特性使得Linalg方言非常适合于编译器的优化和代码生成。

Async Dialect 是一个用于编写异步代码的工具集合,可以帮助程序员在不同的层次上表示异步计算。它可以在高层次上组织大型计算块,例如跨多个设备的计算任务,同时在低层次上包装基本的指令序列。在异步编程中,我们经常需要协调多个任务之间的执行,因为这些任务的执行可能是不确定的或者受到其他任务的影响。Async Dialect 提供了一种基于异步计算块的方式来组织这些任务,并且可以在这些计算块之间建立依赖关系来协调它们的执行顺序。除此之外,Async Dialect 还提供了一些原语来处理异步计算的基本操作,例如异步等待、异步执行和取消异步任务等。这些原语可以在低层次上包装成指令序列,使得程序员可以直接使用它们来编写异步代码。

后面还有很多的dialect。

一些现存的 pipelines

TensorFlow Kernel Generator

IREE Compiler (LLVM Target)

IREE Compiler (SPIR-V Target)

Polyhedral Compiler

分析

1111111111111111111


http://www.ppmy.cn/news/49544.html

相关文章

强大的图像查看器:EdgeView mac中文

EdgeView mac中文版是mac上一款强大的图像查看软件,可以处理一些最流行的图像文件格式,同时还提供对导航杂志或漫画书的支持。EdgeView能够打开著名的图像文件格式主要包括JPG,GIF,PSD在内的多种格式文件,支持Retina显…

vue2数据响应式原理(2)搭建webpack认识一下Object.defineProperty

在1中我们讲到 Object.defineProperty() 是vue2实现数据响应的关键 那么我们就来好好的看看这个方法 方法字面意思是定义属性 而他是通过Object对象调用的 所以说 他是用来控制对象的某个属性的 比较官方的解释是 object.defineProperty() 方法会直接在一个对象上定义一个新属…

【蓝桥杯省赛真题19】python完数及个数 青少年组蓝桥杯python编程省赛真题解析

目录 python完数及个数 一、题目要求 1、编程实现 2、输入输出 二、解题思路

倾斜摄影三维模型轻量化过程中遇到的常见问题分析,如何处理这些问题?

倾斜摄影三维模型轻量化过程中遇到的常见问题分析,如何处理这些问题? 在倾斜摄影超大场景的三维模型轻量化过程中,常见的问题包括: 1、精度损失。为了减小数据文件大小,轻量化处理可能会破坏原始数据的精度&#xff0…

射频封装技术:层压基板和无源器件集成

射频和无线产品领域可以使用非常广泛的封装载体技术,它们包括引线框架、层压基板、低温共烧陶瓷(LTCC)和硅底板载体(Si Backplane)。由于不断增加的功能对集成度有了更高要求,市场对系统级封装方法&#xf…

二叉树遍历(先序、中序、后序、层次遍历)递归、循环实现

本文介绍二叉树遍历的以下四种 分别使用 循环遍历 递归遍历实现 前序遍历:根结点 — 左子树 — 右子树 中序遍历:左子树— 根结点 — 右子树 后序遍历:左子树 — 右子树 — 根结点 循环遍历的时候比先序和中序稍复杂本文介绍两种供大家选择…

倾斜摄影超大场景的三维模型的顶层合并常见的问题分析

倾斜摄影超大场景的三维模型的顶层合并常见的问题分析 倾斜摄影超大场景的三维模型顶层合并是将多个局部区域的点云或网格数据进行融合,生成一个整体的三维模型的过程。在这个过程中,常见的问题包括: 1、数据不一致。由于数据采集时间、空间…

rpm命令查询和取包中内容

使用以下命令来提取 RPM 包中的文件&#xff1a; rpm2cpio <package_name>.rpm | cpio -idmv其中&#xff0c;<package_name>.rpm 为您要提取文件的 RPM 包的名称。 这个命令将 RPM 包转换为 cpio 格式&#xff0c;然后使用 cpio 工具来提取其中的文件。提取的文…