寄存器分配

概述

寄存器位于CPU 或 GPU内部的少量高速存储器,通常用于保存机器指令的操作数

由于其价格昂贵,导致其数量有限,又由于存储速度快,使其不可或缺。因此,寄存器是计算机体系结构中的关键资源之一。在计算复杂表达式的过程中产生的中间结果都保存在寄存器中,更复杂的编译器会将经常使用的变量也保存在寄存器中,以避免反复存取

如果是优化的编译器,还会将公共子表达式消除或者将循环不变量移动以后的重用值保存在寄存器中

开发者在编写高级语言程序时会用到变量定义,如 int x, string y 等。大部分程序不关心变量在计算机体系结构中用什么形式表示。从开发者的角度看,变量中的数据通常被认为保存在内存中,可以通过文件I/O接口在硬盘和内存之间转移,而编译器复杂在内存和寄存器之间转移数据,以便CPU 和 GPU 可以操作寄存器中的数据。从存储结构的角色,硬盘、内存、缓存(cache) 和寄存器特点不同

在这里插入图片描述

在编译过程中的代码生成阶段,程序中的变量会被编译器替换为寄存器

高级语言程序中使用的变量数量几乎无限,但CPU 或 GPU 中的寄存器数量是有限的。寄存器分配作为编译后端流程的一个阶段要解决这对矛盾,控制寄存器的分配和使用

因此,寄存器分配的目的是将程序中的数量无限的虚拟寄存器映射到数量有限的物理寄存器。不同的目标设备有不同数量的物理寄存器

如果物理寄存器的数量不足以满足虚拟寄存器的需求,有些虚拟寄存器显然就只能映射到内存。这些虚拟寄存器称为溢出虚拟寄存器。好的寄存器分配算法应该努力在物理寄存器中分配尽可能多的变量,因为物理寄存器能提供更快的访问时间

寄存器分配原理

寄存器分配是编译器优化中最重要的问题之一,好的寄存器分配算法可以显著提高程序性能,因此,寄存器分配也是编译器理论研究中一个非常活跃的领域

寄存器分配可以工作在表达式、基本块、函数(也称全局)或整个程序等不同级别。历史上出现过多种寄存器分配算法,如图着色算法、线性扫描算法、整数线性规划算法、PBQP 算法、Multi-Flow Commodities 算法、基于SSA的寄存器分配

LLVM 没有支持上述全局寄存器分配算法,而是实现了基本寄存器分配(Basic Register Allocator)、快速寄存器分配(Fast Register Allocator)、PBQP 寄存器分配器(PBQP Register Allocator) 和 贪厌寄存器分配器(Greedy Register Allocator) 四种寄存器分配器

和指令选择、指令调度一样,寄存器分配是编译器后端的一个重要组成部分。在后端流程中,寄存器分配在机器指令调度(MI Scheduling) 之后执行

寄存器分配的基本目的是通过将程序变量尽可能地分配给物理寄存器,从而提供程序执行速度。以图着色算法为例,如果寄存器分配问题被抽象成图着色问题,那么图中的每个节点代表某个变量的活跃范围(live range)

活跃范围定义是从变量第一次被赋值(或称定值)开始,到该变量下一次被赋值前的最后一次被使用为止。两个节点之间的边表示这两个变量因为活跃范围重叠,导致互相冲突或干扰。一般说来,如果两个变量在函数的某一点是同时活跃(live) 的,那么这两个变量就相互冲突,不能占有同一个寄存器。假设有如下代码:

a = c - d
e = a + b
f = e + 3

在表达式 e = a - b 之后,变量a不再使用。同样,在表达式 f = e + 3之后,变量 e 也不再使用

因此,a、e、f 可以被分配给同一个寄存器,而寄存器中保存的值不会产生冲突。因此,可以只使用4个寄存器s1、s2、s3、s4 替换代码中的6个变量(寄存器使用还可以进一步简化)

s1 = s2 - s3
s1 = s1 - s4
s1 = s1 + 3

为了将寄存器分配给尽可能多的变量又不引起冲突,需要根据代码逻辑生成控制流图,并执行活跃性分析(liveness analysis) 得到寄存器干扰图

寄存器分配器基于寄存器干扰图执行寄存器分配算法,将寄存器分配给变量

控制流图是以基本块为节点的有向图,控制流图中每一节点代码一个程序基本块,节点之间的边代表基本块之间的控制转移。因此,控制流图中的每一节点代表一个程序基本块,节点之间的边代表基本块之间的控制转移

因此,控制流图可表示为 G = (N, E), N 是节点集合,每个节点对应程序中的一个基本块;E是边的集合。如果程序逻辑从基本块U的出口转向基本块V,则从U到V有一条有向边,表示从节点U到节点V存在一条可执行路径

这时,称U为V的前驱节点,V为U的后继节点,表示在执行完节点U中的指令后,可顺序执行节点V中的指令

L1: a = b + c
    d -= a
    e = d + f
    if (e > 0)
        f = 2 * 3
    else {
        b = d + e
        e = e - 1
    }
    b = f + c
    goto L1
        

在这里插入图片描述

调用寄存器分配算法为上述代码中的变量分配寄存器,首先要做的是活跃性分析

活跃性分析是指确定哪些变量在程序点保持活跃。结合控制流图,就是判断变量x在程序点p上的值是否会在流图中从点p出发的某条路径中使用

如果是,则x在p上活跃;否则,x在p上不活跃。活跃性分析是一个后向数据流分析问题,因为当前变量x是否在未来的某个地方被用到,只能通过后继节点的信息获知

活跃性分析的重要用途之一是为基本块进行寄存器分配,某个值被计算保存到一个寄存器后,很有可能在基本块中被使用。如果该值在基本块中不活跃,就不必保存这个值

活跃性分析结果显示在特定程序点哪些变量是活跃的,以及哪些寄存器分配时会互相冲突,并可以由此得知寄存器干扰图(Register Interference Graph, RIG)

如果在程序点p存在两个变量a和b同时活跃,那么就变量a和b在程序点p互相干扰,寄存器干扰图中的节点a、b之间有边相连,这时,变量a和b应分配同一寄存器

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

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

相关文章

Python爬虫速成之路(2):爬天气情况

hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页:绝命Coding-CSDN博客 &a…

常见问题记录(持续更新)

备注: 在7月10日记录之前遇到的问题及解决方法: 一:常见的访问问题: 403 Forbidden:(未有请求权限) 表示服务器理解请求但是拒绝执行它。这通常是由于服务器上的文件或资源没有正确的读、写或执行权限&…

IDEA启动Web项目总是提示端口占用

文章目录 IDEA启动Web项目总是提示端口占用一、前言1.场景2.环境 二、正文1.场景一:真端口占用2. 场景二:假端口占用 IDEA启动Web项目总是提示端口占用 一、前言 1.场景 IDEA启动Web项目总是提示端口占用: 确实是端口被占用,比如:没有正常…

复制vmware虚拟机文件并改名(文件名使用python替换)得到一台新的虚拟机

文章目录 需求实验复制文件夹并重命名使用python将所有文件名“WinSer2022”字符替换成“wingetmac”修改虚拟机配置文件(.vmx)打开新的虚拟机成功 需求 将已有的Winser2022虚拟机复制成wingetmac并开机 实验 复制文件夹并重命名 将"WinSer2022…

使用机器学习 最近邻算法(Nearest Neighbors)进行点云分析 (scikit-learn Open3D numpy)

使用 NearestNeighbors 进行点云分析 在数据分析和机器学习领域,最近邻算法(Nearest Neighbors)是一种常用的非参数方法。它广泛应用于分类、回归和聚类分析等任务。下面将介绍如何使用 scikit-learn 库中的 NearestNeighbors 类来进行点云数…

NSSCTF_RE(一)暑期

[SWPUCTF 2021 新生赛]简单的逻辑 nss上附件都不对 没看明白怎么玩的 dnspy分析有三个 AchievePoint , game.Player.Bet - 22m; for (int i 0; i < Program.memory.Length; i) { byte[] array Program.memory; int num i; array[num] ^ 34; } Environment.SetEnvironment…

全自主巡航无人机项目思路:STM32/PX4 + ROS + AI 实现从传感融合到智能规划的端到端解决方案

1. 项目概述 本项目旨在设计并实现一款高度自主的自动巡航无人机系统。该系统能够按照预设路径自主飞行&#xff0c;完成各种巡航任务&#xff0c;如电力巡线、森林防火、边境巡逻和灾害监测等。 1.1 系统特点 基于STM32F4和PX4的高性能嵌入式飞控系统多传感器融合技术实现精…

机器学习(五) -- 监督学习(6) --逻辑回归

系列文章目录及链接 上篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;5&#xff09; -- 线性回归2 下篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;7&#xff09; --SVM1 前言 tips&#xff1a;标题前有“***”的内…

GuLi商城-商品服务-API-品牌管理-JSR303分组校验

注解:@Validated 实体类: package com.nanjing.gulimall.product.entity;import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.nanjing.common.valid.ListValue; import com.nanjing.common.valid.Updat…

[Vulnhub] Stapler wp-videos+ftp+smb+bash_history权限提升+SUID权限提升+Kernel权限提升

信息收集 IP AddressOpening Ports192.168.8.106TCP:21,22,53,80,123,137,138,139,666,3306, Using Nmap for scanning: $ nmap -p- 192.168.8.106 --min-rate 1000 -sC -sV The results are as follows: PORT STATE SERVICE VERSION 20/tcp closed ftp-data…

交换机和路由器的工作流程

1、交换机工作流程&#xff1a; 将接口中的电流识别为二进制&#xff0c;并转换成数据帧&#xff0c;交换机会记录学习该数据帧的源MAC地址&#xff0c;并将其端口关联起来记录在MAC地址表中。然后查看MAC地址表来查找目标MAC地址&#xff0c;会有一下一些情况&#xff1a; MA…

springboot新闻发布及管理系统-计算机毕业设计源码21929

新闻发布及管理系统的设计与实现 摘 要 新闻发布及管理系统的设计与实现&#xff0c;是当下信息社会发展的重要一环。随着互联网的普及和新闻媒体的数字化转型&#xff0c;一个高效、稳定且功能全面的新闻发布与管理平台显得尤为重要。SpringBoot框架以其简洁、快速和易于集成的…

T113-i系统启动速度优化方案

背景: 硬件:T113-i + emmc 软件:uboot2018 + linux5.4 + QT应用 分支:longan 问题: 全志T113-i的官方系统软件编译出的固件,开机启动时间10多秒,启动时间太长,远远超过行业内linux系统的开机速度,需要进一步优化。 T113-i 优化后启动速度实测数据 启动阶段启动时间(…

Python爬虫速成之路(3):下载图片

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

企业网络实验dhcp-snooping、ip source check,防非法dhcp服务器、自动获取ip(虚拟机充当DHCP服务器)、禁手动修改IP

文章目录 需求相关配置互通性配置配置vmware虚拟机&#xff08;dhcp&#xff09;分配IP服务配置dhcp relay&#xff08;dhcp中继&#xff09;配置dhcp-snooping&#xff08;防非法dhcp服务器&#xff09;配置ip source check&#xff08;禁手动修改IP&#xff09; DHCP中继&…

C语言之指针的奥秘(二)

一、数组名的理解 int arr[10]{1,2,3,4,5,6,7,8,9,10}; int *p&arr[0]; 这里使用 &arr[0] 的⽅式拿到了数组第⼀个元素的地址&#xff0c;但是其实数组名本来就是地址&#xff0c;而且是数组首元素的地址。如下&#xff1a; 我们发现数组名和数组⾸元素的地址打印出…

【Python学习笔记】Optuna + Transformer B站视频实践

【Python学习笔记】Optuna Transformer 实践 背景前摇&#xff08;省流可不看&#xff09;&#xff1a; 之前以泰坦尼克号数据集为案例&#xff0c;学习了Optuna的基本操作&#xff0c;为了进一步巩固知识和便于包装简历&#xff0c;决定找个唬人一点的项目练练手。 ————…

Linux:Linux网络总结(附下载链接)

文章目录 下载链接网络问题综合问题访问一个网页的全过程&#xff1f;WebSocket HTTPHTTP基本概念GET与POSTHTTP特性HTTP缓存技术HTTP的演变HTTP1.1 优化 HTTPSHTTP与HTTPS有哪些区别&#xff1f;HTTPS解决了HTTP的哪些问题&#xff1f;HTTPS如何解决的&#xff1f;HTTPS是如何…

【数据结构】手写堆 HEAP

heap【堆】掌握 手写上浮、下沉、建堆函数 对一组数进行堆排序 直接使用接口函数heapq 什么是堆&#xff1f;&#xff1f;&#xff1f;堆是一个二叉树。也就是有两个叉。下面是一个大根堆&#xff1a; 大根堆的每一个根节点比他的子节点都大 有大根堆就有小根堆&#xff1…

数据结构(4.1)——串的存储结构

串的顺序存储 串&#xff08;String&#xff09;的顺序存储是指使用一段连续的存储单元来存储字符串中的字符。 计算串的长度 静态存储(定长顺序存储) #define MAXLEN 255//预定义最大串为255typedef struct {char ch[MAXLEN];//每个分量存储一个字符int length;//串的实际长…