CN105912304A - 向量vliw体系结构图着色寄存器分组分配方法 - Google Patents
向量vliw体系结构图着色寄存器分组分配方法 Download PDFInfo
- Publication number
- CN105912304A CN105912304A CN201610195289.6A CN201610195289A CN105912304A CN 105912304 A CN105912304 A CN 105912304A CN 201610195289 A CN201610195289 A CN 201610195289A CN 105912304 A CN105912304 A CN 105912304A
- Authority
- CN
- China
- Prior art keywords
- register
- network
- instruction
- node
- registers
- 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
- 238000000034 method Methods 0.000 title claims abstract description 135
- 238000004040 coloring Methods 0.000 title claims abstract description 49
- 239000013598 vector Substances 0.000 title claims abstract description 41
- 238000010586 diagram Methods 0.000 title claims abstract description 20
- 230000008569 process Effects 0.000 claims abstract description 54
- 238000004458 analytical method Methods 0.000 claims abstract description 14
- 238000013138 pruning Methods 0.000 claims abstract description 11
- 238000012546 transfer Methods 0.000 claims abstract description 7
- 238000010276 construction Methods 0.000 claims abstract description 5
- 238000013499 data model Methods 0.000 claims abstract description 5
- 238000012545 processing Methods 0.000 claims description 74
- 239000011159 matrix material Substances 0.000 claims description 49
- 230000001343 mnemonic effect Effects 0.000 claims description 6
- 230000000694 effects Effects 0.000 claims description 5
- 230000005540 biological transmission Effects 0.000 claims description 3
- 230000008901 benefit Effects 0.000 abstract description 3
- 230000006870 function Effects 0.000 description 30
- 230000006872 improvement Effects 0.000 description 7
- 238000005516 engineering process Methods 0.000 description 5
- 238000005457 optimization Methods 0.000 description 5
- 239000003086 colorant Substances 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 238000003672 processing method Methods 0.000 description 2
- 230000002452 interceptive effect Effects 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 238000004377 microelectronic Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000013468 resource allocation Methods 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/30105—Register structure
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
一种向量VLIW体系结构图着色寄存器分组分配方法,其步骤为:S1:数据模型的构造;S2:网的构造及属性分析;S3:冲突分析;S4:合并寄存器;依次遍历各个基本块的每一条指令,如果该指令不是寄存器传送指令,则不对它进行任何处理,否则根据寄存器类别和分组属性围绕该指令进行分析和处理;S5:修剪冲突图;按寄存器类别和分组属性的要求,将冲突图中的各个结点压进一个栈中。S6:指派物理寄存器;将栈中的结点依次弹出,在弹出时为结点对应的网指派满足寄存器类别和分组的要求的寄存器,使得任何两个相冲突的结点得到不相同的寄存器。本发明具有原理简单、易实现、可实现在过程全局层面进行有效的寄存器资源分配等优点。
Description
技术领域
本发明主要涉及到代码的编译优化技术领域,特指一种向量VLIW体系结构图着色寄存器分组分配方法,形成面向具有指令条件执行特性的高性能RISC处理器的过程内全局寄存器分配优化技术。
背景技术
寄存器分配是提高代码的指令级并行度的重要处理过程之一,它的主要功能是决定在程序执行的每个点上哪些值应该保存在寄存器中而能够获得较大的收益,并决定哪个值放在哪个寄存器中。对于大多数体系结构来讲,这是最重要的优化。
在各种寄存器分配方法中,图着色方法是过程内全局寄存器分配的一种高度有效的方法,它相比其它方法能够获得更好的代码质量。
图着色全局寄存器分配一般包括如下步骤:
(1)给可以指派到寄存器的对象分配符号寄存器。
(2)确定过程代码内应当作为分配寄存器的候选者。候选者可以简单地定为符号寄存器变量,也可以是变量的生命域。
(3)构造冲突图。冲突图中的结点代表可分配的对象和目标机制实际寄存器,结点之间的弧代表冲突。
(4)用与可分配的寄存器数量相同的颜色数量给冲突图着色,使得任何两个相冲突的结点具有不相同的颜色。
(5)给每一个对象分配与所着色的颜色对应的寄存器。
其中第(4)步给冲突图着色时,需要对冲突图的可着色性进行判断,并在不能达到可着色条件的情况下将溢出代价较小的值将其保存到存储器。判断冲突图是否可着色的典型判据是结点的邻接结点数要小于可分配的物理寄存器数量。图着色全局寄存器分配方法能够产生非常有效的分配,其主要原因是其对生命域及生命域之间的干涉关系的精确描述。因此,图着色方法是优化编译器所采用的主要寄存器分配方法之一。
近年来,随着微电子和微处理器技术的发展,出现了许多从硬件上提升处理器处理能力的技术,处理器的性能得到了巨大的提升。在一些先进的高性能体系结构上,传统的图着色寄存器分配方法也面临如下重要问题:
1)体系结构的进步使得寄存器资源发生了巨大的变化,体系结构中往往有一种以上具有不同用途的寄存器。由于硬件设计上的规定,即使是同一类寄存器,不同的寄存器的应用场合也是不完全同。一个典型的例子是高性能的嵌入式处理器或DSP处理器这类具有谓词执行特性甚至向量处理能力的体系结构,其指令的条件域中允许使用的寄存器一般是通用寄存器集合的一个子集。在这种情况下,影响结点之间的冲突关系的因素增加,冲突图的可着色性也变得复杂。
2)传统的图着色方法的冲突图包含了可分配对象和实际寄存器。但对于DSP这种数据处理能力强的体系结构,其寄存器数量往往较多。这时,前述的冲突图结构增加了图着色寄存器分配处理过程中的时间和空间上的压力,并且限制了进行更激进的寄存器分配优化的自由度。
总的来讲,传统的图着色寄存器分配方法在先进体系结构上的适用性较差,未能充分考虑体系结构的寄存器资源特征和支持指令级并行开发的技术,从而不利于获得高质量的代码,难以充分发挥硬件的性能。
发明内容
本发明要解决的技术问题就在于:针对现有技术存在的技术问题,本发明提供一种原理简单、易实现、可实现在过程全局层面进行有效的寄存器资源分配的向量VLIW体系结构图着色寄存器分组分配方法。
为解决上述技术问题,本发明采用以下技术方案:
一种向量VLIW体系结构图着色寄存器分组分配方法,其步骤为:
S1:与图着色全局寄存器分配过程相关的数据模型的构造;
S2:网的构造及网的属性分析;得到函数中的网之后,按网的遍历顺序给各网命名,以使不同的网有唯一的名称以区别,并进行网的属性分析;
S3:冲突分析;确定邻接矩阵中各个矩阵元的值,其他的数据结构都从该矩阵和网相关的数据获得;
S4:合并寄存器;依次遍历各个基本块的每一条指令,如果该指令不是寄存器传送指令,则不对它进行任何处理,否则围绕该指令进行分析和处理;
S5:修剪冲突图;按寄存器类别和分组属性的要求,将冲突图中的各个结点压进一个栈中;
S6:指派物理寄存器;将栈中的结点依次弹出,在弹出时为结点对应的网指派满足寄存器类别和分组的要求的寄存器,使得任何两个相冲突的结点得到不相同的寄存器。
作为本发明的进一步改进:所述步骤S2包括:
S201:分析各网是否出现在指令的执行条件域;该步骤的实施方法是:遍历各网,对于每一个网,分析其各个use是否出现在指令的条件域,并设置“出现在指令的执行条件域”标识的值;如果网有至少一个use出现在指令的执行条件域,那么认为该网出现在指令的执行条件域,将该标识置为true;如果网的所有的use都不在指令的执行条件域,则将该标识置为false;分析一个use是否在指令的执行条件域的方法是:扫描该use对应的指令的执行条件域的各个词法元素,如果其中的某个词法元素字符串与use对应的变量名相同,则认为该use在指令的执行条件域;如果use所在指令的执行条件域的所有词法元素都不是该use对应的变量,则认为该use没有在指令的执行条件域;
S202:分析需要为网指派的寄存器所属的寄存器类别;该步骤的实现方法是:遍历各网,对于每一个网,根据网的任意一个def或use找到相关的一条指令对象,根据指令对象保存的指令模板信息查找到该def或use对应的操作数所需的寄存器的类别,并将相应的类别编号值赋给网的寄存器类别变量;或在寄存器分配之前分析各变量要求分配的寄存器的类别,然后在这里将得到的寄存器类别编号值直接赋给网的寄存器类别属性变量;
S203:分析网的处理单元属性;该步骤的实现方法是:遍历各网,对于每一个网,直接根据网的相关指令的指令模板中关于处理单元的信息来获取网的处理单元属性;如果指令集中的指令助记符具有直接反映处理单元的特征,或通过直接分析指令助记符的特征来确定网的处理单元属性;
S204:分析需要为网指派的寄存器所属的寄存器分组;该步骤的实现方法是:遍历各网,对于每一个网,如果它的“出现在指令的执行条件域”标识为假,则对应的寄存器分组属性值为“普通寄存器分组”,否则进一步分析该网具体属于哪一个寄存器分组。
作为本发明的进一步改进:所述步骤S3的具体流程为:
S301:定义一个全局的二维数组adjMtx,每一个数组元素是一个布尔型变量;该二维数组就是邻接矩阵;该矩阵的行号和列号都是从0开始以与网的编号对应;
S302:初始化adjMtx;将其行数和列数都设置为网的个数,并将adjMtx的每一个元素的值都设置为false,即先假定各网之间是不互相冲突的;这样,adjMtx为一个方阵;该方阵是一个对称阵,在整个寄存器分配的处理过程中,实际用到的是该方阵的左下三角阵或右上三角阵;
S303:从第1行开始遍历adjMtx的每一行,令当前行号为i;对第i行进行下面所有步骤的处理;
S304:获得行号i对应的网的寄存器类别编号和寄存器分组编号分别赋给regClassA和regGroupTypeA;
S305:遍历该行的第0列到第i-1列的矩阵元素,令当前列号为j;每遍历一列时执行下面所有步骤的处理;
S306:获得列号j对应的网的寄存器类别编号并将其赋值给regClassB;
S307:判断regClassA是否等于regClassB;如果不相等,则跳转到S305去处理下一列,否则执行后面的步骤;
S308:获得列号j对应的网的寄存器分组编号并将其赋值给regGroupTypeB;
S309:判断regGroupTypeA和regGroupTypeB对应的各寄存器分组的内容是否有交集;如果没有交集,则跳转到S305步去处理下一列,否则执行后面的步骤;
S310:判断i对应的网和j对应的网的其中一个在另外一个的任意定值点处是否活跃;如果活跃,则令该矩阵元素的(i,j)和(j,i)的值都为true。
作为本发明的进一步改进:所述步骤S4的具体流程为:
S401:获得该指令中传送涉及的源变量对应的源网和目标变量对应的目标网;
S402:获取源网和目标网的寄存器类型编号,如果两个寄存器类型编号相同,则进行下面步骤的处理,否则终止对本条指令的处理;
S403:获取源网和目标网的寄存器分组编号,如果两个寄存器分组编号是两个不同的特别寄存器分组编号,则终止对本条指令的处理,否则进行下面步骤的处理;
S404:将源网的编号赋给irow,将目标网的编号赋给icol;如果irow>icol,交两者的值交换;
S405:如果adjMtx的(irow,icol)那个元素为真,则终止对本条指令的处理,否则,进行下面各步骤的处理;
S406:设置一个可合并标识bCanCoalesce,并令其为false;将两个结点各自的邻接结点数量相加,结果赋给totAdjNum;
S406:获取将两个网合并所要求的邻接结点数封顶值;
S407:判断两个结点是否满足如下条件之一:(1)totAdjNum<maxAdjNum;(2)与源网结点相邻的结点都与目标网结点相邻;(3)与目标网结点相邻的结点都与源网结点相邻;(4)源网结点的邻接结点的度数都小于maxAdjNum;(5)目标网结点的邻接结点的度数都小于maxAdjNum;如果满足这些条件之一,则认为它们是可以合并的,否则是不可以合并的;
S408:如果上一步的结论是肯定的,则按典型的图着色方法中的寄存器合并方法将两个结点及相应的网合并;寄存器合并时,保留的网要是对应寄存器分组中寄存器数量较少的那个网,其编号为iwebSrc。
作为本发明的进一步改进:所述步骤S5的具体流程为:
S501:创建一个空栈nodeStack;该栈将用于存储被压栈的各个冲突图结点;
S502:创建一个集合residualNodes,并将冲突图的所有结点的编号复制到此集合中;
S503:如果residualNodes中没有结点,则终止修剪冲突图的过程;否则,执行下面步骤的处理;
S504:考虑结点对应的网所属寄存器分组的限制条件下将residualNodes中满足度数小于相应的可分配寄存器数的结点全部压入栈nodeStack,并将它们从residualNodes删除;
S505:如果上一步有任何结点被压入栈nodeStack,则跳转到S503;否则执行下一步;
S506:如果residualNodes中没有结点,则终止修剪冲突图的过程;否则,执行下面步骤的处理;
S507:考虑结点对应的网所属寄存器分组的限制条件下从residualNodes中的那些度数不小于相应的可分配寄存器数的结点中挑选出一个结点压入栈nodeStack,并将它们从residualNodes删除;
S508:转到S503继续处理。
作为本发明的进一步改进:所述步骤S6中对于每个结点的处理过程中,对结点相应的网的溢出的判断流程为:
5)先假定结点对应的网的溢出标识值为false,设定名称为bSpill,即先假定不用将其溢出;
6)如果网的邻接结点的数量不小于网所属的寄存器类别中的可分配寄存器数量,则设置bSpill的值为true;
7)如果bSpill的值仍为false,且网所需的寄存器属于特别寄存器分组,则:
c)分析已经被邻接结点使用的寄存器中哪些是属于相同的特别寄存器分组,对这样的邻接结点计数,将数值赋给sameGroupRegNum;
d)如果sameGroupRegNum不小于该特别寄存器分组的寄存器数量,则设置bSpill的值为true;
8)如果bSpill的值为true,则确实需要溢出当前结点对应的网,整个指派物理寄存器的过程失败,结束对本结点的处理,转去处理下一个结点;否则不需要溢出当前结点对应的网,可以为当前结点指派物理寄存器。
作为本发明的进一步改进:所述步骤S6中对于为网指派物理寄存器,其作用是从合适的物理寄存器中选择一个来指派给结点对应的网,将该物理寄存器的编号保存在regSN中;具体流程为:
3)如果网所需的寄存器不属于特别寄存器分组,则进行下面步骤的处理:
e)找出网所属的寄存器类别中未被邻接结点对应的那些网使用的寄存器,放入集合candRegs;并将candRegs复制到集合backupCandRegs;
f)从backupCandRegs中排除这样的邻接结点对应的寄存器分组中的所有寄存器:该邻接结点比当前结点压栈先被压入栈中;邻接结点对应的网属于特别寄存器分组;
g)从backupCandRegs中排除属于不可用寄存器集合中的那些寄存器;
h)如果backupCandRegs不为空,则从backupCandRegs中选择编号最小的寄存器,将其编号赋给regSN;否则,从candRegs中选择编号最小的寄存器,将其编号赋给regSN;
4)如果网所需的寄存器属于特别寄存器分组,则进行下面步骤的处理:
b)找出网所属的特别寄存器分组中未被邻接结点对应的那些网使用的寄存器,放入集合candRegs;并将candRegs复制到集合backupCandRegs;
从backupCandRegs中选择编号最小的寄存器,将其编号赋给regSN。
与现有技术相比,本发明的优点在于:
1、本发明的向量VLIW体系结构图着色寄存器分组分配方法,是针对高性能处理器具有多个通用寄存器类别且某些通用寄存器类别中有部分寄存器还用于谓词执行或某个特定指令域这种硬件特性,通过重新设计图着色全局寄存器分配方法,获得适用于这些特性的图着色全局寄存器分配方法。通过这种方法,能够达到充分利用这类体系结构的寄存器资源,减少溢出,获得高质量的结果代码的目的。
2、本发明的向量VLIW体系结构图着色寄存器分组分配方法,解决一个通用寄存器类别具有一个起特别作用的寄存器子集的情况下的全局寄存器分配问题,并且该方法充分考虑了对标量处理单元和向量处理单元并存的高性能VLIW体系结构的指令谓词执行特征的适用性。本发明的方法是基于图着色思想的,它能够充分利用寄存器资源,减少溢出,从而本发明的方法特别适用于具有谓词执行特征的先进的高性能向量体系结构的寄存器优化分配。
3、本发明的向量VLIW体系结构图着色寄存器分组分配方法,本发明中使用不包含物理寄存器结点的冲突关系模型,能够减小寄存器分配时的空间压力,在某些情况下还能减小时间压力;当可分配寄存器资源较丰富时效果更加明显。
附图说明
图1是本发明在具体应用实例中寄存器分组方法的示意图。
图2是本发明在具体应用实例中冲突图的邻接矩阵示意图。
图3是本发明在具体应用实例中属于普通寄存器分组的网指派寄存器的方法示意图。
图4是本发明在具体应用实例中属于特别寄存器分组的网指派寄存器的方法示意图。
图5是本发明方法的流程示意图。
具体实施方式
以下将结合说明书附图和具体实施例对本发明做进一步详细说明。
本发明的向量VLIW体系结构图着色寄存器分组分配方法,是根据硬件的要求预先抽象出各类寄存器中的多个分组;在进行寄存器分配时,根据候选者所在的指令模板的要求分配合适的分组中的寄存器。本发明的方法以图着色方法为基本思想,在典型的图着色全局寄存器分配方法的基础上改进并优化以下环节:对寄存器分配候选者的与寄存器需求相关的属性的分析、冲突关系分析、寄存器合并、冲突图修剪、物理寄存器指派。
本发明的方法可以用任何程序设计语言进行实施,本实例中仅以面向对象语言为例并基于向量VLIW处理器的谓词执行需求来说明本发明的具体实施。
在面向对象语言程序中,数据和相关的功能模块都封装在类中。为本发明建立一个图着色全局寄存器分配器类,将仅对一个函数(或过程)进行图着色全局寄存器分配所需的数据作为此类的数据成员。由于本发明只涉及图着色全局寄存器分配方面的内容,所以假定函数及其数据流信息、函数中的指令的基本信息、函数的基本块及其流图信息等已经保存在函数类对象、指令类对象、基本块对象和有向图之中;对于体系结构的基本信息,假定它们已经保存在体系结构类对象中。它们都是通过指针或者全局变量名来访问。所以,在下面的具体实施描述中,只着重涉及在典型的图着色全局寄存器分配方法基础上改进的那些部分的内容。
在先进的高性能向量处理器的体系结构中,往往有多个通用寄存器文件,每个通用寄存器文件有不同的作用,并且这些作用是互不相干的。在本发明中,一个通用寄存器文件中的所有寄存器被设定为一个专门的寄存器类别,所有的通用寄存器类别统一编号。
根据本发明所针对体系结构的特征,某些指令或指令的某些特别成分或域(例如谓词执行对应的指令条件域)中只能使用某类通用寄存器中的部分寄存器构成的子集。一般地,指令的执行条件域中允许使用的寄存器可能是某类通用寄存器中的若干个,但在指令的其他操作数域中,只要能够使用该类寄存器的地方,这类寄存器中的任何一个寄存器(包括执行条件域中可用的寄存器)都是可以使用的。这可以抽象为:可能有一个指令成分会允许只能使用某类寄存器的一个子集,并且这个成分对于所有的具有该成分的指令来说是固定的。
本发明的方法先按指令集或硬件设计的规定将对于通用寄存器的各种可能的特别场合及其所允许使用的寄存器分别找出,形成不同的特别寄存器分组,并将这些寄存器分组统一编号,以便在图着色寄存器分配的各个环节中根据需要使用这些寄存器分组信息。每一个寄存器分组中的寄存器不仅有对应的寄存器类别的通用特性,还有其应用于相应特别场合的特性。此外,还定义一个“普通寄存器分组”来涵盖所有的通用寄存器。本发明适用这样的情况:任何一个特别寄存器分组与其他所有的特别寄存器分组在内容上不存在重叠。
与体系结构的寄存器分组相对应,寄存器分配候选者需要寄存器分组属性以便在寄存器指派时能获得所需组中的寄存器。该属性的作用是在图着色寄存器分配的各个相关环节中作为判据,其值表示所需寄存器所在的分组,且该值在进行寄存器分配前要先综合变量所在的指令成分和指令模板共同确定。
该属性的确定方法如下:
1)在确定了变量的一个使用(use)之后,分析该use是否出现在相应指令的执行条件域之中。如果是,则为该use设置作为执行条件成分的标识。
2)在构造了寄存器分配的候选者(即网)之后,分析网的各use中是否有任意一个use是在指令的执行条件域的。一旦有这样的use,则为对应的网也设置作为执行条件成分的标识。
3)对于被标识为作为执行条件成分的网,进一步根据网的寄存器类别来确定其所属的寄存器分组属性,并确定该属性的值。
参见图1,在具体应用实例中一个通用寄存器类的内容可以分成多个内容互不重叠的分组(实线箭头)。所有的通用寄存器属于普通分组,每一个分组构成一个特别分组(虚线箭头)。
本发明的向量VLIW体系结构图着色寄存器分组分配方法,步骤为:
S1:与图着色全局寄存器分配过程相关的数据模型的构造;
为了实现本发明的图着色全局寄存器分配方法,需要相关数据的支持。除硬件结构信息和指令集信息外,主要包括反映体系结构的寄存器特征的数据、函数的基本信息、函数的数据流、函数中变量的活跃性、函数中的网、冲突图的表示及其他零散的信息;
S2:网的构造及网的属性分析;
按典型的图着色全局寄存器分配方法的相关步骤得到函数中的网之后,按网的遍历顺序给各网命名,以使不同的网有唯一的名称以便相区别,接下来就可以立即进行网的属性分析。
在确定了网这种寄存器分配候选者之后,对候选者进行寄存器分配之前,本发明方法要求先要对网的寄存器分配需求进行分析,得到相应的属性值,从而能够为后续的寄存器分配各环节提供信息,并使得相应的处理更加清晰。要分析的内容如下:
1)网是否出现在指令的执行条件域。如果网的至少一个use是在相应指令的执行条件域的,那么该网是作为执行条件的。
2)网的寄存器类别。根据指令模板规定的操作数中使用的寄存器的类别,将相应的类别作为网的寄存器类别属性。
3)网的寄存器分组。根据指令模板和网的寄存器类别,确定网的寄存器分组属性。
4)网的处理单元。根据网所在的那些指令是由哪个处理单元执行,确定网的处理单元属性。这里的处理单元是具有各种执行单元的独立物理单元,例如向量VLIW处理器中的标量处理单元、向量处理单元。
S3:冲突分析;
冲突关系分析的主要任务是确定邻接矩阵中各个矩阵元的值,其他的数据结构都可以从该矩阵和网相关的数据获得。
寄存器分配候选者之间的冲突关系是指它们因同时活跃而不能放在同一个寄存器中。本发明用邻接矩阵和邻接表来表示各寄存器分配候选者之间的冲突关系。与典型的图着色寄存器分配方法不同的是,本发明使用仅仅包含寄存器分配候选者对应结点的冲突图,并且邻接矩阵和邻接表也只包含寄存器分配候选者之间的冲突关系信息。因此,冲突图中的结点与网是一一对应的。
由于硬件还可能规定指令的某个成分不能使用某些寄存器,从而在为相应的候选者指派寄存器时要排除这些寄存器。因为冲突图中不再包含物理寄存器结点而导致冲突图中不能反映这种约束条件,所以用另外的办法反映这种冲突关系。这种方法是:
1)将指令集中的这些规定全部找出来,形成多个不同的集合,将将这些集合统一进行编号。
2)在邻接表项的数据模型中增加一项“不可用寄存器”属性。该属性的值即为前一步找到的各个集合的编号之一。在构造网之前,要根据指令对应的指令模板分析各变量的use的不可用寄存器集合。
本发明考虑网的寄存器类别和寄存器分组两个属性来进行冲突关系分析。判定两个网A和B之间冲突的方法是它们之间同时满足如下条件:
1)它们的寄存器类别相同。
2)它们的寄存器分组存在重叠关系。
3)网A在网B的定值点处是活跃的,且网A在网B的至少一个使用处是活跃的,或反之。
参见图2,邻接矩阵中只包含符号变量网之间的冲突关系,在本发明的方法中只需要用到左下三角阵。每个单元格中的值表示对应的行号和列号各自代表的网之间是否冲突,冲突与否用t或f来表示。
S4:合并寄存器;
寄存器合并的处理方法是:依次遍历各个基本块的每一条指令,如果该指令不是寄存器传送指令,则不对它进行任何处理,否则围绕该指令进行分析和处理。
图着色方法中的寄存器合并是将符合条件的某个网到另外一个网的复制进行删除。本发明中,网到网的传送指令能够被删除的条件是:
1)源网和目标网的变量必须是不同的变量;
2)源网的寄存器类别与目标网的寄存器类别相同;
3)源网和目标网不属于不同的特别寄存器分组;
4)两个网不冲突。
S5:修剪冲突图;
在冲突图的修剪过程中,把冲突图的结点中没有被压入栈中的结点称为剩余结点。在开始修剪冲突图之前,先创建剩余结点集合,且令该集合中的内容为冲突图中的所有结点。修剪冲突图的过程分两个大步骤:一是考虑在结点对应的网有所属寄存器分组限制的条件下将剩余结点中满足度数小于相应的可分配寄存器数这个条件的结点全部压栈;二是考虑在结点对应的网有所属寄存器分组限制的条件下从剩余结点中的那些度数不小于相应的可分配寄存器数的结点中挑选出一个结点压栈。压入栈中的结点称为栈内结点。
对于第一步,主要的处理是分析各结点在考虑寄存器分组属性的条件下是否满足小度数条件。对于第二步,其基本方法是先在考虑寄存器分组属性的条件下将剩余结点集合中的内容分到多个子集合,再从中选择一个代价最小的结点压入栈中。
S6:指派物理寄存器。
本发明中的指派物理寄存器的处理过程与典型的图着色全局寄存器分配中的相应处理过程基本相同,但在网的溢出的判定和为网指派物理寄存器两个步骤中的具体方法上有重要区别。
物理寄存器指派的任务包括判断寄存器分配的候选者(即网)是否需要被溢出和为网指派寄存器两方面的任务。在本发明的物理寄存器指派过程中,对于每一个栈内结点,将其从栈顶弹出之后,将按典型的图着色全局寄存器分配方法中的物理寄存器指派的一般流程进行处理,但在如下方面采用特别的方法进行处理:
1)判断一个网是否需要溢出。若网对应的那一类寄存器除不可用寄存器外的全部都被该网的邻接结点使用,则该网需要被溢出。若网需要特别寄存器分组中的寄存器,并且对应的那一组寄存器全部被该网的邻接结点使用,该网也需要被溢出。只有在这两种情况都不出现的情况下,该网才不需要被溢出。
2)为网指派物理寄存器。要分如下两种情况分别处理:(1)网的寄存器分组属性不对应任何特别寄存器分组(即是“普通寄存器分组”);(2)网的寄存器分组属性对应某个特别寄存器分组。对于情况(1),尽量从与当前结点相邻且比当前结点更早入栈的那些结点所在的特别寄存器分组之外的、符合寄存器类别要求的、不在相应的不可用寄存器集合内的那些空闲寄存器中选择编号较小的一个物理寄存器来指派。当没有这样的寄存器时,再从符合寄存器类别要求的可用空闲寄存器中选择编号较小的一个物理寄存器来指派。对于情况(2),先从对应的寄存器分组中排除被已出栈邻接结点用到的那些寄存器,再从剩下的寄存器中选择编号最小的一个物理寄存器来指派。
在具体应用实例中,上述步骤S1中主要数据信息及其结构说明如下:
(1)反映体系结构的寄存器特征的数据。这类数据包括:所有物理寄存器的内部唯一编号构成的集合,所有的寄存器类别编号与其相应的寄存器构成的集合的映射,各种特别寄存器分组集合,各种不可用寄存器集合。此外,在对寄存器的使用有特别要求的条件下,在指令模板中要反映各个域中允许使用的特别寄存器分组和不可用寄存器集合。所有这些数据在进行寄存器分配过程之前可以通过代码固化或从相关信息文件中读取的方式确定下来,并保存在内存中。
(2)函数的基本信息。这类信息及其数据结构分别是:
e)函数代码中的局部变量。这项信息的每一个元素是一个字符串,可以用链表或一维数组来存储。
f)函数的当前有效局部变量。这项信息表示在寄存器分配的处理过程中的某个时刻或阶段中有效的局部变量。它的每一个元素是一个字符串,可以用链表或一维数组来存储。
g)函数中的定值。这项信息可以用链表来存储,链表的每一个结点是一个定值类的对象。一个定值类对象记录了定值对应的变量名称、所在的基本块、所在的指令、指令在函数中的序号、指令在基本块中的序号等内容。
h)函数中的使用。这项信息可以用链表来存储,链表的每一个结点是一个使用类的对象。一个使用类对象记录了使用对应的变量名称、所在的基本块、所在的指令、指令在函数中的序号、指令在基本块中的序号等内容。
(3)函数的数据流。这类信息及其数据结构分别是:
i)到达基本块入口的定值位向量阵。
j)到达基本块出口的定值位向量阵。
k)各基本块保留的定值的位向量阵。
l)各基本块生成的定值的位向量阵。
上述信息分别用一个一维数组来存储,每一个数组元素是一个位向量且向量的长度为函数中的定值的数量。
(4)函数中变量的活跃性。这类信息及其数据结构分别是:
m)基本块入口处的活跃变量位向量阵。
n)基本块出口处的活跃变量位向量阵。
o)基本块中定值先于使用的活跃变量位向量阵。
p)基本块中使用先于定值的活跃变量位向量阵。
q)每条指令入口处的活跃变量位向量阵。
上述信息分别用一个一维数组来存储,数组的长度为流图的结点数。除最后一个外,每一个数组元素是一个位向量且向量的长度为函数中的变量的数量。最后一个数组的每一个元素仍然是一个一维数组,数组的长度等于与该元素对应的基本块中的指令的数量。
(5)函数中的网。网是寄存器分配的对象。函数中的所有的网构成一个集合。集合中的每一个元素是一个网类的对象,该对象包含网对应的变量名、所有使用、溢出标识、给网起的符号名、处理单元类别号、所需的寄存器所属的类别的编号、寄存器分组编号、出现在指令的执行条件域、用到该网的条件域对应的那些使用的集合等。为了便于标识不同的网,每一个网还应有一个唯一编号,该编号从0开始递增。
(6)冲突图的表示。冲突图中各网的冲突关系用如下两种数据结构来表示:
r)邻接矩阵。这是一个二维矩阵,行数和列数都为网的数量,每个元素表示相应的行号和列号对应的两个网之间是否冲突。
s)邻接表。这是一个一维数组,数组长度为网的数量,数组的每个元素为一个记录。该记录中的内容包括溢出对应的网时的存储器相对偏移量、网对应的结点的溢出代价、与记录对应的结点相邻的结点集合、在修剪冲突图过程中被移除的相邻结点的集合、给结点分配的物理寄存器的编号。
(7)其他零散的信息。包括用于溢出标量数据所需的基址寄存器号、偏移量寄存器号、偏移量大小,用于溢出向量数据所需的基址寄存器号、偏移量寄存器号、偏移量大小。这些量都可以用整型变量存储。
在具体应用实例中,上述步骤S2的分析工作的主要步骤如下:
S201:分析各网是否出现在指令的执行条件域。该步骤的实施方法是:遍历各网,对于每一个网,分析其各个use是否出现在指令的条件域,并设置“出现在指令的执行条件域”标识的值。如果网有至少一个use出现在指令的执行条件域,那么认为该网出现在指令的执行条件域,将该标识置为true;如果网的所有的use都不在指令的执行条件域,则将该标识置为false。分析一个use是否在指令的执行条件域的方法是:扫描该use对应的指令的执行条件域的各个词法元素,如果其中的某个词法元素字符串与use对应的变量名相同,则认为该use在指令的执行条件域;如果use所在指令的执行条件域的所有词法元素都不是该use对应的变量,则认为该use没有在指令的执行条件域。
S202:分析需要为网指派的寄存器所属的寄存器类别。该步骤的实现方法是:遍历各网,对于每一个网,根据网的任意一个def或use找到相关的一条指令对象,根据指令对象保存的指令模板信息查找到该def或use对应的操作数所需的寄存器的类别,并将相应的类别编号值赋给网的寄存器类别变量。也可以在寄存器分配之前分析各变量要求分配的寄存器的类别,然后在这里将得到的寄存器类别编号值直接赋给网的寄存器类别属性变量。
S203:分析网的处理单元属性。该步骤的实现方法是:遍历各网,对于每一个网,直接根据网的相关指令的指令模板中关于处理单元的信息来获取网的处理单元属性。如果指令集中的指令助记符具有直接反映处理单元的特征,也可以通过直接分析指令助记符的特征来确定网的处理单元属性。
S204:分析需要为网指派的寄存器所属的寄存器分组。该步骤的实现方法是:遍历各网,对于每一个网,如果它的“出现在指令的执行条件域”标识为假,则对应的寄存器分组属性值为“普通寄存器分组”,否则进一步分析该网具体属于哪一个寄存器分组。以具有标量处理单元和向量处理单元的高性能DSP处理器体系结构为例,如果网的处理单元属性为标量处理单元,则为标量条件寄存器分组,如果网的处理单元属性为向量处理单元,则为向量条件寄存器分组。
在具体应用实例中,上述步骤S3中冲突关系分析的步骤为:
S301:定义一个全局的二维数组adjMtx,每一个数组元素是一个布尔型变量。该二维数组就是邻接矩阵。该矩阵的行号和列号都是从0开始以与网的编号对应。
S302:初始化adjMtx。将其行数和列数(即二维数组第一维和第二维的长度)都设置为网的个数,并将adjMtx的每一个元素的值都设置为false,即先假定各网之间是不互相冲突的。这样,adjMtx为一个方阵。该方阵是一个对称阵,在整个寄存器分配的处理过程中,实际用到的是该方阵的左下三角阵(也可以用右上三角阵)。
S303:从第1行开始遍历adjMtx的每一行,令当前行号为i。对第i行进行下面所有步骤的处理。
S304:获得行号i对应的网的寄存器类别编号和寄存器分组编号分别赋给regClassA和regGroupTypeA。
S305:遍历该行的第0列到第i-1列的矩阵元素,令当前列号为j。每遍历一列时执行下面所有步骤的处理。
S306:获得列号j对应的网的寄存器类别编号并将其赋值给regClassB。
S307:判断regClassA是否等于regClassB。如果不相等,则跳转到S305去处理下一列,否则执行后面的步骤。
S308:获得列号j对应的网的寄存器分组编号并将其赋值给regGroupTypeB。
S309:判断regGroupTypeA和regGroupTypeB对应的各寄存器分组的内容是否有交集。如果没有交集,则跳转到S305步去处理下一列,否则执行后面的步骤。
S310:判断i对应的网和j对应的网的其中一个在另外一个的任意定值点处是否活跃。如果活跃,则令该矩阵元素的(i,j)和(j,i)的值都为true。
在具体应用实例中,上述步骤S4的步骤为:
S401:获得该指令中传送涉及的源变量对应的源网和目标变量对应的目标网。
S402:获取源网和目标网的寄存器类型编号,如果两个寄存器类型编号相同,则进行下面步骤的处理,否则终止对本条指令的处理。
S403:获取源网和目标网的寄存器分组编号,如果两个寄存器分组编号是两个不同的特别寄存器分组编号,则终止对本条指令的处理,否则进行下面步骤的处理。
S404:将源网的编号赋给irow,将目标网的编号赋给icol。如果irow>icol,交两者的值交换。
S405:如果adjMtx的(irow,icol)那个元素为真,则终止对本条指令的处理,否则,进行下面各步骤的处理。
S406:设置一个可合并标识bCanCoalesce,并令其为false。将两个结点各自的邻接结点数量相加,结果赋给totAdjNum。
S406:获取将两个网合并所要求的邻接结点数封顶值。
S407:判断两个结点是否满足如下条件之一:(1)totAdjNum<maxAdjNum;(2)与源网结点相邻的结点都与目标网结点相邻;(3)与目标网结点相邻的结点都与源网结点相邻;(4)源网结点的邻接结点的度数都小于maxAdjNum;(5)目标网结点的邻接结点的度数都小于maxAdjNum。如果满足这些条件之一,则认为它们是可以合并的,否则是不可以合并的。
S408:如果上一步的结论是肯定的,则按典型的图着色方法中的寄存器合并方法将两个结点及相应的网合并。寄存器合并时,保留的网要是对应寄存器分组中寄存器数量较少的那个网,其编号为iwebSrc。
上述步骤中一项重要的工作是获得maxAdjNum的值和iwebSrc,其步骤如下:
1)获取源网所属的寄存器类别中的可自由分配寄存器数量,将该数量值赋给maxAdjNum、rgFreeNumSrc和rgFreeNumAim三个变量。
2)如果源网是属于某个特别的寄存器分组,获取该寄存器分组中的寄存器数量,将值赋给rgFreeNumSrc和maxAdjNum。
3)如果目标网是属于某个特别的寄存器分组,获取该寄存器分组中的寄存器数量,将值赋给rgFreeNumAim。如果该数量值小于maxAdjNum,将该值也赋给maxAdjNum。
4)如果rgFreeNumSrc不大于rgFreeNumAim,则iwebSrc的值为源网的编号,否则它为目标网的编号。
在具体应用实例中,上述步骤S5的步骤为:
S501:创建一个空栈nodeStack。该栈将用于存储被压栈的各个冲突图结点。
S502:创建一个集合residualNodes,并将冲突图的所有结点的编号复制到此集合中。
S503:如果residualNodes中没有结点,则终止修剪冲突图的过程。否则,执行下面步骤的处理。
S504:考虑结点对应的网所属寄存器分组的限制条件下将residualNodes中满足度数小于相应的可分配寄存器数的结点全部压入栈nodeStack,并将它们从residualNodes删除。这是第一个重要处理。
S505:如果上一步有任何结点被压入栈nodeStack,则跳转到S503。否则执行下一步。
S506:如果residualNodes中没有结点,则终止修剪冲突图的过程。否则,执行下面步骤的处理。
S507:考虑结点对应的网所属寄存器分组的限制条件下从residualNodes中的那些度数不小于相应的可分配寄存器数的结点中挑选出一个结点压入栈nodeStack,并将它们从residualNodes删除。这是第二个重要处理。
S508:转到S503继续处理。
对于上面过程中的第一个重要处理,其实施方式为:依次遍历residualNodes中各个结点,对每个结点进行如下的分析和处理:
1)分析该结点的度数,其值为邻接表中为其保存的邻接点的数量。之后,假定该结点能够被压栈。
2)如果度数与该结点的不可用寄存器数量之和不小于相应网的寄存器类别中的可分配寄存器数量,该结点是不能被压栈的。
3)如果度数不小于相应网所属的寄存器分组中的寄存器数量,该结点是不能被压栈的。
4)如果经过上面的处理,发现该结点是可以被压栈的,则按典型的图着色寄存器分配方法中的压栈处理方法将该结点压入栈nodeStack中,并将其从residualNodes中删除。
对于上面过程中的第二个重要处理,其实施方式为:
1)将residualNodes集合中的内容按寄存器分组类型分成不同的子集合。如果一个结点对应的网不属于任何特别寄存器分组,则它属于普通寄存器分组对应的子集合,否则它属于相应的特别寄存器分组对应的子集合。
2)遍历得到的每一个子集合,找到一个非空子集合SM,对SM进行下面步骤的处理。
3)将该非空子集合SM中的各结点按度数划分的溢出代价进行分组,溢出代价相同的结点在同一个组,溢出代价不同的结点在不同的组,从而得到多个不同的组groups。对于属于普通寄存器分组的网对应的结点A,它的度数就是其邻接点的数量与该结点的不可用寄存器数量的和。对于属于特别寄存器分组的网对应的结点A,它的度数是这样的邻接结点B的数量:邻接结点对应的网所属的寄存器分组为X,A对应的网所属的寄存器分组为Y,且Y与X有交集。
4)按溢出代价将groups中的组从小到大排序。
5)从溢出代价最小的那个组中选择其中的任意一个结点压入栈nodeStack中,并将该结点从residualNodes集合中删除。
在具体应用实例中,上述步骤S6中对于每个结点的处理过程中,对结点相应的网的溢出的判断的实施方式为:
9)先假定结点对应的网的溢出标识(假定名称为bSpill)值为false,即先假定不用将其溢出。
10)如果网的邻接结点的数量不小于网所属的寄存器类别中的可分配寄存器数量,则设置bSpill的值为true。
11)如果bSpill的值仍为false,且网所需的寄存器属于特别寄存器分组,则:
t)分析已经被邻接结点使用的寄存器中哪些是属于相同的特别寄存器分组,对这样的邻接结点计数,将数值赋给sameGroupRegNum。
u)如果sameGroupRegNum不小于该特别寄存器分组的寄存器数量,则设置bSpill的值为true。
12)如果bSpill的值为true,则确实需要溢出当前结点对应的网,整个指派物理寄存器的过程失败,结束对本结点的处理,转去处理下一个结点。否则不需要溢出当前结点对应的网,可以为当前结点指派物理寄存器。
在具体应用实例中,上述步骤S6中对于为网指派物理寄存器,其作用是从合适的物理寄存器中选择一个来指派给结点对应的网,将该物理寄存器的编号保存在regSN中。其实施方式为:
5)如果网所需的寄存器不属于特别寄存器分组,则进行下面步骤的处理:
i)找出网所属的寄存器类别中未被邻接结点对应的那些网使用的寄存器,放入集合candRegs。并将candRegs复制到集合backupCandRegs。
j)从backupCandRegs中排除这样的邻接结点对应的寄存器分组中的所有寄存器:该邻接结点比当前结点压栈之前就已经被压入栈中;邻接结点对应的网属于特别寄存器分组。
k)从backupCandRegs中排除属于不可用寄存器集合中的那些寄存器。
l)如果backupCandRegs不为空,则从backupCandRegs中选择编号最小的寄存器,将其编号赋给regSN。否则,从candRegs中选择编号最小的寄存器,将其编号赋给regSN。
参见图3,图的右边中的CN表示当前待指派寄存器的结点,PN表示在CN之前被压栈的结点,BN表示在CN之后被压栈的结点。点线表示结点与寄存器分组之间归属关系。实线箭头候选寄存器的来源,虚线箭头表示候选寄存器要排除的内容。
6)如果网所需的寄存器属于特别寄存器分组,参见图4,则进行下面步骤的处理:
c)找出网所属的特别寄存器分组中未被邻接结点对应的那些网使用的寄存器,放入集合candRegs。并将candRegs复制到集合backupCandRegs。
从backupCandRegs中选择编号最小的寄存器,将其编号赋给regSN。
以上仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。
Claims (7)
1.一种向量VLIW体系结构图着色寄存器分组分配方法,其特征在于,步骤为:
S1:与图着色全局寄存器分配过程相关的数据模型的构造;
S2:网的构造及网的属性分析;得到函数中的网之后,按网的遍历顺序给各网命名,以使不同的网有唯一的名称以区别,并进行网的属性分析;
S3:冲突分析;确定邻接矩阵中各个矩阵元的值,其他的数据结构都从该矩阵和网相关的数据获得;
S4:合并寄存器;依次遍历各个基本块的每一条指令,如果该指令不是寄存器传送指令,则不对它进行任何处理,否则根据寄存器类别和分组属性围绕该指令进行分析和处理;
S5:修剪冲突图;按寄存器类别和分组属性的要求,将冲突图中的各个结点压进一个栈中;
S6:指派物理寄存器;将栈中的结点依次弹出,在弹出时为结点对应的网指派满足寄存器类别和分组的要求的寄存器,使得任何两个相冲突的结点得到不相同的寄存器。
2.根据权利要求1所述的向量VLIW体系结构图着色寄存器分组分配方法,其特征在于,所述步骤S2包括:
S201:分析各网是否出现在指令的执行条件域;该步骤的实施方法是:遍历各网,对于每一个网,分析其各个use是否出现在指令的条件域,并设置“出现在指令的执行条件域”标识的值;如果网有至少一个use出现在指令的执行条件域,那么认为该网出现在指令的执行条件域,将该标识置为true;如果网的所有的use都不在指令的执行条件域,则将该标识置为false;分析一个use是否在指令的执行条件域的方法是:扫描该use对应的指令的执行条件域的各个词法元素,如果其中的某个词法元素字符串与use对应的变量名相同,则认为该use在指令的执行条件域;如果use所在指令的执行条件域的所有词法元素都不是该use对应的变量,则认为该use没有在指令的执行条件域;
S202:分析需要为网指派的寄存器所属的寄存器类别;该步骤的实现方法是:遍历各网,对于每一个网,根据网的任意一个def或use找到相关的一条指令对象,根据指令对象保存的指令模板信息查找到该def或use对应的操作数所需的寄存器的类别,并将相应的类别编号值赋给网的寄存器类别变量;或在寄存器分配之前分析各变量要求分配的寄存器的类别,然后在这里将得到的寄存器类别编号值直接赋给网的寄存器类别属性变量;
S203:分析网的处理单元属性;该步骤的实现方法是:遍历各网,对于每一个网,直接根据网的相关指令的指令模板中关于处理单元的信息来获取网的处理单元属性;如果指令集中的指令助记符具有直接反映处理单元的特征,可通过直接分析指令助记符的特征来确定网的处理单元属性;
S204:分析需要为网指派的寄存器所属的寄存器分组;该步骤的实现方法是:遍历各网,对于每一个网,如果它的“出现在指令的执行条件域”标识为假,则对应的寄存器分组属性值为“普通寄存器分组”,否则进一步分析该网具体属于哪一个寄存器分组。
3.根据权利要求1所述的向量VLIW体系结构图着色寄存器分组分配方法,其特征在于,所述步骤S3的具体流程为:
S301:定义一个全局的二维数组adjMtx,每一个数组元素是一个布尔型变量;该二维数组就是邻接矩阵;该矩阵的行号和列号都是从0开始以与网的编号对应;
S302:初始化adjMtx;将其行数和列数都设置为网的个数,并将adjMtx的每一个元素的值都设置为false,即先假定各网之间是不互相冲突的;这样,adjMtx为一个方阵;该方阵是一个对称阵,在整个寄存器分配的处理过程中,实际用到的是该方阵的左下三角阵或右上三角阵;
S303:从第1行开始遍历adjMtx的每一行,令当前行号为i;对第i行进行下面所有步骤的处理;
S304:获得行号i对应的网的寄存器类别编号和寄存器分组编号分别赋给regClassA和regGroupTypeA;
S305:遍历该行的第0列到第i-1列的矩阵元素,令当前列号为j;每遍历一列时执行下面所有步骤的处理;
S306:获得列号j对应的网的寄存器类别编号并将其赋值给regClassB;
S307:判断regClassA是否等于regClassB;如果不相等,则跳转到S305去处理下一列,否则执行后面的步骤;
S308:获得列号j对应的网的寄存器分组编号并将其赋值给regGroupTypeB;
S309:判断regGroupTypeA和regGroupTypeB对应的各寄存器分组的内容是否有交集;如果没有交集,则跳转到S305步去处理下一列,否则执行后面的步骤;
S310:判断i对应的网和j对应的网的其中一个在另外一个的任意定值点处是否活跃;如果活跃,则令该矩阵元素的(i,j)和(j,i)的值都为true。
4.根据权利要求3所述的向量VLIW体系结构图着色寄存器分组分配方法,其特征在于,所述步骤S4的具体流程为:
S401:获得该指令中传送涉及的源变量对应的源网和目标变量对应的目标网;
S402:获取源网和目标网的寄存器类型编号,如果两个寄存器类型编号相同,则进行下面步骤的处理,否则终止对本条指令的处理;
S403:获取源网和目标网的寄存器分组编号,如果两个寄存器分组编号是两个不同的特别寄存器分组编号,则终止对本条指令的处理,否则进行下面步骤的处理;
S404:将源网的编号赋给irow,将目标网的编号赋给icol;如果irow>icol,交两者的值交换;
S405:如果adjMtx的(irow,icol)那个元素为真,则终止对本条指令的处理,否则,进行下面各步骤的处理;
S406:设置一个可合并标识bCanCoalesce,并令其为false;将两个结点各自的邻接结点数量相加,结果赋给totAdjNum;
S406:获取将两个网合并所要求的邻接结点数封顶值;
S407:判断两个结点是否满足如下条件之一:(1)totAdjNum<maxAdjNum;(2)与源网结点相邻的结点都与目标网结点相邻;(3)与目标网结点相邻的结点都与源网结点相邻;(4)源网结点的邻接结点的度数都小于maxAdjNum;(5)目标网结点的邻接结点的度数都小于maxAdjNum;如果满足这些条件之一,则认为它们是可以合并的,否则是不可以合并的;
S408:如果上一步的结论是肯定的,则按典型的图着色方法中的寄存器合并方法将两个结点及相应的网合并;寄存器合并时,保留的网要是对应寄存器分组中寄存器数量较少的那个网,其编号为iwebSrc。
5.根据权利要求4所述的向量VLIW体系结构图着色寄存器分组分配方法,其特征在于,所述步骤S5的具体流程为:
S501:创建一个空栈nodeStack;该栈将用于存储被压栈的各个冲突图结点;
S502:创建一个集合residualNodes,并将冲突图的所有结点的编号复制到此集合中;
S503:如果residualNodes中没有结点,则终止修剪冲突图的过程;否则,执行下面步骤的处理;
S504:考虑结点对应的网所属寄存器分组的限制条件下将residualNodes中满足度数小于相应的可分配寄存器数的结点全部压入栈nodeStack,并将它们从residualNodes删除;
S505:如果上一步有任何结点被压入栈nodeStack,则跳转到S503;否则执行下一步;
S506:如果residualNodes中没有结点,则终止修剪冲突图的过程;否则,执行下面步骤的处理;
S507:考虑结点对应的网所属寄存器分组的限制条件下从residualNodes中的那些度数不小于相应的可分配寄存器数的结点中挑选出一个结点压入栈nodeStack,并将它们从residualNodes删除;
S508:转到S503继续处理。
6.根据权利要求1所述的向量VLIW体系结构图着色寄存器分组分配方法,其特征在于,所述步骤S6中对于每个结点的处理过程中,对结点相应的网的溢出的判断流程为:
1)先假定结点对应的网的溢出标识值为false,设定名称为bSpill,即先假定不用将其溢出;
2)如果网的邻接结点的数量不小于网所属的寄存器类别中的可分配寄存器数量,则设置bSpill的值为true;
3)如果bSpill的值仍为false,且网所需的寄存器属于特别寄存器分组,则:
a)分析已经被邻接结点使用的寄存器中哪些是属于相同的特别寄存器分组,对这样的邻接结点计数,将数值赋给sameGroupRegNum;
b)如果sameGroupRegNum不小于该特别寄存器分组的寄存器数量,则设置bSpill的值为true;
4)如果bSpill的值为true,则确实需要溢出当前结点对应的网,整个指派物理寄存器的过程失败,结束对本结点的处理,转去处理下一个结点;否则不需要溢出当前结点对应的网,可以为当前结点指派物理寄存器。
7.根据权利要求1所述的向量VLIW体系结构图着色寄存器分组分配方法,其特征在于,所述步骤S6中对于为网指派物理寄存器,其作用是从合适的物理寄存器中选择一个来指派给结点对应的网,将该物理寄存器的编号保存在regSN中;具体流程为:
1)如果网所需的寄存器不属于特别寄存器分组,则进行下面步骤的处理:
a)找出网所属的寄存器类别中未被邻接结点对应的那些网使用的寄存器,放入集合candRegs;并将candRegs复制到集合backupCandRegs;
b)从backupCandRegs中排除这样的邻接结点对应的寄存器分组中的所有寄存器:该邻接结点比当前结点压栈先入栈;邻接结点对应的网属于特别寄存器分组;
c)从backupCandRegs中排除属于不可用寄存器集合中的那些寄存器;
d)如果backupCandRegs不为空,则从backupCandRegs中选择编号最小的寄存器,将其编号赋给regSN;否则,从candRegs中选择编号最小的寄存器,将其编号赋给regSN;
2)如果网所需的寄存器属于特别寄存器分组,则进行下面步骤的处理:
a)找出网所属的特别寄存器分组中未被邻接结点对应的那些网使用的寄存器,放入集合candRegs;并将candRegs复制到集合backupCandRegs;
从backupCandRegs中选择编号最小的寄存器,将其编号赋给regSN。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610195289.6A CN105912304B (zh) | 2016-03-31 | 2016-03-31 | 向量vliw体系结构图着色寄存器分组分配方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610195289.6A CN105912304B (zh) | 2016-03-31 | 2016-03-31 | 向量vliw体系结构图着色寄存器分组分配方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105912304A true CN105912304A (zh) | 2016-08-31 |
CN105912304B CN105912304B (zh) | 2018-04-20 |
Family
ID=56745169
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610195289.6A Active CN105912304B (zh) | 2016-03-31 | 2016-03-31 | 向量vliw体系结构图着色寄存器分组分配方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105912304B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107632830A (zh) * | 2017-09-19 | 2018-01-26 | 首都师范大学 | 一种溢出优化的寄存器分配方法及系统 |
CN110187883A (zh) * | 2019-05-17 | 2019-08-30 | 湖南科技大学 | 一种面向指令目标操作数的寄存器对分配方法及存储介质 |
CN110187882A (zh) * | 2019-05-17 | 2019-08-30 | 湖南科技大学 | 一种面向指令源操作数的寄存器对分配方法及存储介质 |
CN111324354A (zh) * | 2019-12-27 | 2020-06-23 | 湖南科技大学 | 一种融合寄存器对需求的寄存器选择方法 |
CN115617396A (zh) * | 2022-10-09 | 2023-01-17 | 上海燧原科技有限公司 | 应用于新型人工智能处理器的寄存器分配方法及装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040064811A1 (en) * | 2002-09-30 | 2004-04-01 | Advanced Micro Devices, Inc. | Optimal register allocation in compilers |
US20050039175A1 (en) * | 2003-08-13 | 2005-02-17 | Tatge Reid E. | Register allocation and code spilling using interference graph coloring |
CN101710291A (zh) * | 2009-11-27 | 2010-05-19 | 中国科学院声学研究所 | 一种优化堆栈空间的寄存器分配方法 |
CN102360280A (zh) * | 2011-10-28 | 2012-02-22 | 浙江大学 | 一种针对混合长度指令集的寄存器分配方法 |
CN102831005A (zh) * | 2012-07-13 | 2012-12-19 | 天津国芯科技有限公司 | 针对C*core处理器寄存器分配的编译方法及编译器 |
-
2016
- 2016-03-31 CN CN201610195289.6A patent/CN105912304B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040064811A1 (en) * | 2002-09-30 | 2004-04-01 | Advanced Micro Devices, Inc. | Optimal register allocation in compilers |
US20050039175A1 (en) * | 2003-08-13 | 2005-02-17 | Tatge Reid E. | Register allocation and code spilling using interference graph coloring |
CN101710291A (zh) * | 2009-11-27 | 2010-05-19 | 中国科学院声学研究所 | 一种优化堆栈空间的寄存器分配方法 |
CN102360280A (zh) * | 2011-10-28 | 2012-02-22 | 浙江大学 | 一种针对混合长度指令集的寄存器分配方法 |
CN102831005A (zh) * | 2012-07-13 | 2012-12-19 | 天津国芯科技有限公司 | 针对C*core处理器寄存器分配的编译方法及编译器 |
Non-Patent Citations (1)
Title |
---|
肖荣: "基于网的寄存器分配冲突图研究", 《计算机工程》 * |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107632830A (zh) * | 2017-09-19 | 2018-01-26 | 首都师范大学 | 一种溢出优化的寄存器分配方法及系统 |
CN107632830B (zh) * | 2017-09-19 | 2020-07-10 | 首都师范大学 | 一种溢出优化的寄存器分配方法及系统 |
CN110187883A (zh) * | 2019-05-17 | 2019-08-30 | 湖南科技大学 | 一种面向指令目标操作数的寄存器对分配方法及存储介质 |
CN110187882A (zh) * | 2019-05-17 | 2019-08-30 | 湖南科技大学 | 一种面向指令源操作数的寄存器对分配方法及存储介质 |
CN110187883B (zh) * | 2019-05-17 | 2022-12-06 | 湖南科技大学 | 一种面向指令目标操作数的寄存器对分配方法及存储介质 |
CN110187882B (zh) * | 2019-05-17 | 2022-12-06 | 湖南科技大学 | 一种面向指令源操作数的寄存器对分配方法及存储介质 |
CN111324354A (zh) * | 2019-12-27 | 2020-06-23 | 湖南科技大学 | 一种融合寄存器对需求的寄存器选择方法 |
CN111324354B (zh) * | 2019-12-27 | 2023-04-18 | 湖南科技大学 | 一种融合寄存器对需求的寄存器选择方法 |
CN115617396A (zh) * | 2022-10-09 | 2023-01-17 | 上海燧原科技有限公司 | 应用于新型人工智能处理器的寄存器分配方法及装置 |
CN115617396B (zh) * | 2022-10-09 | 2023-08-29 | 上海燧原科技有限公司 | 应用于新型人工智能处理器的寄存器分配方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN105912304B (zh) | 2018-04-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105912304B (zh) | 向量vliw体系结构图着色寄存器分组分配方法 | |
Wahib et al. | Scalable kernel fusion for memory-bound GPU applications | |
KR101360512B1 (ko) | 기록 마스크를 사용하는 simd 아키텍처에 의한 레지스터 할당 | |
JP3901180B2 (ja) | プログラム並列化装置及びその方法並びにプログラム | |
US7069548B2 (en) | Inter-procedure global register allocation method | |
JP2006018446A (ja) | プログラム並列化装置及びその方法並びにプログラム | |
Tendulkar | Mapping and scheduling on multi-core processors using SMT solvers | |
JP3901182B2 (ja) | プログラム並列化装置及びその方法並びにプログラム | |
CN106991007A (zh) | 一种基于gpu片上的数据处理方法 | |
CN105487911A (zh) | 一种基于编译指导的众核数据分片方法 | |
Shah et al. | Accelerating random forest classification on gpu and fpga | |
US20220019531A1 (en) | Allocating Variables to Computer Memory | |
Barik et al. | A decoupled non-SSA global register allocation using bipartite liveness graphs | |
JP4293223B2 (ja) | プログラム並列化装置及びその方法並びにプログラム | |
CN100368992C (zh) | 一种解决多寄存器组冲突的方法 | |
Hu et al. | Automatic Thread Block Size Selection Strategy in GPU Parallel Code Generation | |
Liu et al. | FPGA-Based Sparse Matrix Multiplication Accelerators: From State-of-the-art to Future Opportunities | |
CN111324354A (zh) | 一种融合寄存器对需求的寄存器选择方法 | |
US11755300B1 (en) | Systems and methods for array structure processing | |
Jantz et al. | Analyzing and addressing false interactions during compiler optimization phase ordering | |
Fazli et al. | TPGen: a self-stabilizing GPU-based method for prime and test paths generation | |
Hong | Code Optimization on GPUs | |
Voetter et al. | Compilation on the GPU? a feasibility study | |
Di Martino | Parallelizing The Maximum Clique Computation on Multi and Many-core Architectures | |
Huang et al. | Optimizing Data Reuse for Loop Mapping on CGRAs With Joint Affine and Non-Affine Transformations |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |