将长位宽操作数指令转换为短位宽操作数指令的方法与流程

文档序号:14990232发布日期:2018-07-20 22:04阅读:317来源:国知局

本发明涉及微处理器体系结构技术领域,更具体地,本发明涉及将原始的长位宽操作数指令转换为短位宽操作数指令的方法以及执行该短位宽操作数指令的方法。



背景技术:

对于目前主流的微处理器,一般都在架构手册当中规定了程序员可见的寄存器种类和数量。比如power指令架构当中规定,程序员可见的通用寄存器包括:32个64位的定点寄存器,32个64位的浮点寄存器,还有32个128位的向量寄存器。针对super-scalar的架构设计,在微体系结构的实现层面,通常还会使用寄存器重命名技术,比如在power的例子当中,针对定点寄存器有专门的定点寄存器重命名部件以及相关的物理寄存器堆;针对浮点寄存器也有专门的浮点/向量物理寄存器堆和重命名。大部分情况下,无论是商用处理器架构手册还是实际的实现,都是针对寄存器全位宽(fullregisterwidth)的操作数进行操作,即使很多情况下指令中参与运算的源操作数位数不足64位(可能只是32位或者16位的宽度),寄存器的高位字段也都会被作为符号位,这就导致寄存器中出现大量的无用的符号位。

如果设计当中使用了寄存器重命名技术,那么就意味着物理寄存器是否能充足供应决定了这个处理器超前执行(speculation)能力的强弱。如果物理寄存器的个数足够多,流水线不会因为物理寄存器的短缺而发生停顿;但是,从整个处理器的能量分布来看,物理寄存器堆所消耗的功耗占比很大,并且占用的面积也大,所以物理寄存器的大小和功耗在实现当中常常需要进行权衡。这就会导致实际使用时物理寄存器的个数不足,流水线因为物理寄存器的短缺而发生停顿。

另一方面,已经有研究人员发现在处理器当中实际上存在着很多中间数据,它们都不是全位宽的,高位段当中包含了太多连续无用的符号位。而目前处理器当中并未对这一问题作出很好的优化。

现有技术中,通常是针对全位宽进行操作,不会考虑实际上操作数的位数。有的处理器中,提供了针对计算结果进行寄存器共享(即把多个结果写入到同一个寄存器当中)的方案,但该方案需要针对指令运算结果的位宽进行预测,导致需要增加额外的预测部件。

因此,当前迫切需要一种能够使处理器在处理短位宽操作数时提高其内部寄存器及其它资源利用率的解决方案。



技术实现要素:

由于指令中有很大一部分不仅源操作数是短宽度的,而且产生的结果也是短宽度的,因此发明人利用这个特点,提出这样的技术方案:针对短宽度的操作数,把两个源操作数分别放入到一个寄存器的高位字段和低位字段。这样做能够带来如下好处:

(1)如果指令是针对两个源寄存器进行操作,那么操作码当中原本用于指定第二个源操作数寄存器的字段可以空闲出来,一部分可以用于指定操作数的位宽,一部分可以用于指令操作码的扩展;

(2)提高了逻辑寄存器和物理寄存器的利用率,原本2个源操作数需要占用2个独立的物理寄存器,但是现在面向短位宽操作数时,2个源操作数可以共享同一个物理寄存器。一方面,在总寄存器数不变的前提下,变相增加逻辑寄存器和物理寄存器的可用数量,即利用率,这样对性能有好处。

本发明的一个方面涉及一种用于将原始的长位宽操作数指令转换为短位宽操作数指令的方法,其中,所述长位宽操作数指令包括用于指定至少两个寄存器的至少两个字段,所述至少两个寄存器中的每一个能够存储一个长位宽源操作数,所述方法包括:从所述至少两个字段中选择第一字段;使用所述第一字段指定用于存储两个短位宽源操作数的一个寄存器,其中,所述两个短位宽源操作数分别存储于该寄存器的高半部分和低半部分;以及,在指令中指定所述短位宽源操作数的位宽,该位宽小于所述长位宽源操作数的位宽。

优选地,其中,所述在指令中指定所述短位宽源操作数的位宽包括:从所述至少两个字段中选择第二字段,并使用所述第二字段指定所述短位宽源操作数的位宽。

