线性扫描寄存器分配算法介绍

线性扫描寄存器分配

文章目录

  • 线性扫描寄存器分配
    • 1. 算法介绍
    • 2. 相关概念
    • 3. 算法的实现
      • 3.1 伪代码
      • 3.2 图示
    • 参考文献

  • 论文地址:

Linear Scan Register Allocation

​ 我们描述了一种称为线性扫描的快速全局寄存器分配的新算法。该算法不基于图形着色,而是在变量生存范围的单个线性时间扫描中将寄存器分配给变量。线性扫描算法比基于图形着色的算法要快得多,并且易于实现,并且生成的代码几乎与使用基于图形着色的更复杂且耗时的寄存器分配器获得的代码一样高效。该算法适用于关注编译时间的应用程序,例如动态编译系统、“即时”编译器和交互式开发环境。

不使用图着色算法的根本原因是它要先构造好完整的干涉图,才能在图上着色,而干涉图的构造代价太过高昂。应该说,图着色过程中的大部分开销都集中于干涉图的构造阶段。因此,虽然图着色生成的代码质量很高,但是对于讲究编译效率的现代编译器来说,其时间成本是不可忽视的。对于对编译时间更加敏感的 JIT 编译器来说,则更是如此。除此之外,在实际的编译工作中,人们发现了另外一个问题。由于在目前所有的硬件架构中,寄存器的数目都是有限的,故对于大型程序来说,寄存器不够用可以说是必然存在的情况。换句话说,大型程序一定会产生大量溢出。问题就出现在这里,因为图着色算法把重点放在解决“如何把所有的程序变量尽可能地分配到寄存器中”,如果程序一定会大量产生溢出,那么,关注“如何高效地溢出”比关注“如何尽量减少溢出”更有价值。

spill:溢出,是指目前的寄存器不够使用,该部分数据需要借助sram或者堆栈区域的空间进行缓存协调的行为。

寄存器的数量是有限的,因此当程序中使用了过多的变量或产生了大量的临时计算结果时,编译器可能会出现寄存器不足的情况,导致寄存器溢出。这可能会导致编译器将某些变量或数据存储在内存中,而不是寄存器中,从而降低了程序的执行效率。

1. 算法介绍

线性扫描寄存器分配算法是一种用于在编译器中分配寄存器的算法,旨在将程序中的变量映射到计算机的寄存器,以提高程序的执行效率。该算法通常用于编译器的代码生成阶段,用于生成目标代码。

线性扫描寄存器分配算法的基本思想是,通过一次线性扫描来分配寄存器,从而在程序的不同位置为变量分配寄存器。该算法不需要进行复杂的数据流分析,因此相对较快且简单。以下是线性扫描寄存器分配算法的主要步骤:

  1. 构建活跃变量区间(Live Range):首先,通过数据流分析计算每个变量的活跃区间,即变量在程序中被使用的区间。活跃区间通常是变量在程序中的生命周期。
  2. 排序活跃变量区间:将所有活跃变量区间按照其结束位置从小到大进行排序。
  3. 遍历活跃变量区间:从排好序的活跃变量区间列表中,按顺序遍历每个区间。在遍历过程中,为每个区间分配一个可用的寄存器,并在需要时将之前分配的寄存器释放。
  4. 确定溢出:如果某个区间没有足够的可用寄存器,即产生溢出,算法会尝试将某个寄存器的值移出到内存中,以腾出空间来分配给新的变量。

线性扫描寄存器分配算法的优点在于简单易实现,适用于中等规模的代码生成。然而,它可能不如其他更复杂的寄存器分配算法(如图着色法)在某些情况下能够达到更高的性能。不同的编译器可能会使用不同的寄存器分配算法,以根据特定的需求和目标平台进行优化。

2. 相关概念

live interval:生命间隔
live range:生命周期

interference:相交(conflict)

active list:已经分配物理内存的节点集合

3. 算法的实现

3.1 伪代码

image-20230814221420865

3.2 图示

image-20230814221317558

image-20230814221239700

参考文献

[1] Register Allocation in LLVM 3.0
[2] Hacker News - Register Allocation
[3] Linear Scan Register Allocation
[4] Register Allocation
[5] 博客圆-线性扫描寄存器分配

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

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

相关文章

echarts3d柱状图

//画立方体三个面 const CubeLeft echarts.graphic.extendShape({shape: {x: 0,y: 0,width: 9.5, //柱状图宽zWidth: 4, //阴影折角宽zHeight: 3, //阴影折角高},buildPath: function (ctx, shape) {const api shape.api;const xAxisPoint api.coord([shape.xValue, 0]);con…

陪诊小程序开发|陪诊陪护小程序让看病不再难

陪诊小程序通过与医疗机构的合作,整合了医疗资源,让用户能够更加方便地获得专业医疗服务。用户不再需要面对繁琐的挂号排队,只需通过小程序预约服务,便能够享受到合适的医疗资源。这使得用户的就医过程变得简单高效,并…

【EI/SCOPUS检索】第三届计算机视觉、应用与算法国际学术会议(CVAA 2023)

第三届计算机视觉、应用与算法国际学术会议(CVAA 2023) The 3rd International Conference on Computer Vision, Application and Algorithm 2023年第三届计算机视觉、应用与算法国际学术会议(CVAA 2023)主要围绕计算机视觉、计算机应用、计…

PPT颜色又丑又乱怎么办?

一、设计一套PPT时,可以从这5个方面进行设计 二、PPT颜色 (一)、PPT常用颜色分类 一个ppt需要主色、辅助色、字体色、背景色即可。 (二)、搭建PPT色彩系统 设计ppt时,根据如下几个步骤,依次选…

Arduino驱动红外二氧化碳传感器(气体传感器篇)

目录 1、传感器特性 2、驱动程序 红外激光传感器是将成熟的红外吸收气体检测技术与精密光路设计、精良电路设计紧密结合而制作出的高性能传感器,具有高灵敏度、高分辨率、低功耗,响应快、抗水汽干扰、不中毒、稳定性高、使用寿命长等特点。本篇博文使用Arduino驱动红外二氧…

Android学习之路(2) 设置视图

一、设置视图宽高 ​ 在Android开发中,可以使用LayoutParams类来设置视图(View)的宽度和高度。LayoutParams是一个用于布局的参数类,用于指定视图在父容器中的位置和大小。 ​ 下面是设置视图宽度和高度的示例代码: …

Win10基于 Anaconda 配置 Deeplabcut 环境

最近需要做动物行为学分析的相关研究,同时由于合作者只有 Windows 系统,于是只好在 Windows 中配置环境。说实话还真的是挺折磨的。。。 一、下载 Anaconda 可以通过清华源下载 Anaconda:https://mirrors.tuna.tsinghua.edu.cn/anaconda/ar…

奥威BI数据可视化工具:报表就是平台,随时自助分析

别的数据可视化工具,报表就只是报表,而奥威BI数据可视化工具,一张报表就约等于一个平台,可随时展开多维动态自助分析,按需分析,立得数据信息。 奥威BI是一款多维立体分析数据的数据可视化工具。它可以帮助…

电脑xinput1_3.dll丢失的解决方法?哪个解决方法更简单

最近在打开软件或者游戏的时候,电脑提示xinput1_3.dll文件丢失的错误。这个问题导致我无法运行某些游戏和应用程序。通过一番尝试和研究,我找到了一些修复xinput1_3.dll文件丢失的方法,并在此分享给大家。 首先,我了解到xinput1_3…

NSI45030AT1G LED驱动器方案为汽车外部及内部照明恒流稳流器(CCR)方案

关于线性恒流调节器(CCR):是一种用于控制电流的稳定输出。它通常由一个功率晶体管和一个参考电流源组成。CCR的工作原理是通过不断调节功率晶体管的导通时间来维持输出电流的恒定。当输出电流超过设定值时,CCR会减少功率晶体管的导…

红日ATT&CK VulnStack靶场(三)

网络拓扑 web阶段 1.扫描DMZ机器端口 2.进行ssh和3306爆破无果后访问web服务 3.已知目标是Joomla,扫描目录 4.有用的目录分别为1.php 5.configuration.php~中泄露了数据库密码 6.administrator为后台登录地址 7.直接连接mysql 8.找到管理员表,密码加密了…

提高学生学习效率的模拟考试系统

在如今竞争激烈的社会环境下,提高学生的学习效率显得尤为重要。为了帮助学生评估自己的学习水平并提供有针对性的学习建议,开发一款模拟考试系统是非常必要的。 一、学生信息录入 模拟考试系统首先需要学生信息录入功能。学生可以通过一个简单的表单填…

Unity游戏源码分享-中国象棋Unity5.6版本

Unity游戏源码分享-中国象棋Unity5.6版本 项目地址: https://download.csdn.net/download/Highning0007/88215699

【c语言】指针进阶(超详细)

文章目录 ✈ 指向函数指针数组的指针📌指向函数指针数组的指针的定义📌指向函数指针数组的数组指针的使用 ✈回调函数📌 回调函数的定义📌 回调函数的使用 ✈qsort函数📌 qsort函数的作用📌qsort函数的定义…

【佳佳怪文献分享】安全人机交互的学习责任分配与自动驾驶应用

标题:Learning Responsibility Allocations for Safe Human-Robot Interaction with Applications to Autonomous Driving 作者:Ryan K. Cosner, Yuxiao Chen, Karen Leung, and Marco Pavone 来源:2023 IEEE International Conference on …

【QT】 Word模板编辑、转PDF格式

很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享基于QT进行Word模板编辑以及Word转PDF的技术,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 …

机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?

一、引言 在实际应用中,特征选择作为机器学习和数据挖掘领域的重要环节,对于提高模型性能和减少计算开销具有关键影响。特征选择是从原始特征集中选择最相关和最具区分力的特征子集,以提高模型的泛化能力和可解释性。 特征选择在实践中具有以…

计算机竞赛 python opencv 深度学习 指纹识别算法实现

1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python opencv 深度学习 指纹识别算法实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:4分创新点:4分 该项目较为新颖…

代码质量检查工具SonarQube

Devops流水线之SonarQube 文章目录 Devops流水线之SonarQube1. 软件功能介绍及用途2. 软件环境搭建与使用2.1 使用方法2.2 SonarQube相关属性说明2.3 Sonar配置文件内容说明 3. 使用环节4. 检查方法 1. 软件功能介绍及用途 SonarQube是一个用于代码质量管理的开源平台&#xf…

Python Opencv实践 - 图像放射变换

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) rows,cols img.shape[:2] print(img.shape[:2])#使用getAffineTransform来获得仿射变换的矩阵M #cv.getAffineTransform(…