一种cpu中优化寄存器访问的方法

文档序号:1771504 发布日期:2019-12-03 浏览:6次 >En<

阅读说明:本技术 一种cpu中优化寄存器访问的方法 (Optimize the method for register access in a kind of CPU ) 是由 李晓辉 胡胜发 于 2019-08-01 设计创作,主要内容包括:本发明公开了一种CPU中优化寄存器访问的方法,包括:根据预设的映射策略将数据寄存器和内存栈建立映射关系;根据所述数据寄存器和内存栈的映射关系,将栈存取操作指令进行精简,并根据精简后的操作指令进行数据访问操作。在建立数据寄存器与内存栈的映射关系后,可假定所有的临时变量都在栈上,系统直接访问寄存器即可访问内存栈上这些变量。通过实施本发明,能够在大幅增加数据寄存器的同时,精简了大量的栈存取代码,从而有效降低了编译的复杂度与难度,有效提升了CPU性能。(The invention discloses a kind of methods for optimizing register access in CPU, comprising: data register and memory stack are established mapping relations according to preset mapping policy;According to the mapping relations of the data register and memory stack, the instruction of stack accessing operation is simplified, and data access operation is carried out according to the operational order after simplifying.After establishing the mapping relations of data register and memory stack, it may be assumed that for all temporary variables all on stack, system, which directly accesses register, may have access to these variables on memory stack.By applying the present invention, can simplify a large amount of stack access code while data register is significantly increased to effectively reduce the complexity and difficulty of compiling and effectively improve cpu performance.)

一种CPU中优化寄存器访问的方法

技术领域

本发明涉及编译优化技术领域,尤其是涉及一种CPU中优化寄存器访问的方法。

背景技术

寄存器是CPU的核心组成部分,它是高速存储部件,用来暂存指令、数据和地址。寄存器的存在大大加快了计算及内存访问效率,因此理论上寄存器的数量越多越好。现有的X86架构上寄存器只有几个,ARM则有十多个,RISC-V则更多,有三十多个。但是,以目前技术状况,想要进一步增加寄存器的数量非常困难,因为寄存器过多会增加指令复杂度,加大了编译器的编译难度,这样会由于增加代码量而导致降低系统执行效率。因此,现有技术无法通过增加寄存器数量来有效提高系统运行效率。

发明内容

本发明实施例所要解决的技术问题在于,提供了一种CPU中优化寄存器访问的方法,在大幅增加寄存器数量时能够避免由于增加寄存器而引发的缺陷,从而能够通过增加寄存器数量来有效提高系统运行效率。

为了解决上述技术问题,本发明实施例提供了一种CPU中优化寄存器访问的方法,包括:

根据预设的映射策略将数据寄存器和内存栈建立映射关系;

根据所述数据寄存器和内存栈的映射关系,将栈存取操作指令进行精简,并根据精简后的操作指令进行数据访问操作。

进一步地,所述CPU中优化寄存器访问的方法还包括:

根据所述预设的映射策略对栈指针进行设置,以使系统在栈指针移动时对内存栈和数据寄存器进行同步操作。

进一步地,所述CPU中优化寄存器访问的方法还包括:

根据所述预设的映射策略对编译器进行修改,以对寄存器分配方案、变量存取方式以及汇编生成形式进行调整。

进一步地,所述根据所述数据寄存器和内存栈的映射关系,将栈存取操作指令进行精简,并根据精简后的操作指令进行数据访问操作,包括:

响应变量的栈存取需求,根据所述数据寄存器和内存栈的映射关系,对变量的出入栈指令进行精简,并根据精简后的操作指令对变量进行数据访问操作。

进一步地,所述根据所述数据寄存器和内存栈的映射关系,将栈存取操作指令进行精简,并根据精简后的操作指令进行数据访问操作,还包括:

响应子函数的调用请求,根据所述数据寄存器和内存栈的映射关系,对子函数的出入栈指令进行精简,并根据精简后的操作指令对变量进行数据访问操作。

进一步地,所述根据所述数据寄存器和内存栈的映射关系,将栈存取操作指令进行精简,并根据精简后的操作指令进行数据访问操作,还包括:

响应中断函数的访问请求,根据所述数据寄存器和内存栈的映射关系,对中断函数的出入栈指令进行精简,并根据精简后的操作指令对中断函数进行数据访问操作。

进一步地,所述根据所述数据寄存器和内存栈的映射关系,将栈存取操作指令进行精简,并根据精简后的操作指令进行数据访问操作,还包括:

响应多线程切换请求,根据所述数据寄存器和内存栈的映射关系,对线程切换的出入栈指令进行精简,并根据精简后的操作指令进行线程切换操作。

与现有技术相比,本发明具有如下有益效果:

本发明提供了一种CPU中优化寄存器访问的方法,包括:根据预设的映射策略将数据寄存器和内存栈建立映射关系;根据所述数据寄存器和内存栈的映射关系,将栈存取操作指令进行精简,并根据精简后的操作指令进行数据访问操作。在建立数据寄存器与内存栈的映射关系后,可假定所有的临时变量都在栈上,系统直接访问寄存器即可访问内存栈上这些变量。通过实施本发明,能够在大幅增加数据寄存器的同时,精简了大量的栈存取代码,从而有效降低了编译的复杂度与难度,有效提升了CPU性能。

附图说明

图1是本发明一实施例提供的CPU中优化寄存器访问的方法的流程示意图;

图2是本发明一实施例提供的将一定数量的寄存器映射到内存栈的应用示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

请参见图1,本发明实施例提供了一种CPU中优化寄存器访问的方法,包括:

步骤S1、根据预设的映射策略将数据寄存器和内存栈建立映射关系;

步骤S2、根据所述数据寄存器和内存栈的映射关系,将栈存取操作指令进行精简,并根据精简后的操作指令进行数据访问操作。

与现有技术相比,本发明在建立数据寄存器与内存栈的映射关系后,可假定所有的临时变量都在栈上,系统直接访问寄存器即可访问内存栈上这些变量。通过实施本发明,能够在大幅增加数据寄存器的同时,精简了大量的栈存取代码,从而有效降低了编译的复杂度与难度,有效提升了CPU性能。

请参见图2,本发明的要点在于,映射数据寄存器与内存栈。可以理解的是,数据寄存器指CPU中用于数据运算的寄存器,内存栈是指分配给程序的一段内存。操作系统会给一个运行的程序(或线程)分配一段叫堆栈的内存,(在小端模式中)这段内存的底部是堆,上部为栈。栈主要用于暂存变量,它向下生长,也即当调用子程序或需要更多的临时变量时,编译器生成的指令,控制栈指针(SP寄存器)下移,退出子程序时SP上移。本发明就是将一定数量的寄存器映射到内存栈,比如SP指向R0。本图例中最大有256个数据寄存器,而实际应用中可根据具体需求进行增加或减少。这些数据寄存器就像是栈的Cache,当然中间还可以存在真正的数据Cache。在访问数据寄存器时,等效于操作内存栈,这些工作由CPU等硬件自动完成。

可以理解的是,机器语言是执行效率最高的语言,可编译为机器语言的编译器常为C/C++编译器。C语言中,每个子程序除了函数变量外,还有动态变量等临时变量。现有技术中,当变量极少时,可直接使用寄存器表示,而变量较多时,就将某些变量暂存在栈上,这就是栈存取。事实上,大量的子程序调用、函数的复杂性、中断、多任务切换等都会造成大量栈存取。由于栈存取需要特定的指令,因此,出现大量栈存取时便会导致需要执行的代码量变大、执行耗时。本发明在建立数据寄存器与内存栈的映射关系后,编译器可假定所有的临时变量都在栈上,直接访问寄存器就可访问栈上的这些变量了,故可精简大量的栈存取代码,有效提升系统的运行性能。

在本发明实施例中,进一步地,所述CPU中优化寄存器访问的方法还包括:

根据所述预设的映射策略对栈指针进行设置,以使系统在栈指针移动时对内存栈和数据寄存器进行同步操作。

在本发明实施例中,进一步地,所述根据所述数据寄存器和内存栈的映射关系,将栈存取操作指令进行精简,并根据精简后的操作指令进行数据访问操作,包括:

响应变量的栈存取需求,根据所述数据寄存器和内存栈的映射关系,对变量的出入栈指令进行精简,并根据精简后的操作指令对变量进行数据访问操作。

可以理解的是,过多的变量、函数调用、函数内代码分块会导致临时变量入栈或出栈。对于这些出入栈操作,编译器将生成相关指令处理,现有技术中,出入栈指令占较大比例,本发明通过建立数据寄存器和内存栈的映射关系,可大幅提高寄存器数量,在访问寄存器时就是相当于访问内存栈,从而大幅减少出入栈指令,有效提升系统运行效率。

对于变量的出入栈,现有技术与本发明的不同在于:

a)入栈:常见子函数或代码块进入时,现有技术将生成入栈指令,即将要保存的变量从寄存器写入内存栈,同时栈指针下移。本发明仅将栈指针简单地下移。栈指针下移后,R0指向了新地址,故它代表新的变量。假如栈指针下移N,则原来的R0,现在用RN表示。栈指针下移会导致R255等顶部寄存器同步入内存中,但这是硬件自动操作,性能最优,编译器无需考虑,也无需占用CPU指令周期。因此本发明的入栈操作明显优于现有技术。

b)出栈:常见子函数或代码块退出,现有技术采用出栈指令,将已保存的变量从栈恢复到寄存器,同时栈指针也会上移。本发明仅将栈指针简单地上移。栈指针上移需要将内存同步入顶部寄存器中,但这是硬件自动操作。因此本发明的出栈操作也明显优于现有技术。

在本发明实施例中,进一步地,所述根据所述数据寄存器和内存栈的映射关系,将栈存取操作指令进行精简,并根据精简后的操作指令进行数据访问操作,还包括:

响应子函数的调用请求,根据所述数据寄存器和内存栈的映射关系,对子函数的出入栈指令进行精简,并根据精简后的操作指令对变量进行数据访问操作。

需要说明的是,在调用子函数时,将参数及函数返回地址入栈。并计算好返回值栈占用大小。子函数返回时,将返回值写入栈,然后返回调用程序。虽然对于子函数的调用和返回,本发明与现在技术类似,但由于出入栈的优化,子函数的调用与返回,性能综合起来仍是优于现在技术的。

在本发明实施例中,进一步地,所述根据所述数据寄存器和内存栈的映射关系,将栈存取操作指令进行精简,并根据精简后的操作指令进行数据访问操作,还包括:

响应中断函数的访问请求,根据所述数据寄存器和内存栈的映射关系,对中断函数的出入栈指令进行精简,并根据精简后的操作指令对中断函数进行数据访问操作。

需要说明的是,对于中断函数进入,现有技术需要将所有数据寄存器入栈,然后设置栈指针为中断栈顶。本发明仅需设置栈指针就可以了,设置过程中硬件自动将原数据寄存器同步入当前函数的栈内存。本发明也可让中断不切换栈,让中断函数直接在当前栈上运行,性能更优。

对于中断函数退出,现有技术需要恢复所有数据寄存器即出栈,然后返回中断点。本发明仅需恢复栈指针就行了,设置过程中硬件自动将恢复原数据寄存器。故中断操作时本发明显优于优于现有技术。

在本发明实施例中,进一步地,所述根据所述数据寄存器和内存栈的映射关系,将栈存取操作指令进行精简,并根据精简后的操作指令进行数据访问操作,还包括:

响应多线程切换请求,根据所述数据寄存器和内存栈的映射关系,对线程切换的出入栈指令进行精简,并根据精简后的操作指令进行线程切换操作。

需要说明的是,有多任务的操作系统中,存在频繁的线程切换。每次切换,都要保存原线程所有的数据寄存器,并恢复新线程所有的数据寄存器。现有技术仍需显式的出入栈指令,但本发明仅需设置下栈指针,就由硬件自动地完成相关同步。故线程切换操作时本发明显优于优于现有技术。

在本发明实施例中,进一步地,所述CPU中优化寄存器访问的方法还包括:

根据所述预设的映射策略对编译器进行修改,以对寄存器分配方案、变量存取方式以及汇编生成形式进行调整。

在具体实施例中,本发明实施例涉及到以下多个层面的修改:

a)、CPU:主要是栈指针SP设置(以小端为例)

i.SP下移指令:将顶部N个寄存器同步入内存栈中(寄存器->内存),然后SP=SP-N。

ii.SP上移指令:内存栈同步到顶部N个寄存器中(内存->寄存器),然后SP=SP+N。

iii.SP设定指令:所有寄存器写入原栈中,设定SP新值,将新栈写入所有寄存器中。

b)、编译器修改:调整寄存器分配方案、变量存取、汇编生成等。

c)、软件修改:主要是修改中断、线程切换等底层实现。

可以理解的是,以上多个层面的修改可以由各专业研发人员(编译器开发者、操作系统或底层软件研发者等)根据映射需求来进行适应性修改。

在具体实施例中,可以采取以下手段进行优化,比如在CPU方面:

a)实际数据寄存器的数量N,可以是但不仅限于本实施例的256个,可根据实际需求增加或减少。

b)寄存器采用环形+索引访问模式,指令中访问的R[0],可能是物理的Rx。物理的R0对应的是指令中的R[N-x]。采用该模式可以减少SP移动时引发的数据搬运,从而提升性能。

c)在寄存器与内存之间,***一级或多级缓存,以提升性能。

下面举例一些典型的C语言函数,并附上翻译后的相关汇编语言(类似ARM汇编),以对本发明进行论证说明。在以下举例中,确实没有显式的数据出入栈指令,证明本发明相较于现有技术的优势。

首先,关于调用约定:

a)调用一个函数时,让sp减去一个值,使得其指向要传入的第0参数,然后将参数倒序写入栈,最后pc(程序计数器)入栈并转至子函数。如果参数需要的字节数小于返回值需要的字节数,则sp减去返回值需要的字节数。

b)函数中,函数参数可以当局部变量使用,也就是函数可改变函数实参的值,第0参数即r1,如果sp值变化了,则可能变为r[n]。

c)函数每个变量存放在栈上,使用多少变量,sp应减去相应数值,使得变量地址大于或等于sp,可样可确保中断等意外情况不会改写变量。

d)函数返回时,sp恢复,将第一个返回值放在r1,即sp[1],然后放在r2,最后,pc出栈,pc指向调用函数的下一条指令。

1)最简单的函数:LoopDelay()

2)内存复制函数:CopyMemory

3)数学运算:DoMath(a,b,c,d),返回值为(a+b)*(c–d),后面为优化代码

优化代码:

以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。

11页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:基于Linux系统的贴牌显示方法、电子设备及存储介质

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!