XLA IR:HLO、LHLO、MHLO和LMHLO

news2024/10/5 15:28:45

XLA IR:HLO、LHLO、MHLO和LMHLO

  • HLO
  • LHLO
  • MHLO
  • LMHLO
  • XLA IR 总结
  • HLO->LMHLO

xla基本编译流程如下:
在这里插入图片描述

  • HLO Optimization: 硬件无关优化和硬件相关优化
  • LHLO Codegen: 算子向量化和llvmir的生成
  • HLO&LHLO是XLA-HLO;MHLO&LMHLO是MLIR-HLO,也即MLIR HLO的dialect

HLO

HLO(High Level Optimizer),是XLA IR。XLA支持一组正交的基础operators(原子算子),其他的operators都可以由这组基础算子组合而成。HLO IR是分层的嵌套结构,由以下三个层次组成:

  • HloModule:HLO IR最高层的表示,可以理解成整个程序。一个HloModule可以包含很多个HloComputation。

  • HloComputation:HLO IR中间层的表示,相当于程序中的一个函数。一个HloModule只能有一个entry_conputation,其他的computation是被entry_computation调用的。我们可以把entry_computation类比作main函数。每个HloComputation可以包含多个HloInstruction。

  • HloInstruction:HLO IR最底层的表示,相当于程序中的一条指令。每个HloComputation只能有一个root_instruction。root_instruction的output就是该computation的output。computation的input用parameter表示。HloInstruction也可以调用HloComputation,HloInstruction中有一个called_computations_来表示该instruction调用的computation。不同HloInstruction参数和属性可能存在区别,HloInstruction只是一个base class,特殊的Instruction可以由HloInstruction派生得到,例如HloSliceInstruction。

在这里插入图片描述
HloInstruction通过call_computations_调用另一个comoutation,实现IR的嵌套。例如XLA的融合优化,会将被融合的指令替换成一条HloFusionInstruction,被融合被组装到一个HloComputation,并被HloFusionInstruction调用。

 1 HloModule m, is_scheduled=true, entry_computation_layout={(f32[8]{0},f32[8]{0})->f32[8]{0}}
 2                                                                                           
 3 fused_computation {                                                                       
 4   p0 = f32[8]{0} parameter(0)                                                             
 5   p1 = f32[8]{0} parameter(1)                                                             
 6   multiply0 = f32[8]{0} multiply(p0, p1)                                                  
 7   ROOT add0 = f32[8]{0} add(multiply0, p1)                                                
 8 }                                                                                         
 9                                                                                           
10 ENTRY PredFloatMOF {                                                                      
11   p0.1 = f32[8]{0} parameter(0)                                                           
12   p1.1 = f32[8]{0} parameter(1)                                                           
13   ROOT fusion = f32[8]{0} fusion(p0.1, p1.1), kind=kLoop, calls=fused_computation                                                                                                          
14 }

XLA HLO的op操作的是immutable、静态shape和显示广播的tensor。
HLO的入口:

  • TF、PT和JAX转换成HLO。
  • 经过mlir_bridge,先转成mlir(tf_executor dialect and mhlo),在mlir上做一些优化,再转为HLO。此路线在XLA中还是experimental,还在开发中。

出口:

  • LHLO、MHLO或LMHLO。XLA的pipeline是将HLO转成MHLO和LMHLO,然后用于codegen。

LHLO

LHLO:“late”-HLO,经过buffer assignment后的HLO。HLO和LHLO的区别在于HLO注重的是tensor的表达,不考虑到内存的分配,比如tensor<8x32x16xfp32>,仅仅表示为tensor,没有具体的内存信息,没有side-effect的。LHLO会为tensor开辟内存空间,也即经过buffer assign,buffer assign相当于传统编译器中的内存分配,LHLO的op具有side-effect。
入口:

  • HLO

出口:

  • 用于codegen。

MHLO

MHLO:“meta”-HLO dialect,是HLO风格的MLIR dialect, 并且在IR上扩展支持了dynamic shape。XLA HLO 的shape是静态不可变的,不同shape需要重新编译;MHLO支持动态shape,IR本身有能力表达shape计算和动态shape信息的传递。

MLIR-HLO使得HLO可以从XLA中独立出来,可以结合MLIR构建端到端的编译器。

入口:

  • TF Graph
  • XLA HLO

出口:

  • Linalg IREE、LMHLO,直接用于codegen。使用mlir构建编译器可以选择使用hlo为输入,转换为mlir的MHLO,做相关的分析、变换和优化,再转成LMHLO或者Linalg等做codegen。
  • XLA HLO

LMHLO

LMHLO:“late”-“meta”-HLO dialect。是LHLO风格的MLIR dialect。

入口:

  • MHLO或者XLA HLO经过shedule 和 buffer assign 后再转换的到。

出口:

  • 用于codegen到llvm ir。

XLA IR 总结

  • (M)HLO的op是tensor类型,是不可变的 (immutable)、并且不具有 side effect,tensor的数据流分析(例如ssa def-use chain )和转换会比较容易。而L(M)HLO是经过buffer assign的,buffer 是可变的 (mutable)和有别名的 (alias),buffer上分析和转换需要比较复杂的依赖分析 (dependency analysis) 和别名分析 (alias analysis)。XLA会在HLO上做优化相对比较容易,包括传统的图优化(代数化简、死代码删除等)、融合相关优化等等。在完成HLO层的优化后转为LMHLO,利用mlir LMHO dialect做codegen生成llvm ir。

  • XLA pipeline中是直接将XLA HLO转换为LMHLO,然后在LMHLO上codegen。

  • 按照xla的技术路线,lmhlo将合并到mhlo中,将不再区分mhlo和lmhlo,mhlo可以同时操作tensor和memref。

HLO->LMHLO

主要的处理过程如下:
1、buffer assignment。

  • hlo instruction schedule,确定buffer liveness(减少内存使用)等。
  • buffer assignment。

2、HLO转换为LMHLO。

  • 创建mlir module、funcOp及其参数。
  • 以SequentialHloOrdering顺序(可以先简单理解成指令执行顺序,这里会考虑到节省内存)处理entry computation中的每条指令,不同的指令类型进入不同的处理函数。例如:为hlo的instruction创建lmhlo的op;有call_computation时,以root节点后序遍历(post order)顺序处理computation中每条指令。

参考:

  • https://github.com/tensorflow/tensorflow/tree/master/tensorflow/compile r/xla/mlir_hlo
  • https://mlir.llvm.org/docs/LangRef/#high-level-structure

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

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

相关文章

队列的基本操作(C语言链表实现)初始化,入队,出队,销毁,读取数据

文章目录 前言一、队列基本变量的了解二、队列的基本操作2.1队列的初始化&#xff08;QueueInit&#xff09;2.2入队&#xff08;QueuePush&#xff09;2.3判断是否为空队&#xff08;QueueEmpty&#xff09;2.4出队&#xff08;QueuePop&#xff09;2.5队列的队头数据&#xf…

分享BigDecimal金额计算的4种方式

基本介绍 金额计算这块通常都是基于2位小数的四舍五入&#xff0c;如果是自己的系统内部功能金额位数一般都是固定的&#xff0c;在正常的加减乘除运算逻辑都是保留同样位数的&#xff0c;但是乘法和除法相对比较特殊&#xff0c;在计算小数的部分可能会计算出更多位数的小数点…

【微服务】搭建Consul集群服务和Consul配置中心

文章目录 一、传统配置文件的弊端二、微服务配置中心三、主流的配置中心四、Consul 配置操作1.添加配置信息2.获取配置信息 五、单点服务器Consul集群 一、传统配置文件的弊端 静态化配置&#xff0c;例如env文件配置文件无法区分环境配置文件过于分散历史版本无法查看 配置中…

5.5、线程池同步机制类封装及线程池实现

代码地址 5.5、线程池同步机制类封装及线程池实现 1.线程池2.代码实现①锁Ⅰ、locker.hⅡ、locker.cpp ②条件变量Ⅰ、cond.hⅡ、cond.cpp ③信号量Ⅰ、sem.hⅡ、sem.cpp ④线程池Ⅰ、threadpool.hⅡ、threadpool.cpp 1.线程池 线程池是由服务器预先创建的一组子线程&#xf…

行为识别预警系统 opencv

行为识别预警系统通过pythonopencv网络模型技术&#xff0c;行为识别预警系统对现场画面中人的行为进行智能分析&#xff0c;发现违规行为自动抓拍告警&#xff0c;同步回传后台存档提醒值班人员及时处理。OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一个…

CVE漏洞复现-CVE-2019-5736 Docker逃逸

CVE-2019-5736 Docker逃逸 Docker是什么&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有…

JAVA实现AES加密、解密附代码

大家好&#xff0c;今天我们一起来学习 Java中的加密解密技术&#xff0c; java是一门面向对象的语言&#xff0c;使用它的开发人员都是非常聪明的人&#xff0c;他们对数据的安全性要求很高。在实际的应用中&#xff0c;我们都需要对数据进行加密、解密处理&#xff0c;这在 j…

【数据结构】第十三站:排序(上)

本文目录 一、排序概念二、插入排序1.插入排序的基本思想2.算法实现3.时间复杂度分析 三、希尔排序1. 希尔排序的思想2.希尔排序的代码实现3.希尔排序和插入排序的性能测试比较4.希尔排序的时间复杂度 四、直接选择排序1.基本思想2.直接选择排序的步骤3.直接选择排序的代码实现…

接口自动化测试用例如何设计?

说到自动化测试&#xff0c;或者说接口自动化测试&#xff0c;多数人的第一反应是该用什么工具&#xff0c;比如&#xff1a;Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自动化平台等。大家似乎更关注的是哪个工具更优秀&#xff0c;甚至出现“ 做平台的 &…

音视频开发开发核心知识+小白入门必看基础知识

音视频开发是一个广泛的领域&#xff0c;它涉及到多个技术领域&#xff0c;包括音频编解码、视频编解码、媒体容器格式、流媒体传输、音视频处理等。以下是音视频开发的一些基础知识&#xff1a; 音频编解码器&#xff1a;音频编解码器是将数字音频信号编码成一种压缩格式&…

什么原因会导致香港轻量云服务器运行缓慢?

对于外贸企业主来说&#xff0c;想要为自己的网站选择一个可靠的主机供应商&#xff0c;并考虑使用香港轻量云服务器&#xff0c;则本文是必读的。本文将探讨租用香港轻量云服务器后遇到的运行缓慢的问题。下文这些因素被视为其中的主要因素。仔细分析它们中的每一个将帮助您确…

华为OD机试真题(Java),5键键盘的输出(100%通过+复盘思路)

一、题目描述 有一个特殊的5键键盘&#xff0c;上面有a&#xff0c;ctrl-c&#xff0c;ctrl-x&#xff0c;ctrl-v&#xff0c;ctrl-a五个键。 a键在屏幕上输出一个字母a&#xff1b;ctrl-c将当前选择的字母复制到剪贴板&#xff1b;ctrl-x将当前选择的字母复制到剪贴板&#…

python 打包新方案

首先是打包一个最简单的python 代码使用 pyinstaller import os #直接读取文件获得python.exe 路径 # 待执行python路径 with open("path_run.txt","r",encoding"utf-8") as f:python_exe,pyf.readlines() os.system("{} {}".format(p…

关于Acunetix(AWVS)激活时候失败可能的方法

关于Acunetix(AWVS)激活的时候失败&#xff0c;可能的解决方法 如果自己的激活包大概率没有问题&#xff0c;但是自己却激活不了 可以在服务中关闭所有的进程&#xff0c;再进行文件替换 方法如下&#xff1a; 1.先卸载文件&#xff0c;卸载的干干净净 2.正常安装 3.安装完毕…

cuDNN 的初始设计

cuDNN V1.0在2014年的发布,并集成到 Caffe、Paddle 等深度学习框架中。论文 cuDNN: Efficient Primitives for Deep Learning 介绍了 NVIDIA 对于该库的设计和实现。近十年间&#xff0c;NVIDIA 迭代推出了8代架构&#xff0c;cuDNN 也更新到 8.9。硬件上引入了 Tensor Core&am…

超级详细的 VirtualBox 虚拟机安装 及入门教程

一、前言 虚拟机&#xff08;Virtual Machine&#xff09;指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。 虚拟机是在一些开发测试工作中常常需要用到的功能&#xff0c;常见的虚拟机…

数学建模算法汇总(全网最全!含matlab案例代码)

数学建模常用的算法分类 全国大学生数学建模竞赛中&#xff0c;常见的算法模型有以下30种&#xff1a; 最小二乘法数值分析方法图论算法线性规划整数规划动态规划贪心算法分支定界法蒙特卡洛方法随机游走算法遗传算法粒子群算法神经网络算法人工智能算法模糊数学时间序列分析马…

【对比度增强】Learning Tone Curves for Local Image Enhancement(LTMNet)

文章目录 0. 前言1. 理解1.1 整体框架1.2 网络结构1.3 细节 2. 亮点3. 总结 0. 前言 LTMNet这篇文章借鉴了CLAHE算法&#xff0c;所有步骤与CLAHE一致&#xff0c;不同之处在于LTMNet中局部映射曲线是通过CNN预测得到&#xff0c;而CLAHE中是通过直方图均衡化而得。关于CLAHE&…

MySQL_第10章_创建和管理表

第10章_创建和管理表 讲师&#xff1a;尚硅谷 - 宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a; http://www.atguigu.com 1. 基础知识 1.1 一条数据存储的过程 存储数据是处理数据的第一步 。只有正确地把数据存储起来&#xff0c;我们才能…

【C++11】智能指针

目录 一、异常层层嵌套执行流乱跳容易导致内存泄漏 二、使用智能指针解决上述问题 1、RAII 2、像指针一样 3、智能指针RAII运算符重载 三、C98的auto_ptr 四、C11的unique_ptr和shared_ptr 1、unique_ptr唯一指针 2、shared_ptr共享指针 2.1shared_ptr是否线程安全 …