优选地,上述方法还包括:还使用所述第二字段指示目标操作数应被写入到目标寄存器的高半部分还是低半部分。

优选地,上述方法还包括:使用字段以表明所述两个短位宽源操作数中的每一个存储于寄存器的高半部分还是低半部分。

优选地,其中,所述长位宽操作数的位宽是所述短位宽操作数的位宽的2倍、4倍或8倍。

本发明的另一个方面涉及一种用于执行上述短位宽操作数指令的方法,包括:确定用于存储所述短位宽操作数指令的两个短位宽源操作数的寄存器;针对所述寄存器的高半部分和低半部分分别进行判断,以确定所述两个短位宽源操作数是否都已就绪;如果就绪则发出所述短位宽操作数指令;读出所述寄存器中的数值,并从所述寄存器的高半部分和低半部分中提取出两个源操作数;以及,执行单元基于所述两个源操作数执行所述短位宽操作数指令的运算。

优选地,其中,所述从所述寄存器的高半部分和低半部分中提取出两个源操作数包括:根据所述短位宽操作数指令中指定的源操作数位宽来从所述寄存器的高半部分和低半部分中提取出所述两个源操作数。

优选地,上述方法还包括:将执行单元的运算结果写入到目标寄存器的高半部分或低半部分。

本发明的再一个方面涉及一种计算装置,其包括处理器和存储器,所述存储器中存储有计算机程序,所述计算机程序在被所述处理器执行时能够用于实现上述任一方法。

优选地,其中,所述处理器中包括用于执行指令的执行单元,所述执行单元根据指令中的源操作数的位宽变化被划分为若干个子执行单元。

本发明解决了目前逻辑寄存器和物理寄存器利用率不高、同时指令操作码扩展困难的问题,提出了一种针对短位宽操作数进行寄存器共享的方案,同时也兼具了对指令操作码进行扩展的功能。和现有技术相比,该发明有利于提高逻辑寄存器和物理寄存器的利用率,配以合理的使用策略,一方面有助于提高性能,另一方面在寄存器充足的情况下,有助于降低寄存器堆的使用功耗。同时,本发明的附加作用是扩展了指令操作码的位数。

附图说明

以下,结合附图来详细说明本发明的实施例,其中:

图1示出了现有技术中的power指令格式的一个示例;

图2示出了本发明一个实施例中的对浮点指令进行转换的示例;

图3示出了本发明一个实施例中的源寄存器的依赖关系的一个示例;

图4示出了本发明一个实施例中的源寄存器的依赖关系的另一个示例;

图5示出了本发明一个实施例中的源寄存器的依赖关系的又一个示例;

图6示出了本发明一个实施例中的读寄存器的数据通路(全位宽);

图7示出了本发明一个实施例中的读寄存器的数据通路(短位宽);

图8示出了本发明一个实施例中的定点加法器的位宽拆分示意图;以及

图9示出了本发明一个实施例中的寄存器写回(目的操作数为短位宽)的示意图。

具体实施方式

指令是计算机规定执行操作的类型和操作数的基本命令,它由一个字节或者多个字节组成,其中包括操作码字段、一个或多个有关操作数地址的字段以及一些表征机器状态的状态字和特征码。现有的处理器(即cpu)通常基于流水线结构来执行指令。因此在对指令进行转换时,也需要满足处理器指令执行的流水线结构的要求,能够被该流水线结构所识别和执行。流水线包括:取指、译码、派发、取操作数、发送至指令队列、执行运算以及存储运算结果等步骤。

根据本发明的一个实施例,提供了一种将原始的长位宽(或全位宽)操作数指令转换成短位宽操作数指令的方法以及执行该短位宽操作数指令的方法,该方法实现了以较少的寄存器和较少的寻址次数和范围来完成短操作数运算,从而降低了功耗,提升了资源利用率,提升了cpu性能。

图1示出了现有技术中的power指令格式的一个示例。如图1所示,该图中显示了power8架构当中一条普通的浮点加法指令,这条指令对应的基本操作是把fra寄存器当中的数值和frb寄存器当中的数值相加,相加的结果放入到frt寄存器当中。在现有的构架中,大部分指令的操作对象都是2个源操作数和1个目标操作数(其中2个源操作数可能来自2个寄存器,也可能其中1个源操作数来自立即数)。需要说明的是,现有的构架中也存在其他类型的指令,例如具有3个源操作数或者是2个目标操作数的指令,这些指令同样适用于本发明。在下文的实施例中将以图1中所示的指令为例进行说明。

针对图1所示的具有两个操作数的指令,在32位的指令操作码当中,有2个字段分别用于指定用于源操作数1的寄存器和用于源操作数2的寄存器。并且在64位架构下,这2个源操作数寄存器对应于2个64位的寄存器,也即,图1所示的指令是64位的长位宽操作数指令。如果是向量类指令,那么对应的是128位的向量寄存器。

在本发明的一个实施例中,针对32位、16位或者8位的较短宽度源操作数的情况,可以以如下方式修改上述指令的编码方式,以获得相应的短位宽操作数指令:(1)使用原来的用于源操作数1的字段,指定一个64位的源寄存器,如此,两个短宽度源操作数只需要这一个字段指示即可,其中,两个32位或者16位或者8位的源操作数可以分别占用这个源寄存器的高位字段(也即,源寄存器的高半部分)和低位字段(也即,源寄存器的低半部分);(2)对于原来用于指定源操作数2的字段,其中2个比特用于表示该短位宽操作数的位宽是多少(比如“00”表示32位,“01”表示16位,“10”表示8位)。当然,本领域技术人员可以理解,也可以使用指令的其他字段来指示短位宽操作数的位宽,而并非必须使用原来用于指定源操作数2的字段。

在一个实施例中,浮点和向量操作可以通过程序员可见的系统控制寄存器进行使能或者禁用,当浮点操作功能被禁用的时候,正常情况下处理器遇到上述修改后的指令(表面上仍是浮点指令)会把其当做不合法(illegal)的情况来处理。在本实施例中,可以设置一个控制位,当浮点功能被禁用的时候,如果通过该控制位使能短位宽操作数指令,则译码单元遇到上述修改后的指令(表面上仍是浮点指令)时将把其识别为短位宽的定点指令,从而对其进行相应的执行。显然,本领域技术人员可以意识到,也可以以其他合适的方式来使能短位宽操作数指令。

这里需要说明的是,本实施例仅以浮点指令作为一种实现的例子来进行说明。在有些应用中(例如,spec2000),有40%的操作数可以只用16位表示,还有45%的操作数可以用32位表示,因此对物理寄存器进行转换使用的方式也可以针对定点操作来进行,而不是仅限定在浮点指令的情况下。也就是说,本发明的长位宽操作数指令和短位宽操作数指令是两个相对概念,长位宽并不限于64位,还可以是128位、32位等,短位宽也并不限于32位、16位和8位,例如,在长位宽操作数的位宽为128位时,相应的短位宽操作数的位宽可以为64位、32位、16位或8位。

图2示出了本发明一个实施例中的浮点指令转换的示例,其将图1所示的原始的浮点加法指令转换为了一个短位宽操作数指令。相应地,译码单元对该短位宽操作数指令的解读也将与原始的浮点加法指令有所不同。

如图2所示,其中,原来用于指定用于源操作数1的寄存器的字段fra,现在指向一个64位的寄存器。该64位的寄存器可以被分成8个8位的字段,每个8位字段可以用一个大写英文字母表示,其中a、b、c、d占据了寄存器的高半部分,e、f、g、h占据了寄存器的低半部分。如果源操作数是8位的,可以将第一个源操作数放在h,第二个源操作数放在d;如果源操作数是16位的,可以将第一个源操作数放在g-h(g相比于h是高位),第二个源操作数放在c-d;同样的道理,如果源操作数是32位的,可以将第一个源操作数放在e-f-g-h,第二个源操作数放在a-b-c-d。以此方式,实现了2个源操作数只占用1个物理寄存器,从而节省了寄存器资源。

另外,指令中原本用于指定用于源操作数2的寄存器的字段frb的含义也发生了变化,其中,可以将指令的第19~20位(也即,字段frb的后两位)用于指定源操作数的位宽(比如“00”表示32位,“01”表示16位,“10”表示8位);可以将指令的第18位表示结果被写入到目标寄存器的高半部分还是低半部分(这种选择只适用于8位和16位的情况,因为两个8位的源操作数,产生16位的目标操作数;两个16位的源操作数,产生32位的目标操作数;而2个32位的源操作数,将产生64位的目标操作数,因而不再需要指定高半部分还是低半部分);可以将指令的16~17位认为是空闲的,当然,也可以根据实际需要将其用作操作码扩展。

