CN115357230A - 用于寄存器溢出的编译方法、电子设备和介质 - Google Patents

用于寄存器溢出的编译方法、电子设备和介质 Download PDF

Info

Publication number
CN115357230A
CN115357230A CN202211072873.4A CN202211072873A CN115357230A CN 115357230 A CN115357230 A CN 115357230A CN 202211072873 A CN202211072873 A CN 202211072873A CN 115357230 A CN115357230 A CN 115357230A
Authority
CN
China
Prior art keywords
register
storage unit
compiler
stack
program
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202211072873.4A
Other languages
English (en)
Inventor
黄磊
张定飞
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
ARM Technology China Co Ltd
Original Assignee
ARM Technology China Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by ARM Technology China Co Ltd filed Critical ARM Technology China Co Ltd
Priority to CN202211072873.4A priority Critical patent/CN115357230A/zh
Publication of CN115357230A publication Critical patent/CN115357230A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/37Compiler construction; Parser generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/441Register allocation; Assignment of physical memory space to logical memory space
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/3012Organisation of register space, e.g. banked or distributed register file
    • G06F9/30134Register stacks; shift registers

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本申请涉及计算机技术领域,特别涉及一种用于寄存器溢出的编译方法、电子设备和介质。该方法应用于电子设备,该方法包括:编译器获取待编译程序;编译器对待编译程序进行编译,得到待执行指令;其中,在编译器对待编译程序进行编译包括:对应于待编译程序所包括的第一变量对应的第一寄存器发生溢出,将第一寄存器溢出的变量部分分配至第一寄存器对应的第一存储单元,对应于待编译程序所包括的第二变量对应的第二寄存器发生溢出,将第二寄存器溢出的变量部分分配至第二寄存器对应的第二存储单元。本申请实施例提供的方法,可以降低寄存器溢出带来的时间开销,提高程序性能。

Description

用于寄存器溢出的编译方法、电子设备和介质
技术领域
本发明涉及计算机技术领域,具体涉及一种用于寄存器溢出的编译方法、电子设备和介质。
背景技术
寄存器为处理器(例如中央处理器(central processing unit,CPU))内部的存储区域,用于存储从内存读取而来的数据(包括指令)和处理器运算的中间结果。寄存器分配是程序编译过程中的一个阶段,具体处于编译器编译的中间表示(IntermediateRepresentation,IR)阶段,可执行代码输出之前。在此阶段,当数据存储需求量超过了寄存器可存储或分配的数据量,将发生寄存器溢出。目前寄存器溢出,通常将数据存储需求量超过寄存器可存储数据量的对应数据分配至电子设备的主存储器。其中,主存储器的访问速度低于寄存器的访问速度。
例如,电子设备的寄存器可以包括标量寄存器和向量寄存器等,当待存储数据的数据存储需求量超过标量寄存器或向量寄存器可存储数据量,则标量寄存器或向量寄存器均需要进行寄存器溢出,即该待存储数据中超过标量寄存器或向量寄存器可存储数据量的部分数据均会被分配至电子设备的主存储器的栈上。在处理器执行该部分数据时,需要从主存储器上读取该部分待存储数据。
可见,上述寄存器溢出的用于寄存器溢出的编译方法,在执行指令时会增加主存储器的访问时间,并且由于主存储器的访问速度较低,进而会影响程序性能。
发明内容
为解决上述寄存器溢出影响程序性能的问题,本申请实施例提供了一种用于寄存器溢出的编译方法、电子设备和介质。
第一方面,本申请实施例提供了一种用于寄存器溢出的编译方法,应用于电子设备,所述电子设备上安装有编译器,所述电子设备包括位于处理器中的多个寄存器、第一存储单元和第二存储单元;并且所述方法包括:
所述编译器获取待编译程序;
所述编译器对所述待编译程序进行编译,得到待执行指令;
其中,在所述编译器对所述待编译程序进行编译包括:
对应于所述待编译程序所包括的第一变量对应的第一寄存器发生溢出,将所述第一寄存器溢出的变量部分分配至所述第一寄存器对应的第一存储单元;
对应于所述待编译程序所包括的第二变量对应的第二寄存器发生溢出,将所述第二寄存器溢出的变量部分分配至所述第二寄存器对应的第二存储单元;
其中,所述处理器对所述第一存储单元和所述第二存储单元的访问速度不同。
可以理解,在一些实施例中,电子设备中还可以包括第三存储单元,并且对应于待编译程序所包括的第三变量对应的第三寄存器发生溢出,编译器可以将第三寄存器溢出的变量部分分配至第三寄存器对应的第三存储单元。其中,处理器对于第三存储单元的访问速度可以不同与第一存储单元和第二存储单元,或者,处理器对于第三存储单元的访问速度与第一存储单元或第二存储单元相同。即本申请实施例中的寄存器不限于上述第一寄存器和第二寄存器,电子设备的存储单元也不限于第一存储单元和第二存储单元。
本申请实施例提供的用于寄存器溢出的编译方法,将第一寄存器溢出的变量分配至第一存储单元,将第二寄存器溢出的变量分配至第二存储单元,即不同的寄存器溢出的变量,分配至不同的存储单元,而非将寄存器溢出的变量统一分配至电子设备的主存储器,可以减少每次访问第一寄存器和第二寄存器溢出的变量花费的时间,降低寄存器溢出带来的时间开销,提高程序性能。
在上述第一方面的一种可能的实现方式中,所述第一寄存器为向量寄存器,所述第二寄存器为标量寄存器。
在上述第一方面的一种可能的实现方式中,对应于所述待编译程序所包括的第一变量对应的第一寄存器发生溢出,将所述第一寄存器溢出的变量部分分配至所述第一寄存器对应的第一存储单元,包括:
所述编译器确定所述第一寄存器发生溢出,并确定所述第一寄存器对应的第一寄存器类别;
所述编译器根据所述第一寄存器类别,确定所述第一寄存器类别对应所述第一存储单元;
所述编译器将所述第一寄存器溢出的变量部分分配至所述第一寄存器类别对应的所述第一存储单元。
在上述第一方面的一种可能的实现方式中,对应于所述待编译程序所包括的第二变量对应的第二寄存器发生溢出,将所述第二寄存器溢出的变量部分分配至所述第二寄存器对应的第二存储单元,包括:
所述编译器确定所述第二寄存器发生溢出,并确定所述第二寄存器对应的第二寄存器类别;
所述编译器根据所述第二寄存器类别,确定所述第二寄存器类别对应所述第二存储单元;
所述编译器将所述第二寄存器溢出的变量部分分配至所述第二寄存器类别对应的所述第二存储单元。
在上述第一方面的一种可能的实现方式中,所述第一寄存器类别和所述第二寄存器类别是根据所述多个寄存器的访问频次确定的。
在上述第一方面的一种可能的实现方式中,所述处理器对所述第一寄存器类别的所述第一寄存器的访问频次高于对所述第二寄存器类别的第二寄存器的访问频次,所述处理器对所述第一存储单元的访问速度高于所述处理器对所述第二存储单元。
在上述第一方面的一种可能的实现方式中,所述电子设备包括处理器,所述第一存储单元为位于所述处理器中的存储单元,所述第二存储单元为位于所述处理器外部的外部存储单元。
可以理解,本申请实施例中,对于使用频度较高类的寄存器,由于采用访问速度更快的处理器专用存储单元,可以减少每次访问该类寄存器溢出的数据花费的时间,并且由于该类寄存器的使用频度较高,即大多数数据采用该类寄存器进行数据存储,可以降低寄存器溢出带来的时间开销,提高程序性能。对于使用频度较低类的寄存器,由于其使用频度较低,存储单元访问速度的快慢对于程序性能的影响较低,可以采用访问速度较慢的主存储器存储其溢出的数据。
在上述第一方面的一种可能的实现方式中,所述第一存储单元为静态随机存取存储器,所述第二存储单元为双倍速率同步动态随机存储器。
在上述第一方面的一种可能的实现方式中,所述第一存储单元包括第一堆栈存储区域;
所述编译器将所述第一寄存器溢出的变量部分分配至所述第一寄存器对应的第一存储单元,包括:
所述编译器将所述第一寄存器溢出的变量部分分配至所述第一堆栈存储区域,其中,所述第一寄存器溢出的变量部分在所述第一堆栈存储区域中以堆栈的方式进行存储。
在上述第一方面的一种可能的实现方式中,所述第二存储单元包括第二堆栈存储区域;
所述编译器将所述第二寄存器溢出的变量部分分配至所述第二寄存器对应的第二存储单元,包括:
所述编译器将所述第二寄存器溢出的变量部分分配至所述第二堆栈存储区域,其中,所述第二寄存器溢出的变量部分在所述第二堆栈存储区域中以堆栈的方式进行存储。
可以理解,对于不同寄存器溢出变量,采用不用存储单元的堆栈存储区域进行存储,使得同一存储单元存储的为同一类别的寄存器的溢出数据,而同一类别的寄存器的存储的数值之间的长度差距较小,空泡较小,堆栈存储区域利用率较高。
在上述第一方面的一种可能的实现方式中,所述编译器将所述第一寄存器溢出的变量部分分配至所述第一寄存器对应的第一存储单元,包括:
所述编译器将所述第一寄存器溢出的变量部分分配至所述第一存储单元;
所述编译器为所述第一寄存器溢出的变量部分插入寄存器溢出指令;
所述编译器将所述第二寄存器溢出的变量部分分配至所述第二寄存器对应的第二存储单元,包括:
所述编译器将所述第二寄存器溢出的变量部分分配至所述第二存储单元;
所述编译器为所述第二寄存器溢出的变量部分插入寄存器溢出指令。
第二方面,本申请实施例提供了一种用于寄存器溢出的编译装置,应用于电子设备,所述电子设备上安装有编译器,所述电子设备包括位于处理器中的多个寄存器、第一存储单元和第二存储单元;并且该装置包括:
程序获取模块,用于所述编译器获取待编译程序;
程序编译模块,用于所述编译器对所述待编译程序进行编译,得到待执行指令;
其中,程序编译模块在用于所述编译器对所述待编译程序进行编译,具体用于:
对应于所述待编译程序所包括的第一变量对应的第一寄存器发生溢出,将所述第一寄存器溢出的变量部分分配至所述第一寄存器对应的第一存储单元;
对应于所述待编译程序所包括的第二变量对应的第二寄存器发生溢出,将所述第二寄存器溢出的变量部分分配至所述第二寄存器对应的第二存储单元;
其中,所述处理器对所述第一存储单元和所述第二存储单元的访问速度不同。
第三方面,本申请实施例提供了一种电子设备,一个或多个处理器;一个或多个存储器;一个或多个存储器存储有一个或多个程序,当一个或者多个程序被一个或多个处理器执行时,使得电子设备执行上述用于寄存器溢出的编译方法。
第四方面,本申请实施例提供了一种计算机可读存储介质,存储介质上存储有指令,指令在计算机上执行时使所述计算机执行上述用于寄存器溢出的编译方法。
第五方面,本申请实施例提供了一种计算机程序产品,计算机程序产品包括指令,该指令在执行时使计算机执行上述用于寄存器溢出的编译方法。
附图说明
图1所示为一种用于寄存器溢出的编译方法的应用场景图;
图2所示为本申请实施例提供的一种堆栈存储区域的结构示意图;
图3a所示为本申请实施例提供的一种堆栈空间的结构示意图;
图3b所示为本申请实施例提供的另一种堆栈空间的结构示意图;
图4所示为本申请实施例提供的一种用于寄存器溢出的编译方法的流程示意图;
图5所示为本申请实施例提供的另一种用于寄存器溢出的编译方法的流程示意图;
图6所示为本申请实施例中提供的编译后的一个程序代码示意图;
图7所示为本申请实施例提供的一种用于寄存器溢出的编译方法的电子设备的结构示意图;
图8所示为本申请实施例提供的一种用于寄存器溢出的编译装置的程序模块示意图。
具体实施方式
本申请的说明性实施例包括但不限于一种用于寄存器溢出的编译方法、电子设备和介质。下面将结合附图对本申请的实施例作进一步地详细描述。
在以下的叙述中,为了使读者更好地理解本发明而提出了许多技术细节。但是,本领域的普通技术人员可以理解,即使没有这些技术细节和基于以下各实施方式的种种变化和修改,也可以实现本发明各权利要求所要求保护的技术方案。
为了更好地理解本申请实施例的方案,下面先对本申请实施例可能涉及的相关术语和概念进行介绍。
静态随机存取存储器(Static Random Access Memory,SRAM),利用晶体管来存储信息,一旦掉电,资料就会全部丢失,只要供电,它的资料就会一直存在,不需要动态刷新。SRAM无需刷新、读写速度快,但成本高、容量小,一般用来作为系统级芯片(System onChip,SOC)的内部RAM(英文全称Random Access Memory,中文全称随机访问存储器)使用。
双倍速率同步动态随机存储器(Double Data Rate SDRAM,简称DDR,其中SDRAM全称为Synchronous Dynamic Random Access Memory),与系统总线速度同步,也就是与系统时钟同步,通过不断的刷新来保证数据不会丢失,可以读写任意地址的数据,每个时钟周期可以传输两次数据。DDR集成度高、功耗低、成本低、适合做大容量存储,一般作为高速缓存或微控制单元(Microcontroller Unit,MCU)的内部RAM。
编译:编译是将用户程序(通常高级源语言编写的,或称源文件)转换成中间表示(Intermediate Representation,IR),并在IR上进行多次转换,最终生成对应的目标语言代码(通常是面向目标体系结构的汇编码或者二进制可执行码)。
编译器:是将用一种编程语言(源语言)编写的计算机代码翻译成另一种语言(目标语言)的软件。它一般分为三部分:前端、中端、后端。
标量寄存器:用于完成标量计算的寄存器。
向量寄存器:用于完成向量计算的寄存器。一般来说比标量寄存器更宽,一个向量相当于若干个标量。
物理寄存器:目标体系结构(或称目标芯片)中实际存在的寄存器,可以包括标量寄存器和向量寄存器。
中间表示(Intermediate Representation,IR):指编译器对于源程序进行扫描后生成的内部表示,代表源程序的语义和语法结构,编译器的各个阶段都在中间表示上进行分析或优化变换。例如,对于前端的输入语言为OpenCL语言,后端的目标平台汇编代码为汇编语言的编译器中,中间表示为将源代码由OpenCL语言转换为汇编语言的过程,可以用一个中间表示来实现。中间表示可以为抽象语法树、反向波兰符号或3地址码等。IR分为多层,较高层(更贴近源语言程序)的IR可能没有虚拟寄存器,只有变量;而较底层(更贴近目标机器)的IR可能没有变量,只有虚拟与物理寄存器。
虚拟寄存器:在编译过程中源文件中的操作数的一个编号。从较高层IR转换为较底层IR的过程中,“变量”的概念会被映射为“虚拟寄存器”的概念。“虚拟寄存器”可以有无限多个,但最终要被映射到目标机器上有限多个物理寄存器上。
寄存器分配:将虚拟寄存器映射到物理寄存器的过程。寄存器分配是通过将虚拟寄存器尽可能地分配到物理寄存器,即,使尽可能多的变量驻留寄存器中,可以提高程序执行速度。
寄存器溢出:寄存器分配时,物理寄存器数量不够时,将当前寄存器中的值放置到其他存储单元的地址空间(通常是主存储器上的堆栈存储区域),在使用时再从该地址空间取回。具体地,对于任意一个被溢出的变量,在该变量的每一个定义之后插入一条(store)指令,在其每一个使用之前插入一个(load)指令。
如前所述,现有技术中寄存器溢出的用于寄存器溢出的编译方法,在执行指令时会增加主存储器的访问时间,并且由于主存储器的访问速度较低,进而会影响程序性能。
例如,参考图1所示,电子设备10包括编译器100、DDR 200和处理器300。其中,编译器100在从DDR 200(主存储器)读取程序,并将编译后的数据分配至处理器300的寄存器中。
可以理解,处理器300可以包括应用处理器(application processor,AP),调制解调处理器,图形处理器(graphics processing unit,GPU),图像信号处理器(image signalprocessor,ISP),控制器,视频编解码器,数字信号处理器(digital signal processor,DSP),基带处理器,和/或神经网络处理器(neural-network processing unit,NPU)等。处理器300还可以包括CPU、GPU等。
具体地,编译器100从DDR 200读取程序后,对程序进行编译,输出处理器300可执行的汇编文件或二进制文件等。在程序编译阶段,编译器100可以按照数据类型,将数据分配至对应的寄存器中。例如,编译器100可以将标量数据分配至处理器300的标量寄存器301中,将向量数据分配至处理器300的向量寄存器302上。
并且,编译器还可以对各个寄存器的溢出数据进行预先分配,即当寄存器的发生数据溢出时,溢出的数据会存储至预先分配好的存储器上。例如编译器100可以分配标量寄存器301上的溢出数据存储至DDR 200上。进而在处理器300执行编译后的程序时,当标量寄存器301上出现数据存满,且后续仍有标量数据需要存储至标量寄存器301时,该部分标量数据会存储至DDR 200上。同理,编译器100可以分配向量寄存器302上的溢出数据存储至DDR 200上。进而在处理器300执行编译后的程序时,当向量寄存器302上出现数据存满,且后续仍有向量数据需要存储至向量寄存器302时,该部分向量数据会存储至DDR 200上。进一步地,当处理器300在执行编译后的程序时,并需要对溢出的标量数据或向量数据进行数据处理时,处理器300需要从DDR 200上读取溢出的标量数据或向量数据。
可见,目前的用于寄存器溢出的编译方法中,主要是将寄存器溢出数据存储于电子设备的主存储器,而处理器300在对寄存器存储的数据进行数据处理时,需要从DDR 200上读取数据的访问主存储器的访问,并且由于DDR 200的访问速度较低(一次访问主存需要几十到几百拍),处理器300执行程序的速度降低,进而增加处理器300执行程序的时间开销,影响程序性能。
为此,本申请提供了一种用于寄存器溢出的编译方法,应用与电子设备。在本申请实施例中,由于考虑到处理器对于不同寄存器的访问次数等不同,并且处理器对于不同位置的存储单元的访问速度也是不同的,例如对于处理器上的专用存储单元访问速度较快,对于电子设备的主存储器的访问速度较慢。因此,编译器可以编译器根据各寄存器的访问信息,对处理器上的寄存器进行划分,以确定多个寄存器的类别,并确定各寄存器的类别与各存储单元的对应关系。
如此,在编译器编译待编译程序,进行寄存器分配的编译阶段,首先确定待编译程序中的数据对应的目标寄存器,然后基于待编译程序中的数据的数据量以及寄存器可存储数据量判断出目标寄存器是否存在溢出情况,若存在溢出情况,则获取该目标寄存器的类别,基于各寄存器的类别与各存储单元的对应关系确定出目标寄存器的类别所对应的存储单元,将待编译程序中与目标寄存器的可存储数据量对应数据量的数据分配至目标寄存器,溢出部分数据(待编译程序中超出寄存器可存储数据量的数据)分配至目标寄存器的类别所对应的存储单元中。当判断出目标寄存器不存在溢出情况,则将待编译程序中的数据均分配至目标寄存器。
可以理解,判断目标寄存器是否存在溢出情况的方式可以为:当待编译程序中的数据的数据量小于或等于寄存器可存储数据量,则目标寄存器不会发生寄存器溢出。当待编译程序中的数据的数据量大于寄存器可存储数据量,则目标寄存器会发生溢出。
可以理解,访问信息可以包括寄存器上数据被访问的频度(即寄存器的使用频度),不同寄存器的使用频度不相同。
在一些实施例中,寄存器的类别可以包括使用频度较高类以及使用频度较低类。
电子设备的存储单元可以包括:访问速度更快的处理器的专用存储单元(例如专用SRAM单元303)以及访问速度较慢的主存储器(例如DDR 200)。
其中,电子设备根据各寄存器的访问信息,对处理器上的寄存器进行划分,以确定多个寄存器的类别,可以包括:
确定使用频度大于设定阈值的寄存器为使用频度较高类,使用频度小于等于设定阈值的寄存器为使用频度较低类,其中设定阈值可以根据电子设备的处理器型号或功能进行设置,在此不作限制。例如对于人工智能(Artificial Intelligence)加速器,主要用于处理图像数据、音频数据、视频数据,在AI加速器中的处理器上的向量寄存器的使用频度较高,大于设定阈值,所以向量寄存器的所属类别为使用频度较高类,标量寄存器的使用频度较低,小与等于设定阈值,所以标量寄存器的所属类别为使用频度较低类。可以理解,上述标量寄存器和向量寄存器为本申请实施例中的一种举例,电子设备的处理器中还可以包括比上述更多或更少的寄存器,本申请对此不作限制。
在另一些实施例中,寄存器的类别的划分还可以采用其他方法,例如寄存器类别划分为使用频率最高类,使用频度较高类和使用频度最低类三种,进而使用频度大于第一设定阈值的寄存器为使用频度最高类,使用频度小于第一设定阈值且大于第二设定阈值的寄存器为使用频度较高类,使用频度小于第二设定阈值的寄存器为使用频度最低类等。
当然,上述几种寄存器的类别的划分和确定方法进而本申请中寄存器的划分和类别确定方法的部分示例,而不是全部。
确定各寄存器数据类别对应的存储单元可以包括:确定使用频度较高类的寄存器对应的存储单元为访问速度更快的处理器的专用存储单元(例如专用SRAM单元303),确定使用频度较低类的寄存器对应的存储单元为访问速度较慢的主存储器(例如DDR 200)。
本申请实施例中,采用上述方法确定寄存器类别对应的存储单元,故而,对于使用频度较高类的寄存器,由于采用访问速度更快的处理器专用存储单元,可以减少每次访问该类寄存器溢出的数据花费的时间,并且由于该类寄存器的使用频度较高,即大多数数据采用该类寄存器进行数据存储,可以降低寄存器溢出带来的时间开销,提高程序性能。对于使用频度较低类的寄存器,由于其使用频度较低,存储单元访问速度的快慢对于程序性能的影响较低,可以采用访问速度较慢的主存储器存储其溢出的数据。
在一些实施例中,同一寄存器类别可以对应多种寄存器,进而同一存储单元还可以对应存储多种寄存器的溢出数据。例如,处理器的寄存器包括向量寄存器、张量寄存器和标量寄存器,由于张量寄存器和向量寄存器的均属于频度高类,可以采用相同的存储单元(例如处理器的专用存储单元)存储其溢出的数据,而标量寄存器采用其他存储单元(例如主存储器)存储其溢出的数据。
在一些实施例中,可以在电子设备的各存储单元设置堆栈存储区域(例如图2中的DDR 200的堆栈存储区域201和专用SRAM单元303的堆栈存储区域202),进而寄存器的溢出数据可以通过各存储单元的堆栈存储区域进行存储。
本申请实施例通过基于寄存器的访问信息,将不同寄存器的溢出数据应用不同的存储单元进行存储,可以减少程序执行时由于寄存器溢出产生的对于主存储器的访问,降低寄存器溢出带来的时间开销,进而提高程序性能。
此外,由于不同寄存器存储的数值的长度存在差异,采用同一个堆栈存储区域存储寄存器溢出数据时,会给堆栈存储区域引入空泡(bubble),降低堆栈空间的利用率。对于要求访存地址对齐的芯片而言,不同类型寄存器存储的数值之间的长度差距越大,空泡越大,堆栈存储区域利用率越低。比如标量寄存器存储的每个数值需要占用堆栈存储区域32bit,向量寄存器存储的每个数值需要占用堆栈存储区域128bit~512bit,一个空泡可达480bit。基于上述方案,使得同一存储单元存储的为同一类别的寄存器的溢出数据,而同一类别的寄存器的存储的数值之间的长度差距较小,空泡较小,堆栈存储区域利用率较高。
可以理解,不同的存储单元对应于电子设备的不同存储部件。以电子设备为AI加速器为例,其存储模块可以包括处理器上的专用存储单元(例如专用SRAM单元),以及AI加速器的主存储器(例如DDR)。处理器可以从主存储器上读取程序,以供AI加速器的编译器进行程序编译。编译器并将编译后的可执行指令暂时存储至处理器的专用存储单元,进而处理器可以通过访问其上的专用存储单元执行对应的指令。在一些实施例中,AI加速器还可以包括处理器的专用存储单元、主存储器外的其他存储部件,本申请对此不作限制。
在一些实施例中,根据寄存器的访问信息确定对应的寄存器数据溢出存储单元,即根据寄存器的使用频度,确定其溢出数据对应的存储单元。例如,对于AI加速器的向量寄存器和标量寄存器,由于向量寄存器的使用频度高,则确定向量寄存器的溢出数据分配至访问速度更快的处理器的专用存储单元(例如专用SRAM单元),标量寄存器的使用频度较低,则确定标量寄存器的溢出数据分配至访问速度较慢的主存储器(例如DDR)。
可以理解,电子设备包括但不限于手机、上网本、平板电脑、智能手表,或者其他桌面型设备、膝上型设备、手持型设备、可穿戴设备、智能家居设备和车载型设备等,例如超级移动个人计算机(Ultra-mobile Personal Computer,UMPC)、智能相机、上网本、个人数字助理(Personal Digital Assistant,PDA)、便携式多媒体播放器(Portable MultimediaPlayer,PMP)、AR(增强现实)/VR(虚拟现实)设备、飞行器、机器人等。电子设备还可以为终端设备(手机、平板电脑、笔记本)内的加速器,例如AI加速器等。本申请实施例对电子设备的具体类型和结构等不作限定。
继续参考图1,对本申请实施例中的用于寄存器溢出的编译方法进行进一步介绍。
编译器100在从DDR 200(主存储器)读取程序,并将编译后的可执行指令存储至处理器300的寄存器中。具体地,编译器100从DDR 200读取程序后,会对程序进行编译,并按照数据的类型,将数据分配至处理器300上不同的寄存器中。
在一些实施例中,处理器300的寄存器包括标量寄存器301和向量寄存器302。编译器100在编译主函数时,可以先确定各寄存器的分配,即确定将编译后的标量数据分配至处理器300的标量寄存器301中,将向量数据分配至处理器300的向量寄存器302上。同时,编译器100会根据不同的寄存器的访问信息(例如使用频度),确定各寄存器的类别,进而根据寄存器的类别分配各寄存器溢出的数据的存储位置。具体地,对于使用频度更高的向量寄存器,确定其为使用频度较高类寄存器,进而确定其发生寄存器溢出时,溢出数据分配至访问速度更快的专用SRAM单元303,对于使用频度较低的标量寄存器,确定其为使用频度较低类寄存器,进而确定其发生寄存器溢出时,溢出数据分配至访问速度较低的DDR 200。
进而,在处理器300执行编译后的可执行指令时,当标量寄存器301上出现数据存满,且后续仍有标量数据需要存储至标量寄存器301时,会发生寄存器溢出,溢出的标量数据会存储至DDR 200上。当向量寄存器302上出现数据存满,且后续仍有向量数据需要存储至向量寄存器302时,会发生寄存器溢出,溢出的向量数据会存储至专用SRAM单元303上。进一步地,当处理器300在执行之后的指令时,在执行到溢出的标量数据时,处理器300需要从DDR 200上读取溢出的标量数据,在执行到溢出的向量数据时,处理器300需要从专用SRAM单元303上读取溢出的向量数据。
在一些实施例中,为了使得编译器100能够在专用存储单元(例如专用SRAM单元)中或者DDR单元中自动分配寄存器溢出数据的存储空间和存储位置,可以在专用SRAM单元或DDR中设置对应的堆栈存储区域,作为该存储单元的堆栈空间,例如,如图2所示,在DDR200的存储单元中,设置DDR堆栈存储区域201,在专用SRAM单元303的存储单元中,设置SRAM堆栈存储区域202。进一步地,当标量寄存器301的溢出数据可以存储至DDR 200的DDR堆栈存储区域201,向量寄存器302的溢出数据可以存储至专用SRAM单元303的SRAM堆栈存储区域202。
例如,在一些实施例中,堆栈存储区域的数据存储结构可以如图3a所示,该数据存储结构即为存储单元的堆栈空间。堆栈空间中,只能在数据结构的一端(即栈顶)插入和删除数据,数据遵循后进先出的原则。可以理解,栈指针SP指向堆栈空间的栈顶。
当有溢出数据需要存储于堆栈存储区域时,可以例如使用pushq指令将溢出数据存储入堆栈存储区域,此时编译器100会计算该溢出数据需要的总的堆栈空间,栈指针SP指向的地址会根据计算结果减少对应的量,然后根据溢出数据相对于SP的偏移将程序的变量依次压入堆栈存储区域。可以理解,在存储数据后,堆栈空间会向下增长。每次增长的空间,为存储的程序对应的栈帧。例如,在数据5之后有新的溢出数据需要存储,新的溢出数据中包括数据6,则处理器会根据编译器划分好的新的溢出数据所需的存储空间和存储位置,将堆栈空间的栈指针SP减小一定量,并将新的溢出数据中的数据量6存入堆栈存储区域,如图3b所示。此时,栈指针SP指向堆栈空间的栈顶。
可以理解,当处理器确认数据6对应的指令执行完成,可以将该指令对应堆栈空间进行释放。例如对于输入的包括数据6的指令,当该指令执行完成后,处理器确定该指令中包括数据6,则将数据6对应的堆栈空间进行释放。
下面结合图4,以电子设备为手机为例,对本申请实施例的用于寄存器溢出的编译方法进行进一步介绍。
图4所示为本申请实施例所提供的一种用于寄存器溢出的编译方法的流程示意图。
如图4所示,该方法包括以下步骤:
401:编译器100根据各寄存器的访问信息,确定各寄存器的类别以及各寄存器类别对应的存储单元。
可以理解,寄存器的访问信息可以包括寄存器上数据被访问的频度,即寄存器的使用频度。其中寄存器可以包括标量寄存器和向量寄存器等。
可以理解,不同的存储单元对应于电子设备的不同存储部件。电子设备的存储单元可以包括访问速度更快的处理器的专用存储单元(例如专用SRAM单元303)以及访问速度较慢的主存储器(例如DDR 200)。还可以包括其他访问速度更慢的外部存储器等。
在一些实施例中,编译器100根据寄存器的使用频度,确定各寄存器的类别,进而根据各寄存器的类别分配存储其溢出数据所需的存储单元。例如,对于包括向量寄存器302和标量寄存器301的处理器300,向量寄存器302的使用频度高,因此,确定向量寄存器302为使用频度较高类寄存器,并且确定使用频度较高类寄存器对应的存储单元为处理器300的专用存储单元(例如专用SRAM单元303),即向量寄存器302溢出的数据分配至处理器300的专用存储单元(例如专用SRAM单元303);标量寄存器301的使用频度较低,因此确定标量寄存器301为使用频度较低类寄存器,并且确定使用频度较低类寄存器对应的存储单元为访问速度较慢的主存储器(例如DDR 200),即标量寄存器301的溢出数据分配至访问速度较慢的主存储器(例如DDR 200)。
在另一些实施例中,寄存器的类别的划分还可以采用其他方法,例如寄存器类别划分为使用频率最高类,使用频度较高类和使用频度最低类三种,进而使用频度大于第一设定阈值的寄存器为使用频度最高类,使用频度小于第一设定阈值且大于第二设定阈值的寄存器为使用频度较高类,使用频度小于第二设定阈值的寄存器为使用频度最低类等。
当然,上述几种寄存器的类别的划分和确定方法进而本申请中寄存器的划分和类别确定方法的部分示例,而不是全部。
在一些实施例中,同一寄存器类别可以对应多种寄存器,进而同一存储单元还可以对应存储多种寄存器的溢出数据。例如,处理器的寄存器包括向量寄存器、张量寄存器和标量寄存器,由于张量寄存器和向量寄存器的均属于频度高类,可以采用相同的存储单元(例如处理器的专用存储单元)存储其溢出的数据,而标量寄存器采用其他存储单元(例如主存储器)存储其溢出的数据。
在一些实施例中,寄存器溢出的数据可以以堆栈的方式存储至对应存储单元的堆栈存储区域中。例如标量寄存器301溢出的数据存储至DDR 200的DDR堆栈存储空间201中,向量寄存器302溢出的数据存储至专用SRAM单元303的SRAM堆栈存储空间202中。
在一些实施例中,不同的堆栈存储区域可以用不同的堆栈ID来区分。进一步地,处理器200在根据寄存器的访问信息确定其溢出数据对应的存储单元时,可以确定各寄存器的溢出数据对应的堆栈ID。例如,对于向量寄存器302可以确定其对应专用SRAM单元303中的SRAM堆栈存储区域的堆栈ID,进而编译器在确定向量寄存器302发生数据溢出时,可以根据向量寄存器302对应的堆栈ID,将向量寄存器302溢出的数据分配至专用SRAM单元303的SRAM堆栈存储区域。对于标量寄存器301可以确定其对应DDR 200中的DDR堆栈存储区域的堆栈ID,进而编译器在确定标量寄存器301发生数据溢出时,可以根据标量寄存器301对应的堆栈ID,将标量寄存器301溢出的数据分配至DDR 200的DDR堆栈存储区域。例如,DDR堆栈存储区域的堆栈ID为0,SRAM堆栈存储区域的堆栈ID为1。则步骤401中,可以确定标量寄存器301溢出的数据存储于堆栈ID为0的DDR堆栈存储区域,确定向量寄存器303溢出的数据存储于堆栈ID为1的SRAM堆栈存储区域。
可以理解,DDR堆栈存储区域和SRAM堆栈存储区域除了堆栈ID不同,以用于SRAM变量和非SRAM变量的存储外,对于其堆栈空间的栈帧的管理都是相同的。
402:编译器100获取并编译待编译程序,并且编译器100在编译待编译程序时,确定待编译程序中待存储的数据对应的目标寄存器。
可以理解,待编译程序为高级语言编写的指令,例如C语言、C++语言等。
可以理解,待编译程序中待存储的数据包括变量,编译器100确定待编译程序中待存储的数据对应的寄存器的方式可以为确定待编译程序中待存储的变量的类型,并根据变量类型确定该变量对应存储的寄存器。例如对于标量变量,确定其对应的目标寄存器为标量寄存器,对于向量变量,确定其对应的目标寄存器为向量寄存器。
在一些实施例中,编译器100在编译待编译程序时,可以先将待编译程序转换为中间表示,例如抽象语法树、反向波兰符号或3地址码等。并且在该过程中,编译器100可以完成寄存器分配。具体地,编译器100可以将待编译程序中的变量映射到虚拟寄存器上,然后确定该虚拟寄存器对应的物理寄存器(即目标寄存器)。
403:判断目标寄存器是否存在溢出情况。
可以理解,在将变量存储至对应的寄存器时,需要执行步骤403,确定该目标寄存器是否存在溢出情况,若存在,表明再次向该目标寄存器存入变量时会发生寄存器溢出,进而需要将变量存储至目标寄存器对应的存储单元,即执行步骤404。若不存在溢出情况,表明目标寄存器中还能继续存储变量,变量可以直接存储至目标寄存器中,即执行步骤405。
可以理解,判断目标寄存器是否存在溢出情况的方式可以为:当待编译程序中的数据的数据量小于等于寄存器可存储数据量(即预设存储阈值),则目标寄存器不会发生寄存器溢出。当待编译程序中的数据的数据量大于寄存器可存储数据量,则目标寄存器会发生溢出。
在一些实施例中,步骤403判断目标寄存器是否存在溢出情况,具体可以为,编译器100判断虚拟寄存器对应的物理寄存器的存储空间已经被分配完,则将该虚拟寄存器标记为“溢出”,并确定物理寄存器(即目标寄存器)存在溢出的情况。进一步地,当确定目标寄存器发生溢出时,会在对应溢出的变量的定义之后插入溢出代码。溢出代码将在下文进行介绍,在此不作赘述。
404:编译器100确定目标寄存器的目标类别以及目标类别对应的目标存储单元,并将目标寄存器的可存储数据量对应数据量的数据分配至目标寄存器,将溢出的部分数据分配至对应的目标存储单元。
可以理解,溢出部分数据可以指待分配的数据中超出于寄存器可存储数据量的部分数据。
例如,寄存器可存储数据量为300兆,而待分配的数据的数据量为350兆,则可以将待分配的数据中的300兆分配至目标寄存器,而超出寄存器可存储数据量的50兆数据分配至目标存储单元。
当待分配的数据中剩余部分由于寄存器存储空间不足发生寄存器溢出,则该数据可以作为被目标寄存器溢出的部分数据,即该数据可以被分配至目标寄存器的目标类别对应的目标存储单元中。
在一些实施例中,目标寄存器溢出的部分数据被分配至目标存储单元的堆栈存储区域,则步骤404中,确定目标类别对应的目标存储单元,即确定目标类别对应的堆栈ID,然后将目标寄存器溢出的部分数据分配至对应堆栈ID的堆栈存储区域中。
405:编译器100将待分配的数据分配至目标寄存器。
可以理解,编译器对待编译程序完成编译后,得到电子设备可以执行的指令,例如汇编语言的指令等。
本申请实施例通过基于寄存器的访问信息,将不同寄存器的溢出数据应用不同的存储单元进行存储,可以减少程序执行时由于寄存器溢出产生的对于主存储器的访问,降低寄存器溢出带来的时间开销,进而提高程序性能。
此外,由于不同寄存器存储的数值的长度存在差异,采用同一个堆栈存储区域存储寄存器溢出数据时,会给堆栈存储区域引入空泡(bubble),降低堆栈空间的利用率。在本申请实施例中,采用不同的存储单元存储不同寄存器的溢出数据,将不同长度的寄存器数值存储至不同的存储单元,可以提高各存储单元的堆栈存储区域的利用率。
下面以处理器300包括标量寄存器301和向量寄存器302,寄存器类别包括使用频度较高类和使用频度较低类,且寄存器溢出的数据存储至对应存储单元的堆栈存储区域为例,结合图5,对本申请实施例中的一种用于寄存器溢出的编译方法进行进一步介绍。
图5所示为本申请实施例提供的一种用于寄存器溢出的编译方法。
如图5所示,该方法包括:
501:编译器100根据标量寄存器301和向量寄存器302的使用频度,确定标量寄存器301的类别为使用频度较低类,向量寄存器302的类别为使用频度较高类。
可以理解,由于处理器使用向量寄存器302的频度高于标量寄存器301,故而标量寄存器301的类别为使用频度较低类,向量寄存器302的类别为使用频度较高类。
502:编译器100确定使用频度较低类寄存器对应的存储单元为DDR 200,确定使用频度较高类寄存器对应的存储单元为专用SRAM单元303。
可以理解,处理器对于使用频度较低类寄存器的访问次数较少,可以将使用频度较低类寄存器溢出的变量存储至电子设备的访问速度较慢的主存储器(即DDR 200)中,处理器对于使用频度较高类寄存器的访问次数较多,可以将使用频度较高类寄存器溢出的变量存储至访问速度较快的处理器的专用存储单元(即专用SRAM单元303)中。
在一些实施例中,电子设备的主存储器可以为其他类型的存储单元,进而使用频度较低类寄存器溢出的变量可以存储至该存储单元中,而非DDR 200中。在一些实施例中,电子设备的处理器的专用存储单元为专用SRAM单元外的其他存储单元,进而,使用频度较高类寄存器溢出变量存储至对应的专用存储单元,并非专用SRAM单元。本申请对此不作限制。
503:编译器100获取并编译待编译程序。
可以理解,编译待编译程序为,将程序由计算机不可读的高级程序语言,编译成计算机可读的机器语言。
504:编译器100完成栈指针和双栈信息初始化。
可以理解,栈指针的初始化包括专用SRAM单元302的SRAM堆栈存储区域202的栈指针的初始化,以及DDR 200的DDR堆栈存储区域201的栈指针的初始化。
在一些实施例中,栈指针的初始化在编译器100开始编译待编译程序的主函数时进行。例如,对于C语言程序,栈指针的初始化在编译器100开始编译待编译程序的main函数时开始进行。
在一些实施例中,每个堆栈堆存区域的栈指针均有其对应的栈指针地址寄存器,并将堆栈存储区域的最高地址赋值给对应的栈指针地址寄存器。进一步地,在一些实施例中,栈指针的初始化为对专用SRAM单元的SRAM堆栈存储区域的栈指针的初始化,DDR 200的DDR堆栈存储区域的栈指针的初始化可以由处理器进行,无需编译器100进行。
可以理解,在一些实施例中,双栈信息初始化包括专用SRAM单元302的SRAM堆栈存储区域202的栈信息的初始化,以及DDR 200的DDR堆栈存储区域201的栈信息的初始化。其中,栈信息包括堆栈存储区域的堆栈ID、当前堆栈存储区域的使用量、堆栈存储区域与寄存器类型的映射表、堆栈存储区域的溢出变量链表等。
可以理解,双栈信息为编译器100在编译待编译程序时生成的,且生成的双栈信息目的在于给编译器100使用,存储至编译器对应的文件中,与待编译程序的存储位置不相同。
在一些实施例中,双栈信息的初始化在编译器100开始编译一个函数时进行,可以为编译主函数时进行,也可以为编译子函数时进行。
在一些实施例中,对双栈信息进行初始化前,需要先为双栈信息分配对应的存储空间。对于当前堆栈存储区域的使用量初始化为零,堆栈存储区域与寄存器类型的映射表即为堆栈存储区域与寄存器类型的对应关系,堆栈存储区域的溢出变量链表即为寄存器可存储的变量。例如,在一个函数中,包括标量变量x、y,则标量寄存器301对应的DDR 200的DDR堆栈存储区域的溢出变量链表包括溢出标量变量对象x、y。
505:编译器100将待编译程序中待存储的标量变量分配至标量寄存器301,待存储的向量变量分配至向量寄存器302。
可以理解,步骤504为编译器编译指令阶段的寄存器分配阶段,在该阶段中,会分配各变量存储的寄存器。
在一些实施例中,编译器100在编译待编译程序时,可以先将待编译程序转换为中间表示,例如抽象语法树、反向波兰符号或3地址码等。并且在该过程中,编译器100可以完成寄存器分配。具体地,编译器100可以将待编译程序中的变量映射到虚拟寄存器上,然后确定该虚拟寄存器对应的物理寄存器(即目标寄存器)。
506:编译器100确定标量寄存器和/或向量寄存器是否发生溢出。
可以理解,当编译器100在分配变量至寄存器的过程中发生溢出时,表明对应的寄存器已达到存储上限,溢出的变量需要存储至预先确定的寄存器发生溢出时需要存储的存储单元的堆栈存储区域中,进而,需要在编译的待编译程序中插入溢出代码,并根据溢出变量更新堆栈存储区域对应的栈信息,即执行步骤506。
在一些实施例中,步骤403判断目标寄存器是否存在溢出情况,具体可以为,编译器100判断虚拟寄存器对应的物理寄存器的存储空间已经被分配完,则将该虚拟寄存器标记为“溢出”,并确定物理寄存器(即目标寄存器)存在溢出的情况。
507:编译器100确定发生溢出的寄存器对应的目标类别,根据目标类别和待存储的变量中溢出的部分变量更新对应存储单元的栈指针和栈信息,并为待存储的变量插入溢出代码。
其中,发生溢出的寄存器包括标量寄存器301和向量寄存器302,待存储的变量中溢出的部分变量包括的标量变量和/或向量变量。
在一些实施例中,插入的溢出代码包括溢出开始代码和溢出结束代码,且在溢出开始代码和溢出结束代码之间阶段,需要在变量定义点之后插入变量值的保存,即插入以栈指针寄存器为基址、变量的栈上地址偏移为偏移值的store指令,并在变量使用点之前出入变量值的回复,即插入以栈指针地址寄存器为基址、变量的栈上地址偏移为偏移值的load指令。
可以理解,变量定义点即为定义变量的位置,在每条代码前插入store指令字段,变量使用点即为在为变量进行赋值的位置,在每条代码前插入load指令字段。下文将结合图6以代码实例进行说明,在此不作赘述。
在一些实施例中,在插入溢出开始(prologue)代码时,会对每个堆栈存储区域的堆栈使用量(stacksize,包括栈信息中溢出变量链表中变量所占的空间和堆栈存储区域上其他信息所占的空间的总量),在函数的首基本块(即prologue)内插入两个栈指针的调整指令(即根据当前堆栈存储区域的堆栈使用量以及初始化的栈指针,确定当前栈指针对应的地址),每个栈指针有一条调整指令。
在一些实施例中,在插入溢出结束(epilogue)代码时,可以在函数的末尾基本快内插入DDR堆栈存储区域和SRAM堆栈存储区域的栈指针的回复指令,即重新调整栈指针地址寄存器对应的地址为堆栈存储区域的最高地址。每个堆栈存储区域的栈指针均有一条恢复指令。
可以理解,在插入的溢出代码的溢出开始代码和溢出结束代码的阶段,为编译器为函数中的溢出变量开辟堆栈以及函数结束后释放堆栈空间。下文结合图6进行进一步介绍,在此不作赘述。
508:编译器100完成待编译程序的编译,并销毁双栈信息。
可以理解,在编译器完成待编译程序的编译后,可以输出可执行指令,即二进制可执行文件或汇编文件。并且需要将在编译器100编译待编译程序的过程中,为双栈信息开辟的存储空间进行释放,即对于每个栈信息,清空其堆栈存储区域的堆栈ID、清空当前堆栈存储区域的使用量(即回复使用量为零)、清空堆栈存储区域与寄存器类型的映射表、清空堆栈存储区域的溢出变量链表等,然后回收双栈信息对应的存储空间。
图6所示为本申请实施例中提供的编译后的一个程序代码示意图。
图6中,编译后的代码为汇编文件,其对应的用户程序如下:
Source code:
main(){
x=…;
va=…;
y=…;
……
…=x;
…=va;
…=y;
……}
假设上述代码中的标量变量x和y都是4Byte且要溢出,向量变量va占32Byte且要溢出,其中sp0表示位于DDR 200的DDR堆栈存储区域的栈指针地址寄存器,stacksize0表示该DDR堆栈存储区域的使用量,sp1表示专用SRAM单元303的SRAM堆栈存储区域的栈指针地址寄存器,stacksize1表示SRAM堆栈存储区域的使用量,r0、r1、r2、r3是标量寄存器存放变量x和y的值,t0、t1是向量寄存器存放向量变量va的值。
在一些实施例中,根据上述用户代码生成的双栈信息如下表1所述:
表1
Stack id=0 Stack id=1
Stack size=8 Stack size=32
(Scalar register) (Vector register)
Objects->x->y Objects->va
由上表1可知,标量寄存器301(Scalar register)的类别为使用频度较低类寄存器,其对应的DDR堆栈存储区域的堆栈ID为0,向量寄存器302(Vector register)的类别为使用频度较高类寄存器,对应的SRAM堆栈存储区域的堆栈ID为1,标量变量的长度为8Byte,向量变量的长度为32Byte。堆栈ID为0的栈信息中的溢出变量的链表中包含的变量对象为x、y,堆栈ID为1的栈信息中的溢出变量的链表中包含的变量对象为va。
继续参考图6,汇编文件中,在main函数的prologue内(即图6的bb0阶段),包含sp1的初始化、sp0的调整、sp1的调整。在溢出变量x、变量y的定义点之后和变量va定义点之后,保存变量x、y和变量va的值。具体地,可以为插入store指令,例如图6中bb1中的指令“str0”、“st t0”、“st r1”等,以保存变量值到相应栈上。在溢出变量x、变量y和变量va的使用点之前,恢复变量x、y和变量va的值。具体地,可以为插入load指令,例如图6中bb1中的指令“ld r2”、“ld t2”、“ld r3”等,从相应堆栈存储区域上取出变量值存到寄存器中。在main函数的epilogue内(即图6的bb2阶段),包含sp0和sp1的恢复。
可以理解,由于数值r0和t0分别为标量寄存器301和向量寄存器301溢出的第一个变量,则其变量的栈上地址偏移均为0,即数值r0的栈上地址为sp0+0,数值t0的栈上地址为sp1+0。数值r1为标量寄存器301溢出的第二个变量,且数值r0的长度为4Byte,则r1变量的栈上地址偏移均为4,即数值r1的栈上地址为sp0+4,其余数值同理,具体如图6所示。
图7根据本申请的一些实施例,示出了一种适应于本申请用于寄存器溢出的编译方法的电子设备10的结构示意图。如图7示,电子设备10可以包括处理器710、电源模块740、存储器780、移动通信模块730、无线通信模块720、传感器模块790、音频模块750、摄像头770、接口模块760、按键701以及显示屏702等。
可以理解的是,本发明实施例示意的结构并不构成对电子设备10的具体限定。在本申请另一些实施例中,电子设备10可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。
处理器710可以包括一个或多个处理单元,例如,可以包括中央处理器(CentralProcessing Unit,CPU)、图像信号处理(Image Signal Processing,ISP)、视频处理单元(Video Processing Unit,VPU)、图像处理器(Graphics Processing Unit,GPU)、数字信号处理器DSP、微处理器MCU(Micro-programmed Control Unit)、AI(ArtificialIntelligence,人工智能)处理器或可编程逻辑器件FPGA(Field Programmable GateArray)等的处理模块或处理电路。其中,不同的处理单元可以是独立的器件,也可以集成在一个或多个处理器中。处理器710中可以设置存储单元,用于存储指令和数据。在一些实施例中,处理器710中的存储单元为高速缓冲存储器。ISP、VPU和存储器780可以通过总线耦接,构成片上系统(system on chip,SOC),在另一些实施例中,ISP、VPU和存储器780也可以是独立的器件。
存储器780可用于存储数据、软件程序以及模块,可以是易失性存储器(VolatileMemory),例如随机存取存储器(Random-Access Memory,RAM),双倍数据率同步动态随机存取存储器(Double Data Rate Synchronous Dynamic Random Access Memory,DDRSDRAM)。
电源模块740可以包括电源、电源管理部件等。电源可以为电池。电源管理部件用于管理电源的充电和电源向其他模块的供电。在一些实施例中,电源管理部件包括充电管理模块和电源管理模块。充电管理模块用于从充电器接收充电输入;电源管理模块用于连接电源,充电管理模块与处理器710。电源管理模块接收电源和/或充电管理模块的输入,为处理器710,显示屏702,摄像头770,及无线通信模块720等供电。
移动通信模块730可以包括但不限于天线、功率放大器、滤波器、LNA(Low noiseamplify,低噪声放大器)等。移动通信模块730可以提供应用在电子设备10上的包括2G/3G/4G/5G等无线通信的解决方案。移动通信模块730可以由天线接收电磁波,并对接收的电磁波进行滤波,放大等处理,传送至调制解调处理器进行解调。移动通信模块730还可以对经调制解调处理器调制后的信号放大,经天线转为电磁波辐射出去。在一些实施例中,移动通信模块730的至少部分功能模块可以被设置于处理器710中。在一些实施例中,移动通信模块730至少部分功能模块可以与处理器710的至少部分模块被设置在同一个器件中。无线通信技术可以包括全球移动通讯系统(global system for mobile communications,GSM),通用分组无线服务(general packet radio service,GPRS),码分多址接入(codedivision multiple access,CDMA),宽带码分多址(wideband code division multipleaccess,WCDMA),时分码分多址(time-division code division multiple access,TD-SCDMA),长期演进(long term evolution,LTE),蓝牙(bluetooth,BT),全球导航卫星系统(global navigation satellite system,GNSS),无线局域网(wireless local areanetworks,WLAN),近距离无线通信技术(near field communication,NFC),调频(frequency modulation,FM),红外技术(infrared,IR)技术等。所述GNSS可以包括全球卫星定位系统(global positioning system,GPS),全球导航卫星系统(global navigationsatellite system,GLONASS),北斗卫星导航系统(beidou navigation-satellitesystem,BDS),准天顶卫星系统(quasi-zenith satellite system,QZSS)和/或星基增强系统(satellite based augmentation systems,SBAS)。
无线通信模块720可以包括天线,并经由天线实现对电磁波的收发。无线通信模块720可以提供应用在电子设备10上的包括无线局域网(wireless local area networks,WLAN)(如无线保真(wireless fidelity,Wi-Fi)网络),蓝牙(bluetooth,BT),全球导航卫星系统(global navigation satellite system,GNSS),调频(frequency modulation,FM),近距离无线通信技术(near field communication,NFC),红外技术(infrared,IR)等无线通信的解决方案。电子设备10可以通过无线通信技术与网络以及其他设备进行通信。
在一些实施例中,电子设备10的移动通信模块730和无线通信模块720也可以位于同一模块中。
显示屏702用于显示人机交互界面、图像、视频等。显示屏702包括显示面板。显示面板可以采用液晶显示屏(liquid crystal display,LCD),有机发光二极管(organiclight-emitting diode,OLED),有源矩阵有机发光二极体或主动矩阵有机发光二极体(active-matrix organic light emitting diode的,AMOLED),柔性发光二极管(flexlight-emitting diode,FLED),Mini-LED,Micro-LED,量子点发光二极管(quantum dotlight emitting diodes,QLED)等。
传感器模块790可以包括接近光传感器、压力传感器,陀螺仪传感器,气压传感器,磁传感器,加速度传感器,距离传感器,指纹传感器,温度传感器,触摸传感器,环境光传感器,骨传导传感器等。
音频模块750用于将数字音频信息转换成模拟音频信号输出,或者将模拟音频输入转换为数字音频信号。音频模块750还可以用于对音频信号编码和解码。在一些实施例中,音频模块750可以设置于处理器710中,或将音频模块750的部分功能模块设置于处理器710中。在一些实施例中,音频模块750可以包括扬声器、听筒、麦克风以及耳机接口。
摄像头770用于捕获静态图像或视频。物体通过镜头生成光学图像投射到感光元件。感光元件把光信号转换成电信号,之后将电信号传递给ISP(Image SignalProcessing,图像信号处理)转换成数字图像信号。电子设备10可以通过ISP,摄像头770,VPU,GPU(Graphic Processing Unit,图形处理器),显示屏702以及应用处理器等实现拍摄功能。摄像头770可以是定焦镜头、变焦镜头、鱼眼镜头、全景镜头等。
接口模块760包括外部存储器接口、通用串行总线(universal serial bus,USB)接口及用户标识模块(subscriber identification module,SIM)卡接口等。其中外部存储器接口可以用于连接外部存储卡,例如Micro SD卡,实现扩展电子设备10的存储能力。外部存储卡通过外部存储器接口与处理器710通信,实现数据存储功能。通用串行总线接口用于电子设备10和其他电子设备进行通信。用户标识模块卡接口用于与安装至电子设备10的SIM卡进行通信,例如读取SIM卡中存储的电话号码,或将电话号码写入SIM卡中。
在一些实施例中,电子设备10还包括按键701、马达以及指示器等。其中,按键701可以包括音量键、开/关机键等。马达用于使电子设备10产生振动效果,例如在用户的电子设备10被呼叫的时候产生振动,以提示用户接听电子设备10来电。指示器可以包括激光指示器、射频指示器、LED指示器等。
图8所示为本申请实施例提供的一种用于寄存器溢出的编译装置800的程序模块示意图,可以用于执行本申请实施例提供的用于寄存器溢出的编译方法,例如执行前述步骤401至步骤405,该装置应用于电子设备,电子设备上安装有编译器,电子设备包括位于处理器中的多个寄存器、第一存储单元和第二存储单元;并且该装置包括:
程序获取模块801,用于编译器获取待编译程序;
程序编译模块802,用于编译器对待编译程序进行编译,得到待执行指令;
其中,程序编译模块801在用于编译器对待编译程序进行编译,具体用于:
对应于待编译程序所包括的第一变量对应的第一寄存器发生溢出,将第一寄存器溢出的变量部分分配至第一寄存器对应的第一存储单元;
对应于待编译程序所包括的第二变量对应的第二寄存器发生溢出,将第二寄存器溢出的变量部分分配至第二寄存器对应的第二存储单元;
其中,处理器对第一存储单元和第二存储单元的访问速度不同。
本申请公开的机制的各实施例可以被实现在硬件、软件、固件或这些实现方法的组合中。本申请的实施例可实现为在可编程系统上执行的计算机程序或程序代码,该可编程系统包括至少一个处理器、存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备以及至少一个输出设备。
可将程序代码应用于输入指令,以执行本申请描述的各功能并生成输出信息。可以按已知方式将输出信息应用于一个或多个输出设备。为了本申请的目的,处理系统包括具有诸如例如数字信号处理器(DSP)、微控制器、专用集成电路(ASIC)或微处理器之类的处理器的任何系统。
程序代码可以用高级程序化语言或面向对象的编程语言来实现,以便与处理系统通信。包括但不局限于OpenCL、C语言、C++、Java等。而对于C++、Java之类语言,由于其会将存储进行转换,基于对于本申请实施例中的用于寄存器溢出的编译方法的应用会有些差异,本领域技术人员可以基于具体地高级语言进行变换,均不脱离本申请实施例的范围。
在一些情况下,所公开的实施例可以以硬件、固件、软件或其任何组合来实现。所公开的实施例还可以被实现为由一个或多个暂时或非暂时性机器可读(例如,计算机可读)存储介质承载或存储在其上的指令,其可以由一个或多个处理器读取和执行。例如,指令可以通过网络或通过其他计算机可读介质分发。因此,机器可读介质可以包括用于以机器(例如,计算机)可读的形式存储或传输信息的任何机制,包括但不限于,软盘、光盘、光碟、只读存储器(CD-ROMs)、磁光盘、只读存储器(ROM)、随机存取存储器(RAM)、可擦除可编程只读存储器(EPROM)、电可擦除可编程只读存储器(EEPROM)、磁卡或光卡、闪存、或用于利用因特网以电、光、声或其他形式的传播信号来传输信息(例如,载波、红外信号数字信号等)的有形的机器可读存储器。因此,机器可读介质包括适合于以机器(例如,计算机)可读的形式存储或传输电子指令或信息的任何类型的机器可读介质。
在附图中,可以以特定布置和/或顺序示出一些结构或方法特征。然而,应该理解,可能不需要这样的特定布置和/或排序。而是,在一些实施例中,这些特征可以以不同于说明性附图中所示的方式和/或顺序来布置。另外,在特定图中包括结构或方法特征并不意味着暗示在所有实施例中都需要这样的特征,并且在一些实施例中,可以不包括这些特征或者可以与其他特征组合。
需要说明的是,本申请各设备实施例中提到的各单元/模块都是逻辑单元/模块,在物理上,一个逻辑单元/模块可以是一个物理单元/模块,也可以是一个物理单元/模块的一部分,还可以以多个物理单元/模块的组合实现,这些逻辑单元/模块本身的物理实现方式并不是最重要的,这些逻辑单元/模块所实现的功能的组合才是解决本申请所提出的技术问题的关键。此外,为了突出本申请的创新部分,本申请上述各设备实施例并没有将与解决本申请所提出的技术问题关系不太密切的单元/模块引入,这并不表明上述设备实施例并不存在其它的单元/模块。
需要说明的是,在本专利的示例和说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
虽然通过参照本申请的某些优选实施例,已经对本申请进行了图示和描述,但本领域的普通技术人员应该明白,可以在形式上和细节上对其作各种改变,而不偏离本申请的精神和范围。

