全局指令选择

概述

基于SelectionDAG 的指令选择方法可以生成质量较高的机器码,但代价是开发难度和代码复杂度较高

快速指令选择方法复杂度较低,但代码质量较差。为了综合二者的优点,取长补短,LLVM在现有的架构上实现了全局指令选择,并希望用全局指令选择取代基于SelectionDAG 的指令选择方法和快速指令选择方法

全局指令选择提供了不同于其他两种指令选择方法的可重用pass和功能函数,可以完成从LLVM IR到目标机器IR(Machine IR) 的指令选择功能

全局指令选择没有引入新的DAG 中间表示,而且,全局指令选择工作在函数级别,可以发掘更多的全局优化机会

全局指令选择框架

全局指令选择框架包括四个pass: IRTranslator、Legalizer、RegBankSelect、InstructionSelect

上述四个pass的实现代码都在路径<llvm_root>/llvm/lib/CodeGen/GlobalSel/ 下。 LLVM 中的各目标后端没有实现全部的全局指令选择pass,部分采用了LLVM 中已有的默认pass

各目标后端如需添加全局指令选择pass,需要重写后端TargetPassConfig派生类(如AMDPGU 后端的 GCNPassConfig 类) 中的 addIRTranslator()、ddRegBankSelect() 等虚函数,并在后端目标机器描述文件TargetMachine.cpp 中,通过 addPass() 向 pass管理器中添加全局指令pass

例如,AMDGPU 后端中添加全局指令选择 pass 的相关代码如下:

bool GCNPassConfig::addIRTranslator () {
    addPass (new IRTranslator (getOptLevel ()));
    return false;
}

bool GCNPassConfig:: addLegalizeMachineIR () {
    addPass (new Legalizer ()) ;
    return false;
}

bool GCNPassConfig :: addRegBankSelect () {
    addPass (new RegBankSelect ());
    return false;
}

bool GCNPassConfig:: addGlobalInstrunctionSelect() {
    addPass(new InstructionSelect());
    return false;
}

IRTranslator pass

IRTranslator pass 的作用是将输入LLVM IR 转换为通用机器IR(Generic Machine IR, gMIR)

gMIR 是一种与MIR共用相同数据结构的IR,但其约束更宽松。随着编译过程向前递进,这些约束逐渐收紧,gMIR也由此变成MIR

gMIR 和 MIR 的不同之处在于,MIR主要处理目标指令,只有一个小部分目标无关的操作码,如COPY、PHI和REG_SEQUENCE 等。

而gMIR定义了丰富的通用操作码集合(Generic Opcode),这些操作码虽然与目标无关,但又是目标可以支持的操作。例如,标量整数加法的通用操作码是G_ADD,其用法如下

%2:_(s32) = G_ADD % 0: _(s32), %1:_(s32)

Legalizer pass

Legalizer pass 的作用是将目标平台不支持的通用机器指令的操作数类型,转换为目标机器指令的操作数类型,以及转换目标平台不支持的操作

Legalizer pass 与 SelectionDAG 的指令选择不同之处在于,SelectionDAG的指令选择将操作和类型的合法化分两步完成,而Legalizer pass 将其合并为一步

Legalizer pass 会自下而上地在 gMIR上迭代地检查指令合法性,当碰到非法指令时,Legalizer pass 会对其做转换,使当前指令在迭代过程中逐步变得合法

经过Legalizer pass 处理后,gMIR 中的指令操作仍以虚拟寄存器表示,因而此时的指令不是纯粹的MIR,而是混合机器指令

许多处理器硬件中都存在多种类型的寄存器文件,不同类型的寄存器文件在物理上是分开的。通常,一条机器指令只能访问某一类型的寄存器文件

若要在不同类型的寄存器文件之间执行数据操作,则必须先将所有数据复制到同一类型的寄存器文件中。寄存器组(register bank)是一组由目标定义的寄存器类

通过定义寄存器组可以寄存器分配器时,限制某些虚拟寄存器只能使用特定类型的寄存器文件。而且,划分寄存器组可减少高成本的跨寄存器组数据搬移操作

例如,AMDPGU 后端的寄存器按照其用途可分为SGPR(Scalar General Purpose Register) 和 VGPR(Vector General Purpose Register)

AMDGPU 后端为不同类型的寄存器定义(<llvm_root>/llvm/lib/Target/AMDGPU/AMDGPURegisterBanks.td)了不同的寄存器组

def SGPRRegBank : RegisterBank<" SGPR ",
[SReg_L016 , SReg_32 , SReg_64, SReg_96, SReg_128, SReg_160 , SReg_192 , SReg_256 , SReg_
512 , SReg_1024]>;

def VGPRRegBank : RegisterBank<" VGPR ",
[ VGPR_L016 , VGPR_HI16, VGPR_32, VReg_64 , VReg_96 , VReg_128 , VReg_160 , VReg_192, VReg_
256, VReg_512 , VReg_1024]>;

RegBankSelect pass

RegBankSelect pass 会计算最优寄存器组分配方案,并为每条混合机器指令的操作数分配寄存器组

当遇到跨寄存器组搬移数据时,RegBankSelect pass 还负责插入复制指令。RegisterBankInfo 类中保存了和寄存器组相关的信息,并提供了指令与寄存器组映射的相关接口

各LLVM后端可根据各自寄存器组定义和用法,定义自己的ReigsterBankInfo类,并实现copyCost()、getInstrMapping()等相关接口

例如,ADMGPU后端的 AMDGPURegisterBankInfo类定义如下:

class AMDGPUGenRegisterBankinfo : public RegisterBankinfo {
protected :
fdefine GET TARGET REGBANK CLASS
#include" AMDGPUGenRegisterBank.inc"
};

class AMDGPURegisterBankinfo final : public AMDGPUGenRegisterBankinfo (
public:
const GCNSubtarget &Subtarget;

...

unsigned copyCost (const RegisterBank &A, const RegisterBank &B, unsigned Size) const override;

...

const InstructionMapping &getInstrMapping (const MachineInstr &MI) const override;

经过RegBankSelect pass 处理后,指令的操作和操作数的类型对于目标都是合法的。这降低了InstructionSelect pass 将混合机器指令转换为目标机器指令的难度

但某些目标无关指令,如COPY指令,会在寄存器分配后才降级。各LLVM后端可根据目标相关的指令选择逻辑实现自己的InstructionSelector类。例如,AMDGPU后端的AMDGPUInstructionSelector类定义如下:

class AMDGPUinstructionSelector final : public InstructionSelector {
private:
    MachineRegis terinfo *MRI;
    cons GCNSubtarget *Subtarget ;
public :
    bool select (Machineinstr &I) override;

其中,最重要的函数是select(),其作用是将通用机器指令转换为完全的机器指令。AMDGPU后端的select()函数实现(<llvm_root>/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp) 如下:

bool AMDGPUinstructionSelector: :select (MachineInstr &I) {
    ...
    switch (I.getOpcode()) {
    case TargetOpcode : : G_ADD :
    case TargetOpcode : : G_SUB :
        if (selectlmpl (I, *Coveragelnfo))
            return true ;
        return selectG_ADD_SUB (I) ;
    default:
        return selectimpl(I , *Coverageinfo) ;
    return false ;

由上述代码可以看到,select()函数可以为某些通用机器指令进行定制化手动匹配,并由selectImpl()函数完成大部分通用机器指令选择

与SelectionDAG 指令选择手法中的GenDAGISel.inc文件类似,TableGen也会根据全局指令选择相关的.td文件生成GenGloballISel.inc 文件, 其中包含全局指令选择的匹配表(MatchTable0) 定义和 selectImpl()函数实现

在InstructionSelector.cpp 文件中可通过 #include “ GenGloballSel.inc” 将全局指令选择匹配表定义和selectImpl()函数实现嵌入到InstrunctionSelct pass 实现中。 由此可见,除了操作和类型的匹配方式外,全局指令选择方法与当前的SelectionDAG 指令选择方法非常相似

总结

虽然LLVM 已经实现全局指令选择,但若要在llc中启用全局指令选择,还需在llc命令中增加-global-isel选项

另一个和全局指令选择相关的llc命令行选项是-global-isel-abort. 当该选项值为0时,llc会在全局指令选择方法失败时,将SelectionDAG指令选择方法为回退方法。当该选项值为1时,llc会在全局指令选择方法失败时直接报错

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四川音盛佳云电子商务有限公司引领商业新潮流

在当今这个数字化飞速发展的时代&#xff0c;电商行业正以其独特的魅力吸引着越来越多的目光。而在众多电商企业中&#xff0c;四川音盛佳云电子商务有限公司凭借其专业、专注的抖音电商服务&#xff0c;逐渐崭露头角&#xff0c;成为行业的佼佼者。 四川音盛佳云电子商务有限…

AI智能盒子助力打造垃圾发电AI应用标杆!

垃圾焚烧发电作为一种新型的垃圾处理方式&#xff0c;能将其转化为电能&#xff0c;实现资源的再利用&#xff0c;成为实现节能环保的重要方式之一。为有效落实环境、安全、健康及社会责任管理体系&#xff0c;知名垃圾发电投资运营商光大环保能源致力于广泛利用科技&#xff0…

HarmonyOS开发知识 :扩展修饰器,实现节流、防抖、权限申请

引言 防重复点击&#xff0c;利用装饰器面向切面&#xff08;AOP&#xff09;的特性结合闭包&#xff0c;实现节流、防抖和封装权限申请。 节流 节流是忽略操作&#xff0c;在触发事件时&#xff0c;立即执行目标操作&#xff0c;如果在指定的时间区间内再次触发了事件&…

frp安装与配置

个人从网上杂乱的信息中学习、试错&#xff0c;记录自己成功配置的方法&#xff0c;避免遗忘 一、frp的下载 因目前无法下载&#xff0c;仅保留下载方法&#xff0c;版本号根据实际修改&#xff0c;目前使用0.54版&#xff0c;不同系统下载不同文件。 wget https://github.c…

Python Django Vue3 在线商城网站 在线商城后台管理 案例源码

源码地址获取 演示视频 Python DjangoVue3 在线商城网站&#xff0c;商城管理后台系统案例源码 附带运行教程&#xff0c;开发工具&#xff0c;系统运行演示 技术栈:Django Vue3 开发工具:Pycharm 后端构建工具:Pip 前端构建工具:WebPack 运行环境:Windows Python版本:3.11 Nod…

制作ubuntu18.04 cuda10.2+ROS1+opencv 4.5.4的 docker镜像

如果搭建的版本高可以参考&#xff1a; https://gitlab.com/nvidia/container-images/l4t-jetpack.git 如果版本比较低&#xff0c;按照下面的步骤进行操作&#xff1a; 使用的硬件平台为Xavier NX&#xff0c;系统环境如下图&#xff1a; 搭建docker环境需求跟实际环境一致如下…

【CVPR2024】面向StableDiffusion的编辑算法FreePromptEditing,提升图像编辑效果

近日&#xff0c;阿里云人工智能平台PAI与华南理工大学贾奎教授团队合作在深度学习顶级会议 CVPR2024 上发表 FPE(Free-Prompt-Editing) 算法&#xff0c;这是一种面向StableDiffusion的图像编辑算法。在这篇论文中&#xff0c;StableDiffusion可用于实现图像编辑的本质被挖掘&…

智慧之光照亮黑暗矿井:揭秘未来矿山的智能化革命

1. 煤矿行业背景概述 1.1 煤矿行业产能概述 截至2018年底&#xff0c;全国安全生产许可证等证照齐全的生产煤矿3373处&#xff0c;产能35.3亿吨/年。 已核准&#xff08;审批&#xff09;、开工建设煤矿1010处&#xff0c;产能10.3亿吨/年。 13个亿吨级煤炭能源基地&#xf…

Vulnhub——AI: WEB: 1

渗透复现 &#xff08;1&#xff09;目录扫描爆破出隐藏页面info.php和传参页面&#xff0c;泄露网站绝对路径并且存在SQL注入点 &#xff08;2&#xff09;已知网站绝对路径&#xff0c;存在SQL注入点&#xff0c;尝试OS-shell写入 &#xff08;3&#xff09;OS-shell写入后…

数据库:与红黑树不同的延迟序列

在内存里维护一个序列&#xff0c;可能第一个想到的就是红黑树。但是&#xff0c;红黑树算法复杂&#xff0c;这还不是主要的&#xff0c;主要的问题是&#xff1a;红黑树的空间利用率低。 红黑树的空间利用率 一个红黑树的节点&#xff0c;包括父节点指针、两个子节点指针、…

集团门户网站的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;论坛管理&#xff0c;集团文化管理&#xff0c;基础数据管理&#xff0c;公告通知管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;论坛&#xff0…

python小白兔做操 青少年编程电子学会python编程等级考试三级真题解析2021年12月

python小白兔做操 2021年12月 python编程等级考试级编程题 一、题目要求 1、编程实现 小白兔们每天早上都到草坪上做早操。做操前&#xff0c;首先要按照身高由矮到高排个队&#xff0c;下列代码实现了排队的功能。首先读取小白兔的只数&#xff0c;然后读取每只小白兔的身…

鸿蒙实现金刚区效果

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 所谓“金刚区"是位于APP功能入口的导航区域&#xff0c;通常以“图标文字”的宫格导航的形式出现。之所以叫“金刚区”&#xff0c;是因为该区域会随着业务目标的改变&#xff0c;展示不同的功能图标&#xff…

Android OTA 升级基础知识详解+源码分析

前言&#xff1a; 本文仅仅对OTA升级的几种方式的概念和运用进行总结&#xff0c;仅在使用层面对其解释。需要更详细的内容我推荐大神做的全网最详细的讲解&#xff1a; https://blog.csdn.net/guyongqiangx/article/details/129019303?spm1001.2014.3001.5502 三种升级方式…

ubuntu的home内存不足的解决办法(win和ubuntu双系统)

这种解决办法前提是windows和ubuntu双系统 首先在windows系统上创建一个空的硬盘分区 然后在ubuntu系统上把这个空的硬盘放在主目录里 然后可以把东西存在这个文件夹中 如下图&#xff0c;但实际主目录的内存没有变&#xff0c;以后存东西就在这个文件夹里面就好了 具体操作…

【Gradio】Chatbots 如何用 Gradio 创建聊天机器人

Creating A Chatbot Fast 简介 聊天机器人是大型语言模型的一个流行应用。使用 gradio &#xff0c;您可以轻松构建您的聊天机器人模型的演示&#xff0c;并与您的用户分享&#xff0c;或者使用直观的聊天机器人用户界面自己尝试。 本教程使用 gr.ChatInterface() &#xff0c;…

「51媒体」总台,地方卫视媒体邀约新闻报道采访怎么做?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 总台对选题要求非常严格&#xff0c;在想做总台新闻报道之前&#xff0c;让我们先来了解下总台对新闻选题有哪些要求&#xff1a; 一、新闻价值 社会意义&#xff1a;新闻报道的首要任务…

【电源开发】输出电压纹波

输出电压纹波是什么 电压纹波指的是直流输出电压中一个交流部分 减小输出电压纹波的方法 调整输出端的电容值 提高开关电源的工作频率

R语言做图

目录 1. 图形参数 2. 低级图形 3. 部分高级图形 参考 1. 图形参数 图形参数用于设置图形中各种属性。 有些参数直接用在绘图函数内&#xff0c;如plot函数可以用 pch&#xff08;点样式&#xff09;、col&#xff08;颜色&#xff09;、cex&#xff08;文字符号大小倍数&…

Android SurfaceFlinger——概述(一)

一、基础介绍 SurfaceFlinger 是 Android 系统中的一个关键组件&#xff0c;负责管理屏幕显示的合成和渲染。 服务角色&#xff1a;SurfaceFlinger 作为一个系统服务独立运行&#xff0c;它不依赖于任何应用程序进程&#xff0c;而是由系统启动并持续运行。窗口管理&#xff1a…