当操作数的寄存器使用方式发生变化之后,导致寄存器的依赖方式也发生了变化。如图3-图5所示,以16位的源操作数为例,第一种情况(图3和图4)是两个源操作数分别依赖于两个寄存器rega和regb的16位字段,被依赖的16位可能来自寄存器rega/b的高半部分也可能是低半部分;第二种情况(图5)是两个源操作数依赖于一个寄存器rega的不同的16位字段。在一个优选实施例中,为了减少实现的复杂度,如果是来自同一个寄存器,则将两个16位字段分别设置在该寄存器的高半部分和低半部分。在图3-图5中,srca表示源操作数a,srcb表示源操作数b,reg_a.low表示寄存器a的低半部分,reg_a.high表示寄存器a的高半部分,reg_b.low表示寄存器b的低半部分,reg_b.high表示寄存器b的高半部分。

由于寄存器的依赖方式发生了改变,对于使用了寄存器重命名技术的处理器而言,寄存器重命名的方式也需要做出相应的调整,以体现被依赖的操作数的存放方式发生了改变。在一个实施例中,可以增加一个字段,以表明操作数依赖于寄存器的哪半部分或哪个字段。具体地,如图3所示,srca依赖于reg_a.low,srcb依赖于reg_b.low;如图4所示,srca依赖于reg_a.low,srcb依赖于reg_b.high;如图5所示,srca依赖于reg_a.high,srcb依赖于reg_a.low。当然,也可以采用其他合适的方式来表明寄存器的依赖方式。

为了支持短位宽的操作、配合寄存器使用方式以及重命名方式的改变,指令发出逻辑(issuelogic)中的依赖跟踪逻辑(dependencytrackinglogic)也需要做出一些调整。在全位宽的情况下,依赖跟踪逻辑负责从结果总线或者bypass网络上监测每个源操作数所依赖的寄存器是否已经写回,如果已经写回,那么对应的源操作数就被标记为“就绪(ready)”状态,当一条指令所有的源操作数都处于就绪状态时,这条指令就符合被选择以发出的标准。在短位宽的情况下,因为源操作数的位宽发生了变化,所以在判断源操作数是否就绪的时候,被依赖的寄存器也需要分段进行处理,例如,针对寄存器的高半部分或低半部分进行判断。

在上文中已经提到过,如果是2个8位源操作数进行运算,所产生的结果是16位位宽的目标操作数,该目标操作数可以存储在目标寄存器的高半部分字段或者低半部分字段,但是无论放在哪个部分,高半部分和低半部分都是32位的,其余不足的位宽在这种情况下需要进行符号位的扩展。在写寄存器的时候,结果总线上会出现寄存器号以及指示高半部分/低半部分字段的标识符,另外,依赖跟踪逻辑在进行比较的时候需要增加高半部分/低半部分字段的比较。

从上面写寄存器可以看出,在计算完成之后向寄存器写回结果的时候,可能不再像全位宽那样针对整个寄存器进行写操作,而是针对其中的一半进行操作,也叫做“部分写”。针对这种部分写操作,从实现的角度可以采用两种方法。第一种是“读-修改-写(readmodifywrite)”,在写之前先把全位宽寄存器的数值读出来,把要写的结果和读出来的数值进行合并之后,再针对寄存器做全位宽写操作;第二种是针对寄存器的写操作增加2个比特的半屏蔽(halfmask)选项(因为不足32位的时候采用了符号扩展,所以这里只考虑将寄存器分成两半的情况),分别叫做高半部分屏蔽(high_mask)和低半部分屏蔽(low_mask)。当high_mask=1,low_mask=0的时候,可以表示向寄存器的低半部分写结果;当high_mask=0,low_mask=1的时候,可以表示向寄存器的高半部分写结果;当high_mask=0,low_mask=0的时候,可以表示写全位宽。两种方法各有利弊,第一种方法不用对寄存器堆做出任何改动,因为寄存器堆一般都是采用定制设计,面积和时序都要经过特殊的优化,但是增加了外围逻辑的复杂度,每次写操作之前都要先读出来,如果不增加读端口的数量的话,可能会导致读端口的冲突增多;第二种方法,相当于给写操作增加了屏蔽位,需要寄存器堆的设计做出改动,但是外围逻辑仍然是单纯的写操作。因此,如果寄存器堆的设计允许的话,优选地采用第二种方法。

由此可以想到,在短位宽的情况下,当从寄存器堆当中读出源操作数的时候,从寄存器堆的读端口到达执行单元的数据通路也和之前的全位宽略有不同。如图6所示,在全位宽的情况下,从寄存器堆的两个读端口读出2个64位的源操作数,并且分别送到执行单元对应的2个入口。而对于短位宽的情况,如图7所示,原本第二个全位宽源操作数占用的读端口2在这里可以不再使用,因为2个源操作数都被存放在同一个寄存器里面,所以只通过读端口1来读出该寄存器中的全位宽的数值,然后可以把该寄存器的高半部分和低半部分分别发送给执行单元。

通过图7所示的读寄存器堆的数据通路可以看出,当执行短位宽操作数指令的时候,有一个非常直观的好处,就是对寄存器的读端口的数量需求比原来有所下降。如果发射宽度是3条指令,那么对读端口的需求最多可以减少3个。

另外,这种情况下,可以看到执行单元的操作位宽也发生了变化,这种情况下对于执行单元的设计也可以有两种选择。第一种选择,针对原来的结构,定点和浮点运算单元都是针对2个64位的源操作数进行运算,当2个源操作数的位数有所变化的情况下,可以不改变任何执行单元的硬件,把操作数的高位做符号扩展,在执行单元的内部仍然采用原来的位宽,产生的结果虽然是64位的,但是根据源操作位数的不同,可以针对结果进行裁剪,把对应位宽的结果写回到寄存器堆即可。这种方法的好处是硬件改动较少,但是显然在这种情况下造成了对硬件和功耗的浪费。第二种选择是把执行单元根据源操作数位宽的变化做适当的切分。以加法单元为例,如图8所示,一种实现例如是把64位加法器切分为4个16位的子加法器。如果是8位加法操作,则高位补符号,并在16位的子加法器中进行运算。如果是32位加法操作,则需要2个16位的子加法器拼接进行。这样做的好处是,当进行短位宽的加法运算时,那些多余的子部件可以被关闭,节省了功耗。

最后,短位宽操作数指令执行完之后,需要把结果写回寄存器堆。在上文中提到过,在指令码中可以有一个比特(例如,图2所示的用于源操作数2的寄存器的字段frb中的一个比特)来指示结果应被写回到目标寄存器的高半部分还是低半部分。如图9所示,以2个16位的加法操作为例,结果是32位,因此,可以选择将结果写回到目标寄存器的高半部分,也可以选择将结果写回到目标寄存器的低半部分。如此,实现了处理器流水线对短位宽操作的支持。

本说明书中针对“各个实施例”、“一些实施例”、“一个实施例”、或“实施例”等的参考指代的是结合所述实施例所描述的特定特征、结构、或性质包括在至少一个实施例中。因此,短语“在各个实施例中”、“在一些实施例中”、“在一个实施例中”、或“在实施例中”等在整个说明书中各地方的出现并非必须指代相同的实施例。此外,特定特征、结构、或性质可以在一个或多个实施例中以任何合适方式组合。因此,结合一个实施例中所示出或描述的特定特征、结构或性质可以整体地或部分地与一个或多个其他实施例的特征、结构、或性质无限制地组合,只要该组合不是非逻辑性的或不能工作。在方法流程中按照一定顺序进行描述的各个步骤并非必须按照该顺序执行,相反,其中的一些步骤的执行顺序可以改变,并且一些步骤可以并发执行,只要不影响方案的实现即可。另外,本申请附图中的各个元素仅仅为了示意说明,并非按比例绘制。

由此描述了本发明的至少一个实施例的几个方面,可以理解,对本领域技术人员来说容易地进行各种改变、修改和改进。这种改变、修改和改进意于在本发明的精神和范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1