Claims (14)

1.一种用于寄存器溢出的编译方法,应用于电子设备,其特征在于,所述电子设备上安装有编译器,所述电子设备包括位于处理器中的多个寄存器、第一存储单元和第二存储单元;并且所述方法包括:
所述编译器获取待编译程序;
所述编译器对所述待编译程序进行编译,得到待执行指令;
其中,在所述编译器对所述待编译程序进行编译包括:
对应于所述待编译程序所包括的第一变量对应的第一寄存器发生溢出,将所述第一寄存器溢出的变量部分分配至所述第一寄存器对应的第一存储单元;
对应于所述待编译程序所包括的第二变量对应的第二寄存器发生溢出,将所述第二寄存器溢出的变量部分分配至所述第二寄存器对应的第二存储单元;
其中,所述处理器对所述第一存储单元和所述第二存储单元的访问速度不同。
2.根据权利要求1所述的用于寄存器溢出的编译方法,其特征在于,所述第一寄存器为向量寄存器,所述第二寄存器为标量寄存器。
3.根据权利要求1所述的用于寄存器溢出的编译方法,其特征在于,所述对应于所述待编译程序所包括的第一变量对应的第一寄存器发生溢出,将所述第一寄存器溢出的变量部分分配至所述第一寄存器对应的第一存储单元,包括:
所述编译器确定所述第一寄存器发生溢出,并确定所述第一寄存器对应的第一寄存器类别;
所述编译器根据所述第一寄存器类别,确定所述第一寄存器类别对应所述第一存储单元;
所述编译器将所述第一寄存器溢出的变量部分分配至所述第一寄存器类别对应的所述第一存储单元。
4.根据权利要求3所述的用于寄存器溢出的编译方法,其特征在于,所述对应于所述待编译程序所包括的第二变量对应的第二寄存器发生溢出,将所述第二寄存器溢出的变量部分分配至所述第二寄存器对应的第二存储单元,包括:
所述编译器确定所述第二寄存器发生溢出,并确定所述第二寄存器对应的第二寄存器类别;
所述编译器根据所述第二寄存器类别,确定所述第二寄存器类别对应所述第二存储单元;
所述编译器将所述第二寄存器溢出的变量部分分配至所述第二寄存器类别对应的所述第二存储单元。
5.根据权利要求4所述的用于寄存器溢出的编译方法,其特征在于,所述第一寄存器类别和所述第二寄存器类别是根据所述多个寄存器的访问频次确定的。
6.根据权利要求4所述的用于寄存器溢出的编译方法,其特征在于,所述处理器对所述第一寄存器类别的所述第一寄存器的访问频次高于对所述第二寄存器类别的第二寄存器的访问频次,所述处理器对所述第一存储单元的访问速度高于所述处理器对所述第二存储单元。
7.根据权利要求1所述的用于寄存器溢出的编译方法,其特征在于,所述电子设备包括处理器,所述第一存储单元为位于所述处理器中的存储单元,所述第二存储单元为位于所述处理器外部的外部存储单元。
8.根据权利要求7所述的用于寄存器溢出的编译方法,其特征在于,所述第一存储单元为静态随机存取存储器,所述第二存储单元为双倍速率同步动态随机存储器。
9.根据权利要求1所述的用于寄存器溢出的编译方法,其特征在于,所述第一存储单元包括第一堆栈存储区域;
所述编译器将所述第一寄存器溢出的变量部分分配至所述第一寄存器对应的第一存储单元,包括:
所述编译器将所述第一寄存器溢出的变量部分分配至所述第一堆栈存储区域,其中,所述第一寄存器溢出的变量部分在所述第一堆栈存储区域中以堆栈的方式进行存储。
10.根据权利要求1所述的用于寄存器溢出的编译方法,其特征在于,所述第二存储单元包括第二堆栈存储区域;
所述编译器将所述第二寄存器溢出的变量部分分配至所述第二寄存器对应的第二存储单元,包括:
所述编译器将所述第二寄存器溢出的变量部分分配至所述第二堆栈存储区域,其中,所述第二寄存器溢出的变量部分在所述第二堆栈存储区域中以堆栈的方式进行存储。
11.根据权利要求1所述的用于寄存器溢出的编译方法,其特征在于,所述编译器将所述第一寄存器溢出的变量部分分配至所述第一寄存器对应的第一存储单元,包括:
所述编译器将所述第一寄存器溢出的变量部分分配至所述第一存储单元;
所述编译器为所述第一寄存器溢出的变量部分插入寄存器溢出指令;
所述编译器将所述第二寄存器溢出的变量部分分配至所述第二寄存器对应的第二存储单元,包括:
所述编译器将所述第二寄存器溢出的变量部分分配至所述第二存储单元;
所述编译器为所述第二寄存器溢出的变量部分插入寄存器溢出指令。
12.一种电子设备,其特征在于,包括:
存储器,用于存储由电子设备的一个或多个处理器执行的指令,以及
处理器,是电子设备的处理器之一,用于控制执行权利要求1至11中任一项所述的用于寄存器溢出的编译方法。
13.一种计算机可读存储介质,其特征在于,所述存储介质上存储有指令,所述指令在计算机上执行时使所述计算机执行权利要求1至11中任一项所述的用于寄存器溢出的编译方法。
14.一种计算机程序产品,其特征在于,所述计算机程序产品包括指令,该指令在执行时使计算机执行权利要求1至10中任一项所述的用于寄存器溢出的编译方法。
CN202211072873.4A 2022-09-02 2022-09-02 用于寄存器溢出的编译方法、电子设备和介质 Pending CN115357230A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211072873.4A CN115357230A (zh) 2022-09-02 2022-09-02 用于寄存器溢出的编译方法、电子设备和介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211072873.4A CN115357230A (zh) 2022-09-02 2022-09-02 用于寄存器溢出的编译方法、电子设备和介质

Publications (1)

Publication Number Publication Date
CN115357230A true CN115357230A (zh) 2022-11-18

Family

ID=84005663

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211072873.4A Pending CN115357230A (zh) 2022-09-02 2022-09-02 用于寄存器溢出的编译方法、电子设备和介质

Country Status (1)

Country Link
CN (1) CN115357230A (zh)

Similar Documents

Publication Publication Date Title
CN110727604B (zh) 一种数据处理方法及装置
CN103970694A (zh) 用于更新图像的部分帧的片上系统和操作它的方法
US20240111669A1 (en) Allocation of memory within a data type-specific memory heap
CN114968384B (zh) 一种功能调用方法和装置
CN115357230A (zh) 用于寄存器溢出的编译方法、电子设备和介质
JP2004240965A (ja) Java(登録商標)プログラムでのクラスローディング過程を短縮するシステム及び方法
US7681009B2 (en) Dynamically updateable and moveable memory zones
WO2023065815A1 (zh) 文件系统部署及扩展方法、装置、设备及存储介质
CN112416294B (zh) 处理器及其二进制累加方法和计算机可读介质
CN112262374A (zh) 一种内存管理方法、装置及系统
CN116136826A (zh) 内存访问方法、芯片、电子设备及计算机可读存储介质
CN111459462B (zh) 分散式重锁降级
CN116560741B (zh) 一种硬件初始化方法、介质及电子设备
CN115480762A (zh) 显示视图控件的方法及装置
CN115099393B (zh) 神经网络结构搜索方法及相关装置
CN114398011B (zh) 数据存储方法、设备和介质
CN117130541B (zh) 存储空间配置方法及相关设备
CN113419702B (zh) 一种数据累加方法、处理器、电子设备及可读介质
CN105808453B (zh) 嵌入式装置及其存储器管理方法
WO2023231900A1 (zh) 一种内存管理方法及相关装置
CN116029337A (zh) 一种数据处理方法、片上系统、电子设备及介质
CN113064724B (zh) 一种内存分配管理方法、装置和用于内存分配管理的装置
CN116501481A (zh) 内存回收方法和电子设备
CN117130541A (zh) 存储空间配置方法及相关设备
CN115951933A (zh) 主机、数据处理器的操作方法以及内核程序的编译方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination