CN102831005A - 针对C*core处理器寄存器分配的编译方法及编译器 - Google Patents
针对C*core处理器寄存器分配的编译方法及编译器 Download PDFInfo
- Publication number
- CN102831005A CN102831005A CN2012102432509A CN201210243250A CN102831005A CN 102831005 A CN102831005 A CN 102831005A CN 2012102432509 A CN2012102432509 A CN 2012102432509A CN 201210243250 A CN201210243250 A CN 201210243250A CN 102831005 A CN102831005 A CN 102831005A
- Authority
- CN
- China
- Prior art keywords
- registers
- parameter
- variable
- function call
- register
- 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.)
- Granted
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供一种针对C*core处理器的优化寄存器分配的编译方法,包括对包括对前端生成的中间代码的进一步处理,并根据函数中变量的类型、数量及生命期特征,对寄存器的分配进行优化。并提供了一种针对此种方法的编译器,由于采用上述技术方案,使得在编译过程中进行寄存器分配时可尽量的减少抛出行为,可使处理器减少压栈出栈的次数,提高处理器执行代码的效率。
Description
技术领域
本发明属于计算机领域,涉及嵌入式系统,尤其是涉及一种针对C*core处理器的优化寄存器分配的编译方法及编译器。
背景技术
寄存器分配,是通过将程序变量尽可能地分配到寄存器,从而提高程序执行速度的一种方法。寄存器是编译器优化中最为重要的问题之一(好的寄存器分配能够提高程序执行速度超过250%);也是编译器理论中最热点的研究领域之一。
寄存器是位于处理器(CPU)内部的少量的高速存储单元。寄存器与内存有很大的不同:首先,寄存器数量很少很少,一个寄存器可以用几个比特直接定位,这样就可以在指令中直接指定某一个寄存器;而内存空间很大,内存的定位一般是通过间接的“寻址方式”来实现的,在这个过程中可能包含一个或多个对寄存器的使用;其次,寄存器访问速度很快,在一个周期内,处理器可以分别读两个寄存器,同时写第三个寄存器;而内存的访问则要慢些,一次访问就需要几个周期。正是因为寄存器的个数受限和它的高速度,它们成为大多数计算机体系结构中的关键资源之一。这也使得寄存器分配的方法变得更加重要。一种比较简单的情况,计算机所要执行的每条指令的操作数要放在寄存器里,在复杂表达式的计算过程中产生的中间结果也要在寄存器里;稍微复杂的情况是编译器会把经常使用的变量放在寄存器里,避免反复地存取;而如果是带有优化功能的编译器,它会把编译过程中的公共子表达式消除或循环变量更新以后的值,放入寄存器中。可靠的分配器必要能很好地对付复杂的程序和稀少的寄存器的情况,而实现好的寄存器分配总是很困难的,即使是最简单的实现也会因为机器的特殊细节变得复杂。
图着色(graph coloring)方法是解决寄存器分配问题最常用的方法。利用相交图(interference graph)来表示程序变量的生命期是否相交,将寄存器分配给变量的问题,可以近似地看成是给相交图着色:相交图中,相交的节点不能着同一颜色;每一种颜色对应一个寄存器。Chaitin等人最早提出了基于图着色的寄存器分配方法其着色思路采用了Kempe的着色方法,即,任意一个邻居节点数目少于k的节点,都能够被k着色。但是,寄存器分配不仅仅是图着色的问题。当寄存器数目不足以分配某些变量时,就必须将这些变量溢出到内存中,该过程称为抛出(spill)。要想提高编译器编译出来的代码的效率,就必须减少抛出的发生。
发明内容
为解决上述技术问题,本发明采用的技术方案是:一针对C*core处理器的寄存器分配的编译方法,包括对前端生成的中间代码的进一步处理,其特征在于:该方法还包括:
第一步骤:判断源程序是否存在函数调用;
第二步骤:如果存在函数调用,则检测程序中的函数调用所用的参数,并得出参数的数据;如果没有,则直接生成最终汇编语言;
第三步骤:根据第二步骤的结果和寄存器的个数进行初次分配,如果参数与变量的数量总数不大于寄存器的个数,则寄存器分配结束,如果参数与变量的数量总数大于寄存器的个数,则转入下一步骤;
第四步骤:根据第二步骤所检测的结果,按照非同一生命期的相同类型的变量可分配在一个寄存器的规则对第三步骤初次分配的结果进行优化;
第五步骤:根据第四步骤的优化分配方法,如果寄存器的个数满足优化后变量的数目要求,则进入下一步骤;如果寄存器的个数仍不能满足优化后变量的数目要求,则根据第二步骤中所得到的函数中参数的数据来重新调整寄存器分配比例;
第六步骤:根据以上步骤生成最后的汇编指令。
进一步的,所述的第二步骤中检测程序中的函数调用所用的参数,并得出参数的数据是指包括参数的类型、数量、生命期。
更进一步的,一种所述的针对C*core处理器的寄存器分配的编译器,包括编译器前端,其特征在于:所述的编译器还包括用于判断是否有函数调用操作的函数调用检测单元和用于对函数调用进行分析,提取参数传递信息的函数传参处理单元。
由于采用上述技术方案,使得在编译过程中进行寄存器分配时,尽量的减少抛出行为,这样即可使处理器减少压栈出栈的次数,又提高处理器执行代码的效率。
附图说明
图1是本发明的流程图;
图2是本发明一个实施例的变量图着色示意图;
图3是本发明一个实施例的变量周期图;
图4是本发明中对寄存器优化的流程图;
图5是本发明实例的两种编译方法结果对比图;
具体实施方式
下面结合附图和实例对本发明做进一步的阐述,如图1所示,本发明采用的方法与现有技术的区别在于在对程序进行完前端处理以后,加入了对程序中是否存在函数调用进行检测,如果不存在函数调用,则直接输出汇编指令,如果存在函数调用,则需要根据检测结果对函数进行处理,并根据处理结果来确定寄存器的分配,最后输出汇编指令。
以函数
编译器对该段函数进行完前端处理之后,函数调用检测单元对程序中是否存在函数调用进行检测,当检测到该函数存在时,则由函数传参处理单元对函数调用进行分析。并对参数的(该参数是整型、字符型、指针或是其它类型变量)、数量(此函数所传递参数的个数为一个、两个或是多个)及生命期进行分析,分析的目的是为了下一步骤来针对寄存器的存储情况对变量进行合理的分配。
根据上一步骤的结果对寄存器进行初次的分配,该次分配主要保证参数传递过程能过顺利进行,而不必进行压栈、出栈操作。这种分配必须基于可用来分配的寄存器的数量大于或者等于变量的数量。根据图着色理论,当变量的个数大于用于分配的寄存器的数目时,就会发生抛出行为。对本实例中的函数来说,其着色图如图2所示。
首先,根据参数和变量的总和与预分配的寄存器的个数进行比较,如果参数和变量的总和小于或者等于预分配的寄存器的个数,则可以直接生成汇编代码;如果寄存器的个数无法满足函数中变量与参数的个数需求时,在此函数中,如果寄存器只有2个参数传递寄存器和14个函数调用寄存器,无法满足该函数的需求时,编译器就会对函数的参数进行压栈,从而降低所产生的汇编代码的效率。一般来说,如果两个同一类型的变量的生命期在函数的某一点是同时活跃(live)的,它们就相互冲突,不能占有同一个寄存器,由图3可以看出,程序变量arg1,arg2和arg3会同时使用,所以不可以把它们都指派给同一个寄存器。但是,一个变量的最后一次引用在另一个变量的第一次引用之前,那么它们可以被分配给同一寄存器。根据这样的原则对预分配的寄存器分配进行调整,能够使寄存器尽量减少抛出行为。
如果根据上述方法仍然没有足够的寄存器个数来满足该函数的需求时,会根据以前对该函数分析的结果,即类型,数量,生命期。编译器会将生命期较短的参数和变量抛出,以达到要使压栈、出栈(load/store)指令的动态开销最小的目的。以上述函数为例,若采用固定参数传递寄存器的方法,假设参数传递寄存器的个数为2,则明显寄存器的个数不满足所传参数的个数,此时,编译器就会对参数进行压栈(将arg3进行压栈,当使用arg3时就必须产生一条ldw指令),从而产生执行效率很低的ld/st存取存储器的指令,从而降低最终产生的可执行汇编代码的效率。而在本发明中,通过对函数所传递的参数的个数和类型进行分析,最终确定寄存器分配比例的方法,这样可以使本例中的参数传递寄存器的个数为4,从而满足函数参数传递的要求(给arg1,arg2和arg3各分配一个寄存器),使函数参数传递过程不必进行压栈操作,同时,对变量的寄存器分配也进行评估(给var1,var2,var3及var2t各分配一个寄存器),看其是否会产生更多的ld/st指令,如果没有导致变量分配寄存器时产生的ld/st指令数增加,则采用当前寄存器分配比例。
由图5可以看出,调整后的寄存器分配方案比调整前少了一条lrw指令,而lrw指令在汇编中是执行速度较慢的指令,这样一来,执行效率低的指令减少了就可以增加汇编代码的执行效率,进而增加处理器的效率;如果导致ld/st数目增加,则重新进行评估,比较减少参数传递压栈操作和增加的ld/st操作的动态开销,如果所带来的动态开销要小于增加ld/st增加的开销,则同样确定为此时的寄存器分配比例。如此方法,则可以最大限度的利用有限的寄存器资源,使产生的汇编代码效率更高。
以上对本发明的一个实施例进行了详细说明,但所述内容仅为本发明的较佳实施例,不能被认为用于限定本发明的实施范围。凡依本发明申请范围所作的均等变化与改进等,均应仍归属于本发明的专利涵盖范围之内。
Claims (3)
1.一种针对C*core处理器的寄存器分配的编译方法,包括前端处理生成的中间代码,其特征在于:该方法还包括:
第一步骤:判断源程序是否存在函数调用;
第二步骤:如果存在函数调用,则检测程序中的函数调用所用的参数,并得出参数的数据;如果没有,则直接生成最终汇编语言;
第三步骤:根据第二步骤的结果和寄存器的个数进行初次分配,如果参数与变量的数量总数不大于寄存器的个数,则寄存器分配结束,如果参数与变量的数量总数大于寄存器的个数,则转入下一步骤;
第四步骤:根据第二步骤所检测的结果,按照非同一生命期的相同类型的变量可分配在一个寄存器的规则对第三步骤初次分配的结果进行优化;
第五步骤:根据第四步骤的优化分配方法,如果寄存器的个数满足优化后变量的数目要求,则进入下一步骤;如果寄存器的个数仍不能满足优化后变量的数目要求,则根据第二步骤中所得到的函数中参数的数据来重新调整寄存器分配比例;
第六步骤:根据以上步骤生成最后的汇编指令。
2.根据权利要求1所述的编译方法,其特征在于:所述的第二步骤中检测程序中的函数调用所用的参数,并得出参数的数据,包括参数的类型、数量、生命期。
3.一种根据权利要求1所述的针对C*core处理器的寄存器分配的编译器,包括编译器前端,其特征在于:所述的编译器还包括用于判断是否有函数调用操作的函数调用检测单元以及用于对函数调用进行分析,提取参数传递信息的函数传参处理单元。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210243250.9A CN102831005B (zh) | 2012-07-13 | 2012-07-13 | 针对C*core处理器寄存器分配的编译方法及编译器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210243250.9A CN102831005B (zh) | 2012-07-13 | 2012-07-13 | 针对C*core处理器寄存器分配的编译方法及编译器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102831005A true CN102831005A (zh) | 2012-12-19 |
CN102831005B CN102831005B (zh) | 2015-10-28 |
Family
ID=47334154
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210243250.9A Active CN102831005B (zh) | 2012-07-13 | 2012-07-13 | 针对C*core处理器寄存器分配的编译方法及编译器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102831005B (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103345392A (zh) * | 2013-06-26 | 2013-10-09 | 华为技术有限公司 | 处理信息的方法及其装置 |
CN103942083A (zh) * | 2014-04-28 | 2014-07-23 | 中国人民解放军国防科学技术大学 | 一种面向可变参函数的编译实现方法 |
CN104216754A (zh) * | 2014-09-23 | 2014-12-17 | 天津国芯科技有限公司 | 一种生成快速出栈的汇编代码的编译方法及编译器 |
CN104679603A (zh) * | 2015-02-03 | 2015-06-03 | 中国科学院计算技术研究所 | 一种非对称的数据三模冗余方法及系统 |
CN104820613A (zh) * | 2015-05-27 | 2015-08-05 | 中国科学院自动化研究所 | 一种异构多核程序的编译方法 |
CN105912304A (zh) * | 2016-03-31 | 2016-08-31 | 中国人民解放军国防科学技术大学 | 向量vliw体系结构图着色寄存器分组分配方法 |
CN106648546A (zh) * | 2016-09-07 | 2017-05-10 | 北京大学 | 用于gpu寄存器分配和并行度管理的协同优化编译方法 |
CN109800086A (zh) * | 2018-12-27 | 2019-05-24 | 芯海科技(深圳)股份有限公司 | 一种优化编译器ram空间的方法 |
CN112052004A (zh) * | 2019-06-05 | 2020-12-08 | 深圳市汇顶科技股份有限公司 | 函数的参数优化方法、编译器、芯片及电子设备 |
CN113742080A (zh) * | 2020-09-10 | 2021-12-03 | 吕戈 | 一种高效的不可变对象执行环境的构建方法及装置 |
CN114661296A (zh) * | 2022-03-28 | 2022-06-24 | 阿里巴巴(中国)有限公司 | 程序代码编译方法、装置、电子设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5530866A (en) * | 1991-07-30 | 1996-06-25 | Tera Computer Company | Register allocation methods having upward pass for determining and propagating variable usage information and downward pass for binding; both passes utilizing interference graphs via coloring |
US20040003385A1 (en) * | 2002-06-28 | 2004-01-01 | Intel Corporation | Inter-procedure global register allocation method |
CN102360280A (zh) * | 2011-10-28 | 2012-02-22 | 浙江大学 | 一种针对混合长度指令集的寄存器分配方法 |
-
2012
- 2012-07-13 CN CN201210243250.9A patent/CN102831005B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5530866A (en) * | 1991-07-30 | 1996-06-25 | Tera Computer Company | Register allocation methods having upward pass for determining and propagating variable usage information and downward pass for binding; both passes utilizing interference graphs via coloring |
US20040003385A1 (en) * | 2002-06-28 | 2004-01-01 | Intel Corporation | Inter-procedure global register allocation method |
CN102360280A (zh) * | 2011-10-28 | 2012-02-22 | 浙江大学 | 一种针对混合长度指令集的寄存器分配方法 |
Non-Patent Citations (1)
Title |
---|
高磊: "媒体处理器编译器中寄存器分配与代码生成技术的研究与实践", 《浙江大学硕士学位论文》 * |
Cited By (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103345392A (zh) * | 2013-06-26 | 2013-10-09 | 华为技术有限公司 | 处理信息的方法及其装置 |
CN103345392B (zh) * | 2013-06-26 | 2017-02-22 | 华为技术有限公司 | 处理信息的方法及其装置 |
CN103942083A (zh) * | 2014-04-28 | 2014-07-23 | 中国人民解放军国防科学技术大学 | 一种面向可变参函数的编译实现方法 |
CN103942083B (zh) * | 2014-04-28 | 2017-10-17 | 中国人民解放军国防科学技术大学 | 一种面向可变参函数的编译实现方法 |
CN104216754B (zh) * | 2014-09-23 | 2017-05-17 | 天津国芯科技有限公司 | 一种生成快速出栈的汇编代码的编译方法及编译器 |
CN104216754A (zh) * | 2014-09-23 | 2014-12-17 | 天津国芯科技有限公司 | 一种生成快速出栈的汇编代码的编译方法及编译器 |
CN104679603A (zh) * | 2015-02-03 | 2015-06-03 | 中国科学院计算技术研究所 | 一种非对称的数据三模冗余方法及系统 |
CN104679603B (zh) * | 2015-02-03 | 2018-02-06 | 中国科学院计算技术研究所 | 一种非对称的数据三模冗余方法及系统 |
CN104820613A (zh) * | 2015-05-27 | 2015-08-05 | 中国科学院自动化研究所 | 一种异构多核程序的编译方法 |
CN104820613B (zh) * | 2015-05-27 | 2018-03-27 | 北京思朗科技有限责任公司 | 一种异构多核程序的编译方法 |
CN105912304A (zh) * | 2016-03-31 | 2016-08-31 | 中国人民解放军国防科学技术大学 | 向量vliw体系结构图着色寄存器分组分配方法 |
CN105912304B (zh) * | 2016-03-31 | 2018-04-20 | 中国人民解放军国防科学技术大学 | 向量vliw体系结构图着色寄存器分组分配方法 |
CN106648546A (zh) * | 2016-09-07 | 2017-05-10 | 北京大学 | 用于gpu寄存器分配和并行度管理的协同优化编译方法 |
CN109800086A (zh) * | 2018-12-27 | 2019-05-24 | 芯海科技(深圳)股份有限公司 | 一种优化编译器ram空间的方法 |
CN109800086B (zh) * | 2018-12-27 | 2022-12-06 | 芯海科技(深圳)股份有限公司 | 一种优化编译器ram空间的方法 |
CN112052004A (zh) * | 2019-06-05 | 2020-12-08 | 深圳市汇顶科技股份有限公司 | 函数的参数优化方法、编译器、芯片及电子设备 |
CN113742080A (zh) * | 2020-09-10 | 2021-12-03 | 吕戈 | 一种高效的不可变对象执行环境的构建方法及装置 |
CN113742080B (zh) * | 2020-09-10 | 2024-03-01 | 吕戈 | 一种高效的不可变对象执行环境的构建方法及装置 |
CN114661296A (zh) * | 2022-03-28 | 2022-06-24 | 阿里巴巴(中国)有限公司 | 程序代码编译方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN102831005B (zh) | 2015-10-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102831005A (zh) | 针对C*core处理器寄存器分配的编译方法及编译器 | |
Deverge et al. | WCET-directed dynamic scratchpad memory allocation of data | |
Kailas et al. | CARS: A new code generation framework for clustered ILP processors | |
Nanda et al. | Decentralizing execution of composite web services | |
US8533698B2 (en) | Optimizing execution of kernels | |
US8468507B2 (en) | Binding executable code at runtime | |
US20060242633A1 (en) | Compiling computer programs to exploit parallelism without exceeding available processing resources | |
US20110093491A1 (en) | Partitioned query execution in event processing systems | |
WO2014143247A1 (en) | Increasing performance at runtime from trace data | |
Chen et al. | Register allocation for intel processor graphics | |
CN110865814B (zh) | 一种支持异构计算核架构的编译器实现方法和系统 | |
US9342282B2 (en) | Method and apparatus for dynamic data configuration | |
CN101753378A (zh) | 实现并发分析器的系统和方法 | |
Chen et al. | Characterizing scalar opportunities in GPGPU applications | |
Khaldi et al. | Parallelizing with BDSC, a resource-constrained scheduling algorithm for shared and distributed memory systems | |
US8938634B2 (en) | User generated data center power savings | |
CN106293736B (zh) | 用于粗粒度多核计算系统的两级编程装置及其计算方法 | |
Butcher et al. | Optimizing for KNL usage modes when data doesn't fit in MCDRAM | |
CN105045564A (zh) | 图形处理器中的前端动态共享方法 | |
US8387009B2 (en) | Pointer renaming in workqueuing execution model | |
CN112130848B (zh) | 一种面向便笺式存储器的带宽感知循环分块优化方法、编译系统、设备及存储介质 | |
Serban et al. | Autonomic scheduling of tasks from data parallel patterns to CPU/GPU core mixes | |
Lorenz et al. | Compiler based exploration of DSP energy savings by SIMD operations | |
Riffel et al. | Mio: Fast multipass partitioning via priority-based instruction scheduling | |
Zhang et al. | Optimizing data allocation for loops on embedded systems with scratch-pad memory |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |