CN100368992C - 一种解决多寄存器组冲突的方法 - Google Patents

一种解决多寄存器组冲突的方法 Download PDF

Info

Publication number
CN100368992C
CN100368992C CNB2005100771715A CN200510077171A CN100368992C CN 100368992 C CN100368992 C CN 100368992C CN B2005100771715 A CNB2005100771715 A CN B2005100771715A CN 200510077171 A CN200510077171 A CN 200510077171A CN 100368992 C CN100368992 C CN 100368992C
Authority
CN
China
Prior art keywords
register
node
conflict
graph
cost
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.)
Active
Application number
CNB2005100771715A
Other languages
English (en)
Other versions
CN1881175A (zh
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.)
G Cloud Technology Co Ltd
Original Assignee
Institute of Computing Technology of CAS
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 Institute of Computing Technology of CAS filed Critical Institute of Computing Technology of CAS
Priority to CNB2005100771715A priority Critical patent/CN100368992C/zh
Publication of CN1881175A publication Critical patent/CN1881175A/zh
Application granted granted Critical
Publication of CN100368992C publication Critical patent/CN100368992C/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种解决多寄存器组冲突的方法,包括:1)建立寄存器冲突图,图中的每个节点都代表一个虚拟寄存器,各个节点有优先级;两个节点之间存在一条边表示存在寄存器组冲突;2)对节点,按照优先级从高到低的顺序开始分配寄存器组;3)对一个节点,计算被分配到各个寄存器组的代价;4)将代价与阀值做比较,如果所有代价均大于阀值,则对该节点做区间分割,否则执行下一步;5)如果节点分配到一个寄存器组的代价小于其它寄存器组,则指定该寄存器组给节点;6)寄存器冲突图中的所有节点分配完寄存器组后,将结果与寄存器冲突图做比较,如果存在寄存器组冲突,则在所有以这两个节点所对应的虚拟寄存器为源操作数的指令前插入拷贝指令。

Description

一种解决多寄存器组冲突的方法
技术领域
本发明涉及一种解决多寄存器组冲突的方法,特别是涉及一种网络处理器的多个寄存器组冲突的解决方法。
背景技术
网络应用的飞速发展以及新的网络协议的不断出现对网络设备提出了新的挑战。传统采用ASIC(Application Specifiic Integrated Circuit)的方法逐渐暴露出了自身的缺点。虽然这种方法通过硬联电路可以获得很高的效率,但它的设计周期过长,通常是12至18个月,这就使得其难以适应目前网络应用以及协议的发展。同时网络应用以及网络协议正在变得越来越复杂,这使得ASIC设计成本和设计难度也变得越来越难以接受。而另一方面,通用处理器(General Purpose Processor,GPP)可以有很好的灵活性。由于操作系统和编译器的存在,技术人员可以很容易地使用高级程序设计语言进行编程,当网络应用有新的需求或者网络协议发生改变的时候,只需改动相应的软件部分就可以很好地适应。但是由于线速率的提高,处理每个包的时间变短了。如在2.5Gbps的线速率时候,处理一个64byte的包的时间不能够超过200ns。而如果用一个普通的500MHZ的RISC处理器来进行处理的,则程序的指令不能够超过100条。显然,使得程序不超过100条指令是一件非常困难的事情。这就使得通用处理器达不到网络处理的性能要求,因而不能够胜任网络上的大量的包处理的任务。关于通用处理器,请见参考文献1:JianHui Huang,Network ProcessorDesign,ASIC,2003.Proceedings.5th International Conference on Volume 1,21-24Oct.2003Page(s):26-33Vol.1。
网络处理器是一种专门为网络包处理而设计的嵌入式处理器。它综合了ASIC的高性能以及通用处理器的灵活性。很多网络处理器都可以使用高级语言进行编程。当应用需求或网络协议发生改变时,只需改动相应的软件部分即可。这样就节省了用户投资,因而在最近几年得到了很大的发展。许多公司都相继推出了自己的产品如:Intel IXP系列,IBM PowerNP系列,Motorola C-Port系列等。但不可否认的是,由于网络处理的自身的特点,网络处理器的结构通常是与传统的通用处理其结构大相径庭。很多网络处理器采用了多核、硬件多线程、多层的内存体系结构等。关于网络处理器的结构特点请参考文献2:谭章熹,林闯,任丰源,周文江,网络处理器的分析和研究,软件学报Vol.14No.2。网络处理器的结构特点对于传统的编译提出了新的问题和挑战。
与通用处理器相比,网络处理器自身的结构特点会带来新的问题。下面以Intel的IXP2400网络处理器为例来说明网络处理器的多寄存器组结构的问题。IXP2400网络处理器是Intel公司生产的IXP系列网络处理器中的一种,其核心由一个XScale处理器和8个MicroEngine(ME)组成。其中,XScale处理器主要负责程序的控制和管理工作,ME主要用于进行包处理。ME有两种运行模式:4线程模式和8线程模式。这样的主要目的是为了能够隐藏从内存中读数据的延迟(latency hiding)。每个ME上有256个通用寄存器(General Purpose Register,GPR)和512个传输寄存器(Transfer Register)以及128个相邻寄存器(Next Neighbor Register)。其中,通用寄存器主要用于保存算术逻辑运算(ALU)操作的源和目的操作数,传输寄存器主要是用来和存储器(SRAM和DRAM)以及其它IO等交换数据,相邻寄存器主要用于不同的ME之间通信。与一般的通用处理器不同的是,ME的寄存器堆采用了寄存器组的结构。通用寄存器被分成两个组,分别为GPR A和GPR B。这两个组均含有128个寄存器。传输寄存器被分为4个组:SRAM读入(Transfer In)和写回(Transfer Out)寄存器组,DRAM读入(Transfer In)和写回(Transfer Out)寄存器组。这四个组均含有128个寄存器。其中读入寄存器(Transfer In)主要是存放从I/O以及SRAM、DRAM读入的数据,对ALU部件来说,它是只读的。而写回寄存器(Transfer Out)主要存放将写回I/O以及SRAM、DRAM的数据,对ALU部件来说,它是只写的。这样组织寄存器主要是为了减少寄存器数目较多的给硬件逻辑带来的复杂性,同时也为了减少关键数据通路(crittical path)上的延迟。采用传输寄存器的目的是为了实现异步访存,使得访存操作和ALU运算可以同时进行。在8线程模式下,每个ME上的线程可以使用32个通用寄存器(16GPRA+16GPRB)、64个传输寄存器(16SRAM Transfer In+16DRAM Transfer In+16SRAMTransfer Out+16DRAM Transfer Out)。关于IXP 2400网络处理器的详细信息可参见参考文献3:IntelIXP2400Network Processor Hardware Reference Manual。
根据ME的程序员手册,对于每条含有两个源操作数的指令,其操作数都有一定的限制。这种限制被称为为“双源操作数规则”(two source-operand rule)。该规则的主要内容包括:
1、同一条指令的两个源操作数不能来自同一个寄存器组;
2、同一条指令的两个源操作数不能同时来自SRAM Transfer In,DRAMTransfer In或者Next Neighbor;
3、同一条指令的两个源操作数不能都是立即数。
关于双源操作数规则的具体信息可参见参考文献4:IntelIXP2400/IXP2800Network Processor Programmer’s Reference Manual。
如果一条指令的两个源操作数被指定为同一个寄存器组,就说该指令存在“寄存器组冲突”。例如,有三条指令分别为:a=b+c,c=b+d,e=c+d。由第一条指令可知,b和c不可以在同一个寄存器组中。由第二条指令可知,b和d不可以在同一个寄存器组中。由第三条指令可知,c和d也不可以在同一个寄存器组中。但是,GPR仅仅有GPRA和GPRB两个组。因而上述的指令序列的b、c和d中必然至少有两个变量是在同一个寄存器组中,会产生冲突,这种冲突就称为寄存器组冲突。对于编译器来说,其首要的任务就是要解决这种寄存器组冲突问题,并且使得解决所花费的代价最小。
发明内容
本发明的目的是提供一种解决多寄存器组冲突的方法,解决了普遍存在于嵌入式处理器以及一些超长指令字结构的处理器上的寄存器组冲突问题。
为了实现上述目的,本发明提供了一种解决多寄存器组冲突的方法,包括:
1)根据程序中的指令和双源操作数规则建立寄存器冲突图,一个虚拟寄存器代表指令中的一个操作数,虚拟寄存器用寄存器冲突图中的节点表示,各个节点有各自的优先级;
2)对由步骤1)得到的寄存器冲突图中的所有节点,按照优先级从高到低的顺序开始分配寄存器组;
3)对寄存器冲突图中的一个节点,分别计算该节点被分配到各个寄存器组的代价;
4)将步骤3)计算得到的代价与一个预先设定的阀值做比较,如果所有的代价均大于阀值,则对该节点做区间分割,在所述区间分割完成后,选择下一个节点重新执行步骤3),否则执行下一步;
5)如果节点分配到一个寄存器组的代价小于其它寄存器组,则指定该寄存器组给节点;
6)对寄存器冲突图中的所有节点分配完寄存器组后,将节点指定寄存器组的结果与寄存器冲突图做比较,如果两个节点在寄存器冲突图上是相连的并且被指定到了同一个寄存器组,则它们存在寄存器组冲突,如果节点之间存在寄存器组冲突,则在所有以这两个节点所对应的虚拟寄存器为源操作数的指令前插入拷贝指令,并对所述指令做相应修改;所述拷贝指令将存在寄存器组冲突的两个节点中的一个节点所对应的虚拟寄存器中的值拷贝到一个新建立的和冲突的两个节点的寄存器组不同的虚拟寄存器。
上述技术方案中,所述的步骤1)中的寄存器冲突图的建立过程包括:
1-1、对编译器所处理的编译单元中的一条指令,判断该指令是否为拷贝指令,是,转步骤1-2,否,转步骤1-3;
1-2、当前指令为拷贝指令,指令中仅含有一个目的操作数和一个源操作数,查找目的操作数和源操作数在寄存器冲突图中对应的节点,若没有对应节点,则在寄存器冲突图中新建相应的节点,并将源操作数加入到目的操作数的偏好域中,同样的,也将目的操作数加入到源操作数的偏好域,最后跳转到1-1,处理下一条指令;
1-3、当前指令为双源操作数指令,取得两个源操作数的活跃区间;
1-4、根据两个源操作数的活跃区间的优先级得到两个源操作数的优先级;
1-5、为两个源操作数分配对应的寄存器冲突图节点,如果节点未被加入到寄存器冲突图中,则将节点加入到寄存器冲突图,并将操作数的优先级设为节点的优先级;
1-6、将两个源操作数的节点之间加入一条边,表示两个操作数之间存在冲突;
1-7、转至步骤1-1进行下一条指令的处理,直至编译单元中的所有指令都已处理完毕。
上述技术方案中,所述的步骤3)中节点分配寄存器组的代价计算过程包括:
3-1、检查程序冲突图,计算与所要进行代价计算的节点相冲突且优先级较该节点高的节点的数目,根据该数目看节点是否能被分配到寄存器,如果不能被分配到寄存器,计算溢出代价,否则溢出代价为零;
3-2、计算与所要进行代价计算的节点存在寄存器组冲突的节点的数目,得到需要插入的拷贝指令的数目,从而得出拷贝代价;
3-3、计算寄存器冲突图中其他节点给所要进行代价计算的节点的好处,所述的好处在代价计算时可降低节点的代价值;
3-4、将溢出代价、拷贝代价和好处做累加,得到最后的节点代价。
所述的程序冲突图由编译器的其它优化阶段中得到。
上述技术方案中,所述的步骤4)中的区间分割包括以下步骤:
4-1、根据要做区间分割的节点的活跃区间建立活跃区间图;
4-2、检查活跃区间图是否连通,如果该图非连通,找出每个连通分量;
4-3、对一个连通分量,检查冲突图中与它相冲突的节点,判断该连通分量是否可以分配得到寄存器;
4-4、标记可以被分配寄存器的连通分量,对这些连通分量不再进行处理;
4-5、如果所有的连通分量都被标记为可分配,则转至步骤4-7;
4-6、对不可分配的连通分量,继续做最小二切割,并将切边加入到一个切边集合中,对最小二切割后得到的新的连通分量转步骤4-3;
4-7、对每个连通分量指派相应的寄存器组,并在切边上加入相应的拷贝补偿代码。
所述的建立活跃区间图的方法包括:
4-1-1、在控制流图中,如果一个基本块对所要分割的节点活跃,对该基本块建立相应的节点;
4-1-2、对节点所对应的基本块,如果该基本块在控制流图中是相连的,则也将基本块对应的节点相连,同时在相连的边上标明原来控制流图中对应的边的频率。
所述的步骤4-2中,对连通分量的查找,可通过图深度优先遍历实现。
所述的步骤4-3的具体实现过程为;首先检查冲突图中有多少虚拟寄存器与当前做区间分割的虚拟寄存器存在寄存器冲突;然后对这些存在寄存器冲突的虚拟寄存器的活跃区间做检查,观察其活跃区间中是否有连通分量所含的基本块,得到活跃区间中有连通分量基本块且存在寄存器冲突的虚拟寄存器的数目,最后将该数目与可分配的物理寄存器数目做比较,如果物理寄存器数目较大,则当前的连通分量可分配,否则,不可分配。
本发明的优点在于:
1、本发明的解决多寄存器组冲突的方法解决了一种普遍存在于嵌入式处理器以及一些超长指令字结构的处理器上的寄存器组冲突问题。
2、本发明的解决多寄存器组冲突的方法有较好的优化性能,避免了两个寄存器组的寄存器压力不平衡的问题,提高了代码生成的效率。
3、本发明的解决多寄存器组冲突的方法的复杂度比较低。
附图说明
图1为根据例1中的指令所建立的寄存器冲突图;
图2为例1中的指令所对应的程序冲突图;
图3为例2中虚拟寄存器VR1的控制流图;
图4为例2中虚拟寄存器VR1的活跃区间图;
图5为例2中对虚拟寄存器VR1做区间分割后的控制流图;
图6为本发明的解决多寄存器组冲突的方法的流程图;
图7为本发明的解决多寄存器组冲突的方法中的寄存器冲突图的建立方法流程图;
图8为本发明的解决多寄存器组冲突的方法中的代价计算方法的流程图;
图9为本发明的解决多寄存器组冲突的方法中的区间分割方法的流程图。
具体实施方式
下面结合附图和具体实施方式对本发明所述方法进行详细说明。在本实施例中,以网络处理器中的通用寄存器为例,对于网络处理器中的传输寄存器也可同样的方法进行处理。
本发明的一种解决多寄存器组冲突的方法,包括:
步骤10:建立寄存器冲突图(Register Conflict Graph)。寄存器冲突图是一个无向图,图中的节点表示虚拟寄存器。在寄存器冲突图中,如果两个虚拟寄存器是某个指令的两个源操作数,则在这两个虚拟寄存器所代表的节点之间建立一条边表示它们两个存在寄存器组冲突(bank conflict)。同时,在寄存器冲突图中,某些节点被预先着色,表示这些节点的寄存器组已经被其它优化阶段所指定,不能够进行更改。在建立寄存器冲突图的同时,根据节点在寄存器分配中的顺序设定寄存器冲突图中的每个节点的优先级,寄存器分配中越先被分配的节点具有越高的优先级。根据基于优先级的图着色的寄存器分配的方法,在本发明中只需要将每个虚拟寄存器的优先级定义为其对应的活跃区间的优先级即可。一个变量的活跃区间是一个控制流图中节点的集合(这些节点不一定是连续的),在这些节点中,该变量是活跃的。活跃是指对于变量x和点p,x的值在由p开始的路径上是否引用(使用),如果引用,说x在p点活跃,否则称x在p点死亡。活跃区间的优先级在寄存器分配阶段的开始处通过计算得到,现有技术可实现活跃区间优先级的获取,本发明方法不涉及活跃区优先级的取得。
建立寄存器冲突图的具体步骤包括:
步骤11、对于当前编译器所处理的编译单元(PU,Processing Unit)中的一条指令,判断它是否是拷贝指令,如果是转步骤12;否则转步骤13。
步骤12、当前指令为拷贝指令,它仅仅含有一个目的操作数res和一个源操作数opnda。首先取得res对应的寄存器冲突图节点node_res,如果寄存器冲突图中没有res对应的节点,则建立一个新的节点。将opnda加入node_res的偏好域的集合。对于res,也要将其加入目的操作数对应的寄存器冲突图节点node_a的偏好域集合。如果寄存器冲突图节点node_a未包含在寄存器冲突图中,则首先要建立该节点。此处所述的偏好域主要是给寄存器分配的,它是附着在每个寄存器冲突图的节点上的一个关于拷贝指令的信息。对于程序中的拷贝指令,它不受“双源操作数规则”的限制,因此源和目的操作数的寄存器组是任意的。引入偏好域,将其源和目的操作数分配到一个寄存器组中,可以给后面的优化阶段提供优化机会。转至步骤11,继续进行下一条指令的处理。
步骤13、当前指令为普通的指令,取得它的两个源操作数opnda和opndb。转步骤14。
步骤14、取得两个源操作数的活跃区间,根据操作数的活跃区间的优先级分别取得操作数相应的优先级pri_a和pri_b。
步骤15、为两个源操作数分配对应的寄存器冲突图节点node_a和node_b,如果节点尚未被加入寄存器冲突图中,则将其插入寄存器冲突图。同时设置node_a的优先级为pri_a,node_b的优先级为pri_b。如果opnda或者opndb上面已经被标记了物理寄存器,则将其对应的节点也标记相应的寄存器号和寄存器组。
步骤16、在这两个节点之间加入一条边,表示它们相冲突。
步骤17、转至步骤11进行下一条指令的处理,直至编译单元中的所有指令都已处理完毕。
在程序中,除了所述的拷贝指令和带双源操作数的指令外,还会有其它类型的指令,对于这类指令,由于不存在寄存器组冲突问题,因此当遇到其它类型指令时,跳过该指令,直接处理下一条指令。
为了便于对寄存器冲突图建立过程的理解,下面举例说明。
例1:下面显示的是一个程序的部分片断,它由以下指令组成:
1b=a
2c=b
3d=b+c
4e=c+d
5c=b+d
其中a、b、c、d、e均为虚拟寄存器。根据双源操作数规则,由第三条指令可知b和c不能够分配到同一个寄存器组。由第四条指令可知c和d不能够分配到同一个寄存器组。由第五条指令可知d和b不能够分配到同一个寄存器组,而第一、二条指令中不存在寄存器冲突。由步骤11至步骤17建立如图1所示的寄存器冲突图。在图中,b、c、d三个节点间相冲突,三个节点相连。对于第1、2条指令,他们是拷贝指令。因此根据步骤12,在对于第1条指令的处理时,将a加入b对应的寄存器冲突图节点的偏好域集合,同时也将b加入a对应的寄存器冲突图节点的偏好域集合。对于第2条指令,同样根据步骤12,最后可以得到a对应的寄存器冲突图节点的偏好域集合为{b},b对应的寄存器冲突图节点的偏好域集合为{a,c},c对应的寄存器冲突图节点的偏好域集合为{b}。
一条指令,如果其中的两个操作数存在寄存器组冲突,该指令称为冲突指令。在本发明所述方法中,解决寄存器组冲突的基本思想是在冲突指令前插入一条拷贝指令来解决寄存器组冲突。例如,对于一条指令r=op(a,b),其中a和b为两个寄存器源操作数,如果a和b被指定到了同一个寄存器组中,则该指令存在寄存器组冲突。如果在这条指令前面插入一条c=a的拷贝指令,之后将源指令中的a替换为c得到r=op(c,b)。其中,c是一个临时变量,它的寄存器组与a、b不同。通过这种方法解决了原指令中的寄存器组冲突。
利用在冲突指令前插入拷贝指令的方法解决寄存器组冲突要付出一定的代价,包括拷贝代价和溢出代价。
拷贝代价是指在解决寄存器组冲突时,拷贝指令需要一个时钟周期来完成,因此程序性能会造成一定程度的下降。同时,考虑到IXP 2400是一款嵌入式处理器,其上的每个ME只能够存储4k个40位长度的指令。如果寄存器组冲突问题解决得不好,就会导致过多的拷贝指令在这个阶段被插入而使得最终编译出的代码过于庞大而难以接受。因此,在实际解决寄存器组冲突的时候,应当考虑实际插入的拷贝指令的数量,以免代码过于庞大。
溢出代价是指在网络处理器中,虽然每个ME有256个通用寄存器可用,但当ME工作在8线程模式下,每个线程只有32个通用寄存器(16GPR A+16GPR B)可用。如果把那些没有冲突的虚拟寄存器过多地指定给了一个寄存器组,就会使得这个寄存器组的寄存器压力过于庞大而产生较多的溢出(Spill)操作,而另一个寄存器组却没有被完全利用。溢出操作需要处理器付出相当的代价,因此在解决寄存器冲突时应当尽量平衡两个寄存器组的压力,尽量减少溢出操作。
根据寄存器冲突图,对图中的所有节点,从拥有最高优先级的节点到最低优先级的节点按照一个给定的代价模型指定每个虚拟寄存器的寄存器组。在指定寄存器组的过程中,应充分考虑拷贝代价和溢出代价。
步骤20、声明一个名为total_spill_count的变量并将其初始化为0,用于存放虚拟寄存器的溢出数目。
步骤30、对寄存器冲突图中的所有节点,按照优先级从高到低的顺序对其进行寄存器组分配,优先级越高的节点越先被分配到寄存器组。在寄存器冲突图中的某些节点,它们的优先级是相同的,对于优先级一致的节点,分配寄存器组的顺序随机产生,但应当保证优先级一致的节点在低优先级的节点开始被分配寄存器组前全都实现了寄存器组分配的操作。对节点分配寄存器组的具体操作如下。
步骤31、计算某一节点如果被指定给了GPRA的代价costa。
步骤32、计算某一节点如果被指定给了GPRB的代价costb。
步骤33、如果计算出的两个代价均大于设定的阀值,则进行区间分割,否则,执行下一步。
步骤34、如果某一节点的costa比costb大,则指定GPR B寄存器组给该节点。如果costa比costb小,则指定GPRA寄存器组给该节点。如果两个代价相等,则交替指定这两种寄存器组。
步骤35、将虚拟寄存器指定寄存器组的结果与寄存器冲突图做比较,如果两个虚拟寄存器在寄存器冲突图上是相连的并且被指定到了同一个寄存器组,则它们存在寄存器组冲突。如果两个虚拟寄存器之间存在寄存器组冲突,则在所有以这两个虚拟寄存器为源操作数的指令前插入拷贝指令,即可解决该冲突。
在步骤31和步骤32中,计算节点代价的过程要用到寄存器冲突图和程序冲突图,寄存器冲突图可由前述步骤得到,程序冲突图可由编译器的其他优化阶段(如:寄存器分配)得到。寄存器冲突图是程序冲突图的一个子图。节点代价计算的过程包括:
步骤41、检查程序冲突图,计算与该节点冲突且优先级较所述节点高的节点的数目,结合虚拟寄存器的活跃区间信息对所述节点进行估计,看其是否能被分配到寄存器,如果不能被分配到寄存器,计算溢出代价。
步骤42、计算与当前节点存在寄存器组冲突的节点数目,得到需要插入的拷贝指令数目。
步骤43、计算当前寄存器冲突图节点给其他节点带来的好处。
步骤44、将从步骤41至步骤43所得到的代价和好处做累积,得到最后的节点代价。
节点代价的计算较为复杂,结合一个具体的实施例对其进行说明。
仍以例1中的程序为例,有5个虚拟寄存器,分别为a、b、c、d、e,假设几个虚拟寄存器的优先级为a>b>c>d>e,同时假定GPRA和GPRB均只有两个寄存器可用,寄存器冲突图如图1所示,程序冲突图如图2所示。在本实施例中,为了说明的方便,我们假设每个寄存器组都只用了两个寄存器,程序的指令条数也很少,但本领域的普通技术人员应当明白,本实施例所说明的代价计算方法和寄存器组指派同样适用于指令条数多、寄存器组中寄存器数目多的情况。
分别对寄存器冲突图中的各个节点做代价计算,并指派寄存器组。
1)、对虚拟寄存器a,由于目前其它的b、c、d、e还没有被指派,所以其拷贝代价、溢出代价等均为0。可指派GPRA给a。(指派GPRB的代价也是0)
2)、对于虚拟寄存器b,其偏好域为{a},该好处为1,好处在代价计算时取负值;与之存在寄存器组冲突的是c和d,但是它们均没有被指派寄存器组,故拷贝代价为0;溢出代价也为0,只有一个a和它冲突。故其指派GPRA的代价为-1,GPRB的代价为0。因此指派GPRA给b。
3)、对于虚拟寄存器c,其偏好域为{b},如果指派GPRA,该好处为1;与之存在寄存器组冲突的为b和d,如果指派GPRA,由于b和c之间存在寄存器组冲突,d尚未被指派寄存器组,故拷贝代价为1;如果指派GPRA给c,则和a以及b冲突,由于仅有两个寄存器可用,则c会溢出,则溢出的代价为3×3(3次溢出操作×每次溢出操作的代价,假设溢出到Local Memory,3次溢出操作是指在程序的指令中虚拟寄存器c一次定义,两次引用)。如果指派GPRB,则溢出代价为0。最后,指派GPRA的代价为9+1-1,指派GPRB的代价为0。所以,指派GPR B给c。
4)、对于虚拟寄存器d,其偏好域为空{};与之存在寄存器组冲突的是b和c,如果指派GPRA,则和b冲突,拷贝代价为1,如果指派GPR B,则和c冲突,拷贝代价为1;如果指派GPRA,则和a以及b冲突,由于仅有两个寄存器可用,则d会溢出,溢出代价为2×3(2次溢出操作×每次溢出操作的代价,假设溢出到LocalMemory,2次溢出操作是因为在程序的指令中虚拟寄存器d两次引用),如果指派GPRB,则和c冲突,但是不会被溢出,溢出代价为0。总的代价为:指派GPRA为6+1,指派GPRB为0+1,故指派GPRB给d。
5)、对于虚拟寄存器e,其偏好域为{};不存在寄存器组冲突,指派GPRA或者GPR B的拷贝代价均为0;对于溢出代价,无论其指派到哪个寄存器组,都会被溢出,代价相同。所以可以指派GPRA给e。
最后的结果为:a、b、e指派GPR A,c、d指派GPRB。c和d之间存在一个寄存器组冲突,插入一条拷贝指令。结果为:
b=a
c=b
d=b+c
f=d
e=c+f
c=b+d
其中f为一个新建的虚拟寄存器,其寄存器组为GPRA(需要与c的寄存器组不同)。
在步骤33中,当计算所得的代价大于阀值时,要做区间分割。区间分割是指除了将一个虚拟寄存器指定为一个寄存器组外,还可以将其分割成多个区间,每个区间被指定给一个寄存器组,不同的区间被指定的寄存器组可以不同,相邻的区间之间可以通过拷贝指令来保持语义。利用区间分割可以解决那些由于程序本身原因而产生溢出代码过多而造成性能下降的问题。在IXP上,从SRAM做一个读数据操作需要花费90个指令周期,而从Local Memory中读只需要花费3个指令周期。因此,使用Local Memory作为栈用于溢出代码的插入,使得溢出代价比较小。但是由于Local Memory本身大小的限制,采用Local Memory作为栈是有大小限制的。如果程序中的溢出数目超出了这个数,虚拟寄存器就会被溢出到SRAM上去,这样会对程序的性能造成很大的影响。为了使得溢出代码占用的栈尽量不会超出LocalMemory,可以在不使得代码大小(Code Size)超出规定的情况下通过将一个虚拟寄存器指定给多个寄存器组的方法来减少寄存器的压力。虽然这种方法会插入较多的拷贝指令,但是它同时可以平衡两个寄存器组之间的寄存器压力从而减少溢出的操作、提高程序的性能。
在做区间分割时,首先建立活跃区间图,然后根据活跃区间图分割区间,分配寄存器组,具体实现如下。
步骤50、根据所要分割的虚拟寄存器的活跃区间建立活跃区间图。活跃区间图是控制流图的一个导出子图的基础图。其中,导出子图的节点集合为该虚拟寄存器活跃的基本块集合(基本块的入口和出口处均活跃)。
步骤51、对所要分割的虚拟寄存器活跃的基本块在图中建立对应的节点。
步骤52、对节点所对应的基本块,如果该基本块在控制流图中是相连的,则也将基本块对应的节点相连,同时在相连的边上标明原来控制流图中对应的边的频率。该边主要用于计算插入拷贝指令的代价,具体实现时该信息可以从profiler中取得。
步骤60、分割区间,分配寄存器组。活跃区间建立后,就可以将区间分割转换成对图的分割,分割出的每个部分拥有同样的寄存器组,在图的分割边上,插入相应的补偿代码。为了减少对功能的影响,补偿代码的插入数目应当最少。这样,区间分割可看成一个与图的最小分割类似的问题。
步骤61、对一个虚拟寄存器的活跃区间图,检查该图是否连通,如果该图不是连通的,则找出它的每个连通分量。对连通分量的查找,可通过一个简单的图深度优先遍历实现。利用图深度优先遍历实现对连通分量的查找是成熟的现有技术,详细信息可参见参考文献5:Robert Sedgewick,Algorithms in C++ Parts 5:GraphAlgorithms,Addison Wesley/Pearson 2001。
步骤62、对一个连通分量,检查程序冲突图中与它相冲突的节点,看该连通分量是否可以分配得到寄存器。具体实现中,采用直接看它有多少个相邻节点已经被悲观着色的方法,即首先检查冲突图中有多少虚拟寄存器(节点)与当前做区间分割的虚拟寄存器存在寄存器冲突(不是寄存器组的冲突),然后对这些存在寄存器冲突的虚拟寄存器的活跃区间做检查,观察其活跃区间中是否有连通分量所含的基本块,得到活跃区间中有连通分量基本块且存在寄存器冲突的虚拟寄存器的数目,然后将该数目与可分配的物理寄存器数目做比较,如果物理寄存器数目较大,则当前的连通分量可分配,否则,不可分配。
步骤63、标记可以被分配寄存器的连通分量,对这些连通分量不再进行处理。
步骤64、如果所有的连通分量都被标记为可分配,则转至步骤66。
步骤65、对不可分配的连通分量,继续做最小二切割,并将切边加入到一个切边集合中。对最小二切割后得到的新的连通分量转步骤62。
步骤66、对每个连通分量指派相应的寄存器组,并在切边上加入相应的拷贝补偿代码。
区间分配的过程较为复杂,为了便于理解,用一个实施例对区间分割进行说明。
例2:假设存在一个虚拟寄存器VR1,它在控制流图中的(Control FlowGraph,CFG)使用情况如图3所示。其中DEF表示对于VR1的定值,USE表示对于VR1的使用,图中的BB1等表示基本块的序号。
首先根据步骤50,建立虚拟寄存器VR1的活跃区间图,对每个基本块,在图中建立对应的节点,如果在控制流图中基本块之间相连,则在活跃区间图中将对应的节点连接,并在连接的边上添加执行次数。根据上述方法,建立了如图4所示的虚拟寄存器VR1的活跃区间图。
然后根据活跃区间图,对虚拟寄存器VR1做区间分割。
1)根据步骤61,检查活跃区间图的连通性,可知虚拟寄存器VR1的活跃区间图是连通的。
2)对活跃区间图进行分割,根据步骤65做最小二切割,即将执行次数最小的边做切割,分割得到下面两个集合为:P1:{BB1,BB2},P2:{BB3,BB4,BB5,BB6,BB7},切边集合为BB2->BB4边。
3)判断P1和P2是否可分配,判断过程如步骤62所述,对于P1,它含有基本块BB1,BB2,首先检查到底有哪些虚拟寄存器与当前正在处理的虚拟寄存器冲突(寄存器分配的冲突,不是寄存器组冲突)。之后,看发生寄存器冲突的虚拟寄存器中有哪些对应的活跃区间包含BB1或者BB2。这样得出的满足条件的虚拟寄存器的数目就可以用来判断当前的连通分量是否可以被分配到寄存器。比如假设根据该步骤得出与P1冲突的虚拟寄存器的数目为20,而实际可分配的物理寄存器为32,因为20<32,就认为P1可以被分配到寄存器。根据当前所给出的条件,无法判断某一连通分量是否可分配,此处为了说明的方便,假设P1已经满足可分配条件,而P2仍然不可分配,则对P2继续作分割,此时BB6->BB7所在的边执行次数最小,为切边,得出P3:{BB3,BB4,BB5,BB6},P4:{BB7},切边集合现在变为了{BB2->BB4,BB6->BB7}。
4)对P1,P3以及P4进行检查,假设对P2做分割后得到的P3和P4可分配,则P1,P3以及P4三个连通分量均可分配。将P1标记为VR2,将P3标记为VR1,将P4标记为VR3。根据步骤66,为每个连通分量指派寄存器组,经过代价计算,将VR1指派给了GPRA,VR2和VR3指派给了GPRB,并在切边BB2->BB4和BB6->BB7处插入了拷贝补偿代码。区间分割后的控制流图如图5所示,图中新增的基本块BB8和BB9就是新加入的拷贝补偿代码。
本发明运用寄存器冲突图、代价模型和区间分割方法解决了IXP2400上的寄存器组冲突问题。这样才能与传统的寄存器分配配合起来,取得较好的优化性能,避免了出现两个寄存器组的寄存器压力不平衡的问题,提高了代码生成的效率,从而进一步提高了编译优化性能。同时,本发明的方法不仅仅适用于IXP 2400网络处理器。对于一般的存在多寄存器组结构的处理器,本发明的方法也可以很好的适应。

Claims (8)

1.一种解决多寄存器组冲突的方法,包括:
1)根据程序中的指令和双源操作数规则建立寄存器冲突图,寄存器冲突图中的每个节点都代表一个虚拟寄存器,各个节点有优先级;两个节点之间存在一条边表示它们存在寄存器组冲突;
2)对由步骤1)得到的寄存器冲突图中的所有节点,按照优先级从高到低的顺序开始分配寄存器组;
3)对寄存器冲突图中的一个节点,分别计算该节点被分配到各个寄存器组的代价;
4)将步骤3)计算得到的代价与一个预先设定的阀值做比较,如果所有的代价均大于阀值,则对该节点做区间分割,在所述区间分割完成后,选择下一个节点重新执行步骤3),否则执行下一步;
5)如果节点分配到一个寄存器组的代价小于其它寄存器组,则指定该寄存器组给节点;
6)对寄存器冲突图中的所有节点分配完寄存器组后,将节点指定寄存器组的结果与寄存器冲突图做比较,如果两个节点在寄存器冲突图上是相连的并且被指定到了同一个寄存器组,则它们存在寄存器组冲突,如果节点之间存在寄存器组冲突,则在所有以这两个节点所对应的虚拟寄存器为源操作数的指令前插入拷贝指令,并对所述指令做相应修改;所述拷贝指令将存在寄存器组冲突的两个节点中的一个节点所对应的虚拟寄存器中的值拷贝到一个新建立的和冲突的两个节点的寄存器组不同的虚拟寄存器。
2.根据权利要求1所述的解决多寄存器组冲突的方法,其特征在于,所述的步骤1)中的寄存器冲突图的建立过程包括:
1-1、对编译器所处理的编译单元中的一条指令,判断该指令是否为拷贝指令,是,转步骤1-2,否,转步骤1-3;
1-2、当前指令为拷贝指令,指令中仅含有一个目的操作数和一个源操作数,查找目的操作数和源操作数在寄存器冲突图中对应的节点,若没有对应节点,则在寄存器冲突图中新建相应的节点,并将源操作数加入到目的操作数的偏好域中,同样的,也将目的操作数加入到源操作数的偏好域,最后跳转到1-1,处理下一条指令;
1-3、当前指令为双源操作数指令,取得两个源操作数的活跃区间;
1-4、根据两个源操作数的活跃区间的优先级得到两个源操作数的优先级;
1-5、为两个源操作数分配对应的寄存器冲突图节点,如果节点未被加入到寄存器冲突图中,则将节点加入到寄存器冲突图,并将操作数的优先级设为节点的优先级;
1-6、将两个源操作数的节点之间加入一条边,表示两个操作数之间存在冲突;
1-7、转至步骤1-1进行下一条指令的处理,直至编译单元中的所有指令都已处理完毕。
3.根据权利要求1所述的解决多寄存器组冲突的方法,其特征在于,所述的步骤3)中节点分配寄存器组的代价计算过程包括:
3-1、检查程序冲突图,计算与所要进行代价计算的节点相冲突且优先级较该节点高的节点的数目,根据该数目看节点是否能被分配到寄存器,如果不能被分配到寄存器,计算溢出代价,否则溢出代价为零;
3-2、计算与所要进行代价计算的节点存在寄存器组冲突的节点的数目,得到需要插入的拷贝指令的数目,从而得出拷贝代价;
3-3、计算寄存器冲突图中其他节点给所要进行代价计算的节点的好处,所述的好处在代价计算时可降低节点的代价值;
3-4、将溢出代价、拷贝代价和好处做累加,得到最后的节点代价。
4.根据权利要求3所述的解决多寄存器组冲突的方法,其特征在于,所述的程序冲突图由编译器的其它优化阶段中得到。
5.根据权利要求1所述的解决多寄存器组冲突的方法,其特征在于,所述的步骤4)中的区间分割包括以下步骤:
4-1、根据要做区间分割的节点的活跃区间建立活跃区间图;
4-2、检查活跃区间图是否连通,如果该图非连通,找出每个连通分量;
4-3、对一个连通分量,检查冲突图中与它相冲突的节点,判断该连通分量是否可以分配得到寄存器;
4-4、标记可以被分配寄存器的连通分量,对这些连通分量不再进行处理;
4-5、如果所有的连通分量都被标记为可分配,则转至步骤4-7;
4-6、对不可分配的连通分量,继续做最小二切割,并将切边加入到一个切边集合中,对最小二切割后得到的新的连通分量转步骤4-3;
4-7、对每个连通分量指派相应的寄存器组,并在切边上加入相应的拷贝补偿代码。
6.根据权利要求5所述的解决多寄存器组冲突的方法,其特征在于,所述的建立活跃区间图的方法包括:
4-1-1、在控制流图中,如果一个基本块对所要分割的节点活跃,对该基本块建立相应的节点;
4-1-2、对节点所对应的基本块,如果该基本块在控制流图中是相连的,则也将基本块对应的节点相连,同时在相连的边上标明原来控制流图中对应的边的频率。
7.根据权利要求5所述的解决多寄存器组冲突的方法,其特征在于,所述的步骤4-2中,对连通分量的查找,可通过图深度优先遍历实现。
8.根据权利要求5所述的解决多寄存器组冲突的方法,其特征在于,所述的步骤4-3的具体实现过程为:首先检查冲突图中有多少虚拟寄存器与当前做区间分割的虚拟寄存器存在寄存器冲突;然后对这些存在寄存器冲突的虚拟寄存器的活跃区间做检查,观察其活跃区间中是否有连通分量所含的基本块,得到活跃区间中有连通分量基本块且存在寄存器冲突的虚拟寄存器的数目,最后将该数目与可分配的物理寄存器数目做比较,如果物理寄存器数目较大,则当前的连通分量可分配,否则,不可分配。
CNB2005100771715A 2005-06-16 2005-06-16 一种解决多寄存器组冲突的方法 Active CN100368992C (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CNB2005100771715A CN100368992C (zh) 2005-06-16 2005-06-16 一种解决多寄存器组冲突的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CNB2005100771715A CN100368992C (zh) 2005-06-16 2005-06-16 一种解决多寄存器组冲突的方法

Publications (2)

Publication Number Publication Date
CN1881175A CN1881175A (zh) 2006-12-20
CN100368992C true CN100368992C (zh) 2008-02-13

Family

ID=37519385

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB2005100771715A Active CN100368992C (zh) 2005-06-16 2005-06-16 一种解决多寄存器组冲突的方法

Country Status (1)

Country Link
CN (1) CN100368992C (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102033773B (zh) * 2010-11-12 2013-08-14 西安电子科技大学 基于反图描述的嵌入式系统寄存器分配方法
CN103116485B (zh) * 2013-01-30 2015-08-05 西安电子科技大学 一种基于超长指令字专用指令集处理器的汇编器设计方法
CN115617396B (zh) * 2022-10-09 2023-08-29 上海燧原科技有限公司 应用于新型人工智能处理器的寄存器分配方法及装置

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5901317A (en) * 1996-03-25 1999-05-04 Sun Microsystems, Inc. Method and system for register allocation using multiple interference graphs
CN1271887A (zh) * 1999-04-23 2000-11-01 太阳微系统有限公司 分配堆栈槽的方法与装置

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5901317A (en) * 1996-03-25 1999-05-04 Sun Microsystems, Inc. Method and system for register allocation using multiple interference graphs
CN1271887A (zh) * 1999-04-23 2000-11-01 太阳微系统有限公司 分配堆栈槽的方法与装置

Also Published As

Publication number Publication date
CN1881175A (zh) 2006-12-20

Similar Documents

Publication Publication Date Title
Auslander et al. Fast, effective dynamic compilation
CN104965761B (zh) 一种基于gpu/cpu混合架构的流程序多粒度划分与调度方法
JP4619606B2 (ja) 構成可能なプロセッサを設計する自動化されたプロセッサ生成システムおよびその方法
US11720332B2 (en) Compiling a program from a graph
Kudriavtsev et al. Generation of permutations for SIMD processors
CN108885550A (zh) 复数乘法指令
Bergamaschi et al. Control-flow versus data-flow-based scheduling: combining both approaches in an adaptive scheduling system
CN100368992C (zh) 一种解决多寄存器组冲突的方法
Halstead Jr An assessment of Multilisp: Lessons from experience
Nielsen et al. A behavioral synthesis frontend to the haste/tide design flow
Van Praet et al. Processor modeling and code selection for retargetable compilation
WO2022053152A1 (en) Method of interleaved processing on a general-purpose computing core
CN101727513A (zh) 一种超长指令字处理器的设计和优化方法
Liao et al. A new viewpoint on code generation for directed acyclic graphs
US8051411B2 (en) Method for copy propagations for a processor with distributed register file design
Bergamaschi et al. Scheduling under resource constraints and module assignment
Kennedy et al. Resource-based communication placement analysis
US20100005456A1 (en) Compiling method, compiling apparatus and computer system for a loop in a program
Cox et al. Adding parallelism to visual data flow programs
Drieseberg et al. C to Cellular Automata and execution on CPU, GPU and FPGA
CN103970510B (zh) 用于对流水线中的块进行调度的编译方法和设备
US11675572B2 (en) Sharing data structures
Dieterle et al. Skeleton composition versus stable process systems in Eden
Drieseberg et al. C to Cellular Automata and Execution on CPU, GPU and FPGA.
Zoeteweij A coordination-based framework for distributed constraint solving

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
ASS Succession or assignment of patent right

Owner name: G-CLOUD TECHNOLOGY CO., LTD.

Free format text: FORMER OWNER: INSTITUTE OF COMPUTING TECHNOLOGY, CHINESE ACADEMY OF SCIENCES

Effective date: 20140422

C41 Transfer of patent application or patent right or utility model
COR Change of bibliographic data

Free format text: CORRECT: ADDRESS; FROM: 100080 HAIDIAN, BEIJING TO: 523808 DONGGUAN, GUANGDONG PROVINCE

TR01 Transfer of patent right

Effective date of registration: 20140422

Address after: 523808 Guangdong province Dongguan City Songshan Lake Science and Technology Industrial Park Building No. 14 Keyuan pine

Patentee after: G-Cloud Technology Co., Ltd.

Address before: 100080 Haidian District, Zhongguancun Academy of Sciences, South Road, No. 6, No.

Patentee before: Institute of Computing Technology, Chinese Academy of Sciences

CP02 Change in the address of a patent holder
CP02 Change in the address of a patent holder

Address after: 523808 19th Floor, Cloud Computing Center, Chinese Academy of Sciences, No. 1 Kehui Road, Songshan Lake Hi-tech Industrial Development Zone, Dongguan City, Guangdong Province

Patentee after: G-Cloud Technology Co., Ltd.

Address before: 523808 No. 14 Building, Songke Garden, Songshan Lake Science and Technology Industrial Park, Dongguan City, Guangdong Province

Patentee before: G-Cloud Technology Co., Ltd.