专利名称:对处理器中循环的处理的制作方法
技术领域:
本发明的领域本发明涉及对处理器中循环的处理。
相关技术在高性能的计算机中,通常目标机需要高速率的执行指令(例如,微处理器)。执行时间是由应用程序内的循环结构所控制。为了允许高速率的执行指令,微处理器包括多个独立的执行单元,每一个独立的执行单元可以与执行指令的其他执行单元并行的执行一个或者多个指令。
这样多个执行单元可被用来提供由多个独立阶段所组成的所谓的软件流水线。每一个软件流水线阶段没有固定的与特定执行单元相对应的物理实体。更确切的说,当应用程序中的循环结构被编译时,根据软件流水线的调度,构成循环的单次迭代的机器指令通过不同的执行单元被调度以执行。调度被划分成连续的阶段并且指令通过某一方式而被执行,以致允许通过不同的执行单元在连续迭代的初始化间选择一循环初始化间隙以重叠的方式执行多次迭代,。这样,当迭代i的第一阶段结束并且此次迭代进入第二阶段时,下一次迭代i+1的执行在迭代i+1的第一阶段被初始化。这样,迭代i+1第一阶段的指令与迭代i第二阶段的指令的执行并行执行。
在这样的软件流水线化循环中存在循环变量值,例如在循环的每一次不同的迭代中必须重新估值的表达式,该表达式在流水线中的不同指令之间传送。为了处理这样的循环-变量值,将这些循环变量值存储在一个所谓的旋转寄存器文件中。在这种情况下,旋转寄存器文件中的每一个循环变量值分配一个逻辑寄存器编号,并且这个逻辑寄存器编号从一次迭代到下一次迭代的过程中是不变的。循环寄存器文件中的每一个循环变量值与寄存器文件中的物理寄存器相映射,并且每次新的迭代开始时这个映射被旋转,例如每次流水线的间界交叉。因此,不同迭代中的相应指令都指向同一个逻辑寄存器编号,仅仅生成编译的指令,同时避免了一次迭代所产生的值被随后不同的迭代所执行的指令所覆盖。
这些内容将在我们相关待决的公开号为CN-A-1308274的中国专利申请中详细描述,通过参照该申请的整个内容都包含在这里。特别是,那个申请描述一个交替寄存器重命名调度,在该寄存器中每次发出一个产生值的指令时映射被旋转。
在任一的重命名调度中,产生了由于寄存器位置不一致而引起特殊情况的问题,与一次或多次执行循环体的正常情况相比,在这种特殊情况下根本不执行软件流水线化循环的循环体。可以发生根本不执行软件流水线化循环的循环体的特殊情况,例如,当循环指令建立起一个循环以迭代,同时循环控制变量从起始值到最终值是逐渐变化的,但是在执行的过程中当执行循环指令时最终值本身是一个小于起始值的变量。这种特殊情况导致当一次或多次执行循环体时寄存器的位置与随后的寄存器位置不一致。
本发明的概述在本发明的一个实施例中,一个处理器用于执行软件流水线化循环。处理器包括一个具有多个寄存器的寄存器单元,用于存储由于执行指令而产生和使用的值。寄存器在执行循环期间被重命名,例如每次软件流水线间界交叉或者每次提出产生值的指令时。
在一个实施例中,处理器还包括一个循环处理单元,在软件流水线化循环要求零迭代的情况下该处理单元引起寄存器以预定的方式被重命名。这种预定重命名是可取的以致在零迭代情况下循环体内的值仍能保存在相同的寄存器中,因为循环需要一次或者多次迭代以致循环体内的值变为循环体外的值。
在一个实施例中,循环处理单元在循环要求零迭代的情况下执行循环的收尾阶段。当非零迭代循环的所有迭代已被初始化时(或者循环内的退出指令已经被执行时)通常进入收尾阶段。
收尾迭代的次数(收尾迭代计数或者EIC)取决于重命名调度的操作。例如,在当每次软件流水线的间界交叉时而对寄存器重命名的情况下,EIC可能比软件流水线阶段的数目小一。每一次收尾迭代引起一个或更多寄存器重命名操作。
这样收尾阶段的执行可使寄存器自动重命名以致在零迭代循环之后可以在同一寄存器中找到循环体内的值,因为已经执行了非零迭代循环。
在一个实施例中,在收尾阶段的用于寄存器的重命名操作的次数是可指定的不取决于循环本身的迭代次数(IC)。这可使编译器指定在由处理器执行的目标程序中所需的重命名的次数。
在一个实施例中,在收尾阶段的迭代次数(例如EIC)是可指定的不取决于IC。这可使编译器指定在由处理器执行的目标程序中所需的收尾迭代的次数。
EIC可以由处理器执行的指令来指定。在一实施例中,这个指令是在软件流水线化循环的启动过程中所执行的一循环指令。
循环指令具有一个字段,EIC被指定在这个字段内。这与循环指令的IC字段相分离,以致EIC和IC可以独立指定。
在一实施例中,循环处理单元当初始化循环时(例如当执行循环指令时)接收IC以循环并且,如果接收到的IC是零,这只可以引起收尾阶段被执行。当接收到的IC是非零,这可以引起以正常方式执行循环的开始处理阶段和核心阶段。
在一实施例中,处理器判定指令的执行,例如,如我们相关待决的公开号为CN-A-1329303的中国专利申请中所详细描述的,通过参照该申请的整个内容都包含在这里。
在这样的处理器中,可判定与循环的不同软件流水线阶段分别对应的寄存器。当预测寄存器具有第一状态(例如1)时,可启动它的相应软件流水线阶段,例如,通常执行那阶段的指令并且其结果被提交。当预测寄存器具有第二状态(例如2)时,不可启动它的相应软件流水线阶段,例如它的指令可执行但是其结果不被提交。
在一实施例中,循环处理单元依靠所接收到的IC而初始化预测寄存器。
在一实施例中,当循环迭代的次数是零时循环处理单元以一种方式对预测寄存器初始化并且当循环迭代的次数不是零时以至少另外一种方式对预测寄存器初始化。
在一实施例中,当IC是零,与循环阶段相对应的预测寄存器在第二状态被初始化,然而当IC为非零,与第一流水线状态相对应的预测寄存器在第一状态被初始化并且与随后的阶段相对应的每一个预测寄存器在第二状态被初始化。这就是说,在零迭代计数情况下立即开始收尾阶段,但是在正常的情况下(非零迭代计数)开始阶段和核心阶段首先进入。
在一实施例中,与第一流水线阶段相对应的预测寄存器被转换为与第二流水线阶段相对应的预测寄存器,依此类推。按照这种方式,流水线阶段可以按照所要求的开始、核心、以及收尾阶段的顺序启动和禁止。
在一实施例中,与第一流水线阶段相对应的预测寄存器的状态根据源寄存器来设置。在这种情况下循环处理器单元最好根据不同的循环迭代次数对源寄存器进行初始化。
在一实施例中,当接收到的IC是零或者一时,循环处理单元在第二状态初始化来源寄存器,并且当接收到的IC是二或者更多时,在第一状态初始化来源寄存器。
本发明的第二个方面涉及处理器的编译方法。
在一实施例中,如果软件流水线化循环是零迭代次数,编译方法包括指定目标程序中的寄存器以由处理器执行重命名。
在一实施例中,在零迭代次数的情况下只执行循环的收尾阶段,并且编译方法包括指定寄存器的编号以在收尾阶段执行重命名操作。
在一实施例中,在零迭代次数的情况下只执行循环的收尾阶段,并且编译方法包括在目标程序信息中指定在收尾阶段执行的迭代的次数。
在一实施例中,信息被指定在包括在目标程序中的指令中。在一实施例中,这个指令是在软件流水线化循环的开始期间所执行的循环指令。
循环指令具有一个字段,EIC在该字段中被指定。这与循环指令的IC字段相分离以致可独立指定EIC和IC。
本发明的第三个方面涉及由处理器执行的目标程序。
在一实施例中,处理器在零迭代次数的情况下只执行循环的收尾阶段,并且目标程序包括用于指定在收尾阶段所执行的迭代的次数。
在一实施例中,处理器在零迭代次数的情况下只执行循环的收尾阶段,并且目标程序包括用于指定在收尾阶段所执行的迭代的次数。
循环指令具有一个字段,EIC在该字段中被指定。这与循环指令的IC字段相分离以致可独立指定EIC和IC。
体现本发明的目标程序由其本身提供或者由载体介质执行。载体介质是一记录介质(例如,磁盘或者CD-ROM)或者诸如信号的传输介质。
本发明的另一个方面涉及编译装置,用于执行上述所提出的编译方法,并且当运行计算机时,计算机程序引起计算机执行诸如编译方法和/或,当计算机程序下载到计算机时,引起计算机成为这样的编译装置。根据计算机程序,体现本发明的编译方法由诸如通用计算机这样的电子数据处理设备执行。
体现本发明的目标程序由其本身提供或者由载体介质执行。载体介质是一记录介质(例如,磁盘或者CD-ROM)或者诸如信号的传输介质。
现在参考附图,构成了实施例。
附图简述
图1给出了体现本发明处理器的组成部分;图2给出了用于说明由图1的处理器软件流水线的执行指令的图表;图3给出了用于说明软件流水线化循环的不同执行阶段的图表;图4给出了包含循环的高级指令的例子;图5是用于执行图4循环的寄存器的略图;图6给出了本发明一实施例的图1所示的处理器的一部分;图7是用于说明在图1的处理器中所执行的软件流水线化循环的示意图;图8给出了优选实施例中循环指令的格式的一个例子;图9给出了在一实施例中的循环处理单元的一部分;图10(a)至10(c)是用于说明软件流水线的一个例子的示意图;图11是用于说明在本发明的优选实施例中预测寄存器怎样用于控制软件流水线化循环的执行的示意图;图12给出了本发明优选实施例中的预测寄存器电路的一部分;图13(a)至13(d)是用于说明对于不同迭代次数值怎样初始化预测寄存器的示意图;本发明的实施例的详细描述图1给出了体现本发明处理器的组成部分。在这个实施例中,处理器是超长指令字(VLIW)处理器,该处理器具有支持软件流水线和重命名循环寄存器的硬件。处理器1包括指令发出单元10,调度存储单元12,各个第一,第二,第三执行单元14,16,18,以及寄存器文件20。指令发出单元10具有三个分别与第一,第二,第三执行单元14,16,18相连的发出位置IS1,IS2和IS3。二总线24将第一和第二执行单元14和16(但是在这个实施例中没有第三实施例18)与存储器26相连,这个实施例中存储器26是外部随机存取存储器(RAM)装置。存储器26也可以是处理器1内部的RAM。
顺便说一下,尽管图1给出了将执行单元与寄存器文件20和存储器26相连的共享总线22和24,但是完全知道每一个执行单元也可以独立的与寄存器文件和存储器相连。
处理器1执行一系列的处理循环。在每一个处理循环中指令发出单元10可以在每一个发出位置IS1至IS3发出一个指令。根据存储在调度存储单元12中的软件流水线调度表(在下面描述)来发出指令。
在指令发出单元10的不同发出位置发出的指令由相应的执行单元14,16和18执行。在这个实施例中,每一个执行单元同时执行一个以上的指令,以致在有关执行单元所发出的先前指令的执行完成之前,初始化新指令的执行。
为了执行指令,每一个执行单元14,16和18通过第一总线22存取寄存器文件20。保存在寄存器中的值因此可以通过执行单元14,16和18被读和写,寄存器包含在寄存器20中。同时,第一和第二执行单元14和16通过第二总线24存取外部存储器26,以致存储在外部存储器26的存储单元中的值也可以被读和写。第三执行单元18不存取外部存储器26并且这可仅仅处理包含在这个实施例的寄存器文件20中的值。
图1的处理器使用了软件流水线和从不同的迭代中找出覆盖指令的技术,以便减少总的循环执行时间。每一个迭代被分成多个流水线阶段,每一个流水线阶段具有零个或者多个指令。
下面的实例是循环的单流水线迭代的概念图,每一个流水线阶段是一周期阶段1ld4 r4=[r5]阶段2--//empty stage阶段3add r7=r4,r9阶段4st4[r6]=r7这里,在阶段1中的指令是一个取指令,该指令将一个四字节的值存入到逻辑寄存器4中,四字节的值包含在由逻辑寄存器5所指的存储器地址中。
流水线阶段2没有指令(空阶段)。流水线阶段3的指令是一个加指令,该指令将逻辑寄存器4和9中的内容相加在一起并将其结果存储在逻辑寄存器编指令将逻辑寄存器4和9中的内容相加在一起并将其结果存储在逻辑寄存器编号7中。流水线阶段4中的指令是一个存储指令,该指令将逻辑寄存器编号7中的内容存储在由逻辑寄存器编号6所指定的存储器位置上。
在循环的软件流水线执行期间,在预定数目的周期之后初始化新的迭代。连续的迭代的开始之间的周期数被称为初始化间隔(II)。按模计算的调度是软件流水线的一个特殊方式,在该调度中迭代间隔II是一个常数并且循环的每次迭代都具有相同的调度。在本实施例中,假设II是一个周期。
在本例中,还假设循环总共需要五次迭代。图2概念地给出了这五次迭代。可以看出,流水线迭代的每一个阶段是II周期长。同时也可以看出,X至X+7的8个周期是从迭代1的第一个ld4指令的提出到迭代5的最后st4指令的提出所需要的。在这8个周期中,总共提出了15个指令。
软件流水线化循环具有三个阶段开始阶段,核心阶段以及收尾阶段。图3说明了本实施例中每一个阶段的开始。
在开始阶段期间,当II周期充满了流水线,开始新的循环迭代。在开始阶段的第一周期期间,执行迭代1的阶段1。在第二周期期间,执行迭代2的阶段1并且执行迭代1的阶段2,依此类推。
在核心阶段开始时(迭代p的开始,其中p是流水线阶段数)流水线是满的。执行迭代4的阶段1,迭代3的阶段2,迭代2的阶段3以及迭代1的阶段4。
在核心阶段期间,每II周期,开始新的迭代循环,且另外一个被完成了。
最后,在收尾阶段开始时,没有新的循环迭代初始化,并且已经在进行中的迭代继续至结束,用完流水线。在本实施例中,在周期X+5开始收尾阶段因为没有开始新的循环迭代并且迭代3即将结束。这样,在这个实施例中,在收尾阶段期间,结束迭代3至5。
在本例中,在迭代1中的取指令的结果在使用之前(通过迭代1中的加指令)提出迭代2中的取指令。接着属于循环的连续迭代的取指令把不同的寄存器作为目标以避免覆盖现有的有效值。
模计算的调度允许编译器执行并行而不是顺序的循环迭代。然而,传统的多次迭代的重叠执行需要展开循环以及寄存器的软件重命名。这产生了程序代码复制并涉及一个复杂的调度以处理有效的输入和输出值。为了避免展开的需要,在循环的迭代期间用于存储值的寄存器被重命名为迭代进程,以为每次迭代提供它自己的寄存器组。这个寄存器重命名的一个例子是所谓的旋转寄存器。在这个技术中,逻辑寄存器编号和物理寄存器地址之间的映射以循环的方式改变。到头来映射的触发循环可以是软件流水线间界的交叉,例如,一个流水线阶段与下一个流水线阶段的交叉,或者提出了产生值的指令。这些情况在我们相关待决的公开号为CN-A-1308274的中国专利申请中详细描述,通过参照该申请的整个内容都包含在这里。通过使用寄存器重命名,软件流水线可适用于更广泛的各种类型的循环,不管是小的还是大的,并显著的减少了额外消耗。
因为在每次执行时通过编译器可提前知道重命名目标寄存器,因此编译器可为指令所需要存取的寄存器指定适合的逻辑寄存器编号,其中寄存器用于存储循环迭代所使用的值。例如,如果每次软件流水线间界交叉时寄存器重命名调度表引起寄存器被重命名,于是可以知道位于寄存器a中的值可通过n+1阶段的指令从寄存器a+1中存取,其中通过调度循环的n阶段的指令将值存储在寄存器a中(假设逻辑寄存器的编号是从低编号到高编号循环的)。
实际上,编译器的任务是很复杂的,依靠属于循环不同迭代的指令间的关系以及循环内的指令与循环外的指令之间的关系。在循环之前定义的值指的是“循环以内的值”,该值用在循环体内。在循环体内定义并在循环之后使用的值指的是“循环体外的值”。类似的,“再出现的值”或者“再出现定义的值”是在循环的一个迭代内定义并用于循环的随后的迭代中。通常,再出现的值也是循环体内的值因为在循环开始之前它需要为第一次迭代分配一个值。“再定义的值”是在循环之前预先定义的值的再定义。
尽管有这些复杂之处,还是可能发生编译器处理各种情况的循环体内的值,循环体外的值,再出现的值或者再定义的值,以及用作循环的输入的预测寄存器,用在循环每一阶段的寄存器,存储循环中出现的值的寄存器。
然而,实际上会发现,在迭代次数是零的特殊情况下,通常完全绕过循环并且寄存器不循环。这意味着在特殊情况下变成循环体外值的任何循环体内的值有可能在不同的寄存器中,循环体内的值来自在迭代次数是非零的通常情况下存储循环中所产生的值的寄存器。
可发生根本不执行软件流水线化循环的这种特殊情况,例如,当循环指令建立起一个循环以迭代,只要循环控制变量是从起始值到最终值是逐渐变化的,但是最终值本身是可变化的,在执行期间出现循环指令时,最终值小于起始值。
现在参考图4和图5说明当一次或多次执行循环体时导致寄存器的位置与随后的寄存器位置不一致的特殊情况。
假定有这样一个例子,在这个例子中产生值的指令的发出引起出现重命名。软件流水线调度具有v个产生值的指令和p个软件流水线阶段。如果循环迭代n次,于是在执行循环期间寄存器文件要循环v(n+p-1)次。编译器利用这个信息来预测在循环内部所产生的并接着用在循环体外的值在寄存器文件中的位置。通常由循环的最后迭代所产生的值是随后循环体外所需要的。实际上由最后的迭代所产生的每一个这样的值都有一个位置,该位置与循环迭代次数n无关,并且在退出循环体外是不变的,假如循环迭代次数n大于0。循环的最后迭代需要p次提出循环调度。因此,在开始最后迭代和最后退出循环之间存在pv次循环的交替。如果任何值都是继续有效的进入循环并继续有效的退出循环,那么必须至少有pv个旋转寄存器。
图4给出了一个循环的例子。在这个例子中,标量变量s在进入循环之前初始化(第1行),在循环体内再出现(第4行)并且在循环结束之后仍要使用(第7行)。生存期因此跨度整个循环、按照前面所述的,编译器被安排为在每一次迭代第4行的代码过程中从逻辑寄存器编号Sr中读出前一次迭代所产生的值s并将当前迭代所产生的值写入到逻辑寄存器编号Sw。这些寄存器编号被选择以致在寄存器文件被旋转v次之后在先前迭代中写入寄存器Sw中的值现在可用在当前迭代的寄存器Sr中。
在图4中所定义的初始值s必须写入适当的寄存器S1,并且S1必须进行选择,用于当第一次迭代从第4行中读出Sr时,在第1行中写入S1中的值可旋转以致可存取在寄存器Sr。在第一次迭代中第1行和第4行之间的旋转的精确次数取决于发生第4行的软件流水线阶段和在循环调度内使用s的指令的位置。假设将S1中的值移动到Sr中所需要的旋转的次数是q。
最后将s写入逻辑寄存器编号Sw出现在循环的最后迭代的第4行。在第7行中的最后退出循环之后这个最后写入值从逻辑寄存器编号Se中读出。假设将Sw中的值移动到Se中所需要的旋转的次数是t。
图5示意性的给出了这些寄存器S1,Sw,Sr以及Se之间的关系。在图5中,圈表示寄存器文件的旋转区(例如,重命名寄存器的数目-参见以下的图6)。旋转区的大小(例如图5中圆周)被假定为pv个寄存器,这是当存在至少一个既是循环体内的值又是循环体外的值时所需的寄存器的数目。在旋转区的专用寄存器围绕着圆周以相等的定距离间隔。
假设读s(在第4行)发生在软件流水线阶段k,其中0≤k≤p-1。同时假设当在调度期间出现旋转时发生读s(在第4行),其中0≤k≤v-1。因此,q=kv+w并且t=v(p-k-1)+v-w。由此从第1行中所定义的初始值s到一位置的旋转次数由g+t-v给定,其中在该位置上可以找到使用了s的出口位置所需值的指令,该旋转次数是简单的v(p-1)。
因此,假设在循环执行前s写入至的初始逻辑寄存器S1,编译器知道在循环结束之后最后-写入的s值可在逻辑寄存器编号S1+v(p-1)中找到。然而,这不适合根本不执行循环体的特殊情况,如果图4第2行中的控制变量N在执行时间被发现为零或者是负值则出现这种特殊情况。在这种特殊情况中,第7行所需的s值仅仅在S1中找到,而不是同其它所有情况一样在寄存器S1+v(p-1)中找到。这种前后不一致是不利的因为编译器需要用一特殊指令来补充编译的代码以处理使在执行时间内N为零或者为负数。很希望避免编译器不得不处理这种特殊类型的测定。
因此,在这个实施例中(该实施例中的寄存器重命名方法包括当提出产生值的指令时的重命名),根据本发明的处理器被处理为,如果在执行过程中发现循环迭带次数为零,并且因此根本不执行循环体,于是在处理器继续之前,循环的结束之后,寄存器文件旋转v(p-1)次。这样会具有如下的效果,即在退出循环之后在提出第一条指令之前跳过了v(p-1)序列数。在实际上不执行指令的情况下这可通过p-1次调度提出循环的指令而方便的完成。提出每一条产生值的指令将会产生旋转寄存器文件的效果,以致每一个循环调度的完全发出使寄存器文件循环v次。按照这种方式,当循环迭代次数是零,s的初始化值在逻辑寄存器S1+v(p-1)变为可用的,如所述的。
如下文所详细描述的,通过有效地一直处理到流水线化循环的结束模式并且设置附加的(通用的)错误判定以防止执行任何指令来完成p-1次发出指令。
当使用其他寄存器重命名方法时本发明若可适用,例如每次流水线的间界交叉时处理器重命名可重命名的寄存器的技术方法。在这种情况下,处理器通过p-1寄存器在零迭代次数的情况下旋转所述的寄存器。
同样在这种情况下,在零迭代次数的情况下处理器跳过一个或多个可重命名寄存器,但是所跳过的寄存器的数目取决于产生值的指令,并且与流水线阶段的数目无关。最好跳过的寄存器数目是p-1。
顺便说一下,可以理解的是,为了在寄存器重命名方法中根据产生值的指令准确的计算序列的偏移量,产生的指令由于所谓的执行(后面还将论述)仍必须提前提供值的数目。然而,这不会增加存储循环内的中间值所需的寄存器的数目。
假设再出现的值(在任一的先前迭代中作为本身的函数而被计算的任一循环变量值)再循环外按正确的顺序初始化,那么上面所述的技术结合软件流水线可正确的执行。
现在详细的描述本发明的优选实施例。
图6更详细的给出了图1中的寄存器文件20以及有关的电路。
在图6中的寄存器文件20总共具有N个寄存器,N个寄存器中的K个低编号的寄存器组成了静态-编址区20S并且N-K个高编号的寄存器组成了动态-编址区(可重命名的或者旋转的)20R。静态-编址区20S的寄存器用于存储循环-不变量值,然而可重命名区20R的寄存器用于存储循环-变量值。两个区域的间界是可编程的。
如图1所示的指令发出单元10将RENAME信号提供给寄存器文件电路。
如果当发出产生值的指令时所使用的寄存器重命名方法进行重命名,那么产生值的指令检测单元30当发出一个产生值的指令时进行检测。产生值的指令检测单元30适宜包括在如图1所示的指令发出单元10中。当检测到发出这样的指令时,产生值的指令检测单元30产生一个RENAME信号。
如果每次新的迭代的执行开始时,例如,每II处理器周期,所使用的寄存器重命名方法进行重命名。每个II处理器周期,指令发出单元10都产生一个RENAME信号。
RENAME信号提供给寄存器重命名单元32。寄存器重命名单元32与存储映射偏移值OFFSET的映射偏移量存储单元34相连。寄存器重命名单元32响应RENAME信号将存储在映射偏移量存储单元34中的映射偏移值OFFSET减一。
存储在映射偏移量存储单元34中的映射偏移值OFFSET提供给映射单元36。映射单元还接收逻辑寄存器标识符(R)并输出物理寄存器地址(P)。逻辑寄存器标识符(编号)是从0至N-1范围内的整数。映射单元36完成从逻辑寄存器标识符到物理寄存器地址的双射映射。每一个物理寄存器地址也是从0至N-1范围内的整数并且直接标识实际硬件寄存器中的一个。
如果指令指定逻辑寄存器编号R作为它的一个操作数,并且R是包括在0到K-1的范围内,于是物理寄存器编号与那个操作数的逻辑寄存器编号一致。然而,R在K到N-1的范围内,操作数的物理寄存器地址通过这样的P给出P=K+|R-K+OFFSET|N-K在这个表达式中,|y|x表示y模x。
这样,改变映射偏移值OFFSET具有这样的效果,即改变在指令中所指定的逻辑寄存器标识符与寄存器文件20的部分20R中的实际物理寄存器之间的映射。这导致了重命名寄存器。
图1的处理器按照两种不同的模式工作标量模式和超长指令字模式。在标量模式中,在每个处理器周期发出一个单指令以由执行单元14,16和18中的单一一个来执行。单执行单元(例如单元14)是指作为“主”处理单元。在VLIM方式中,每个处理器周期发出一个单VLIM指令包,该指令包包括由指令发出单元10在同一个周期所发出的多个指令。这些指令从不同的发出位置(图1中IS1至IS3)并行发出以由两个或多个执行单元并行操作执行。
图7示意性的给出了标量模式和超长指令字模式之间的转移,以及不同类型的VLIM程序代码块。如图5所示,从标量模式至超长指令字模式之间的转移是由主执行单元执行转移分支指令到VLIM(bv)指令而引起的。从VLIW模式至标量模式的转换是通地由这些执行单元中的任一个执行从VLIW返回(rv)指令而实现的。
VLIM调度内的程序代码逻辑上是由两种不同类型的程序代码块组成线性块和循环块。每一块包括一个或多个VLIM包。当进入每一个VLIM调度,处理器执行线性块。这允许通过执行一个循环指令来初始化随后的循环块。
图8给出了本发明优选实施例的循环指令的格式。如图8所示,循环指令40具有包括迭代次数字段40A,收尾迭代次数字段40B以及大小字段40C的各种字段。在大小字段40C所指定的11位的值的大小定义了循环块的长度。由迭代次数字段40A所指定的5位操作数Ad标识了包括迭代次数(IC)的地址寄存器。IC是循环中迭代的数目。
由字段40B所指定的5位的值识别码是收尾迭代次数(EIC)。EIC是循环收尾阶段的迭代次数,例如,在收尾阶段期间所完成的迭代数目。参考图2和图3在上述的实施例中,IC=5并且EIC=3。从图6中可以看出,循环指令40具有独立的字段40A和40B以分别指定IC和EIC,以致这些参数可彼此相互独立的设置。典型的,EIC=p-1,其中p是流水线阶段的数目。如下文所详细描述的,存储在循环指令的字段40A和40C在循环启动使用,以对处理器的各种循环控制寄存器初始化。
循环指令可按如下写出loop p,Ad,size,eic自动的迭代循环块,当循环迭代的次数到达由循环指令所指定的IC时结束。也可以在到达IC之前通过执行退出指令来强行早些从循环中退出。当循环块结束时,已经进入随后的线性块。通过执行rv指令来初始化下一个循环块,或者结束VLIM调度。当结束VLIM调度,处理器转回标量模式。顺便说一下,如图7所示,处理器在重新设定时最初进入标量模式。
处理器1具有各种控制器以控制循环的开始和结束。在这些处理器中,图9给出了迭代次数寄存器(IC寄存器)50和循环内容寄存器52。与这些有关的更新一步的信息和其他的寄存器都在我们相关待决的公开号为GB-A-2362733的英国专利申请中描述(与公开号为CN-A-1326132的中国专利申请相对应),通过参照该申请的整个内容都包含在这里。
在循环开始期间,通过循环迭代字段40A的地址寄存器的操作数Ad所定义的迭代次数IC复制到寄存器50中。假设没有退出指令提前结束循环核心阶段,那么IC值表示迭代的最大数目,该IC值在循环收尾阶段之前被初始化。
循环内容寄存器52具有旋转控制字段52A,循环次数字段52B,EIC字段52C以及循环大小字段52D。字段52C和52D中值EIC和LSize在循环开始期间被初始化为具有由循环指令字段40B和40C所指定的识别码值和大小。循环次数字段指定了值LCnt,该值定义了在到达当前循环迭代的结尾之前仍在执行的VLIM包的数目。值LCnt被初始化为与LSize具有相同的值并且每次在循环内提出一个包时增加该值。当开始新的迭代时它从Lsize重装入。
在收尾阶段期间,当每次开始新的收尾迭代时字段52C中的EIC值增加。
旋转控制字段52A存储单一的位R,该位R通过循环控制电路自动设置以指示是否启动还是禁止当前迭代的寄存器旋转。这个位仅仅用于记录寄存器旋转的交叉的内容转换间界的状态,例如,为了保存和修复处理器状态。
一旦寄存器50和52以及其他的循环控制寄存器由于循环指令的执行而被初始化,处理器进入VLIM循环模式。在这个模式下,它重复的执行循环块程序代码,在开始每一个新的循环之前检查循环持续执行的条件。
在循环执行期间,预测寄存器用于控制指令的执行。参考图10(a)至图10(c),11和12,现在描述这种方式,在该方式下执行这种控制。
图10(c)给出了在调度之前的循环。图10(b)给出了在调度五个流水线阶段(阶段1至5)之后的循环。图10(c)给出了图10(b)的流水线调度的七个重叠迭代的时空图。图10(c)还给出了执行的开始阶段,核心阶段以及收尾阶段。
在循环的开始阶段,每一个流水线阶段中的指令需要以规定的方式操作。同样的,在收尾阶段,每一个流水线阶段中的指令需要以规定的方式不操作。利用判定可方便的实现这种操作和不操作。
现在参考图11,重叠的迭代与图10中所说明的相对应。同样图11中所说明的是一组五个预测寄存器P1至P5。这些判定预测寄存器P1至P5分别与流水线化循环调度中的流水线阶段1至5相对应并且存储在预测寄存器中的各个状态在循环执行期间从一个阶段变化为下一个阶段。这些预测寄存器与处理器1中的每一个执行单元14,16,18相联系。
软件流水线调度中的每一个指令用判定编号来标记,该判定编号是预测寄存器P1至P5其中一个的标识符,在图11的例子中,流水线调度的阶段1至5中的指令分别用预测寄存器标识符P1至P5来标记。
当指令发出单元10发出一个指令时,首先确定与该指令相对应的预测寄存器的状态(由指令的标识符来标识)是真还是假。如果相应的预测寄存器的状态是真,于是指令自动转换为NOP指令。如果相应的预测寄存器的状态是假,于是指令按照通常情况执行。
因此在流水线阶段i调度的所有指令用判定标识符标记。为了调度以正确的操作,在循环执行期间,必须使预测寄存器P1的状态为真只要流水线阶段i可操作,对于所有i的相应的值而言。这提出了一个可操作和不可操作阶段的机制以控制循环的执行。
图11给出了在循环执行期间对于每一个软件流水线而言预测寄存器是怎样变化的。在开始循环之前,每一个预测寄存器P1至P5被设置为状态0(假状态)。在初始化第一次迭代之前,状态1被设置到第一预测寄存器P1中(真状态),这样包含在每一迭代的第一阶段中的指令可操作。所有的其他预测寄存器P2至P5保持状态0,以致没有包含在第二至第五阶段中的指令在第一个II周期内执行。
在初始化第二次迭代之前,同样的状态1被设置到第二预测寄存器P2中,这样包含在循环调度第二阶段中的指令可操作。预测寄存器P1仍具有状态2,以致包含在第一阶段中的指令同样在第二个II周期期间也执行。预测寄存器P3至P5保持状态0,因为还不需要包含在第三至第五流水线阶段中的指令。
在开始阶段期间,每一个连续的预测寄存器按顺序变为状态1,使每一个流水线阶段按规定的方式操作,直到所有五个预测寄存器都保持状态1并且所有的阶段都可操作。这标志着核心阶段的开始,在核心阶段中所有流水线阶段的指令在不同的迭代中执行。在整个核心阶段期间所有的预测寄存器都为状态1。
在收尾期间,流水线阶段按规定方式不操作,从阶段1开始到阶段5结束。因此,在每一个流水线阶段的间界之前,状态0连续的按顺序装载到每一个预定寄存器P1至P5,从P1开始。流水线阶段因此按规定的方式不操作,这样保证正确的停止循环。
从图11所示的预测寄存器可清楚的看到一个动态模式。在我们相关待决的公开号为CN-A-1329303的中国专利申请利用了如图12所示的判定文件电路。通过参考CN-A-1329303的整个内容都包含在这里。
在图12,预测寄存器文件135具有n个预测寄存器P0至Pn-1。预测寄存器P0和P1分别永久的预制0和1。为了控制循环,预测寄存器P3至Pn-1可用作预测寄存器。寄存器P2保留,其原因在下面解释。n位寄存器131(下文指的是“循环标志”寄存器)用于标识n-3个预测寄存器P3至Pn-1的子集合136,预测寄存器P3至Pn-1实际上用作预测寄存器以达到控制循环的目的。循环标志寄存器131拥有n位,这n位分别与预测寄存器文件135中的n个寄存器相对应。
如果预测寄存器Pi包括在子集合136中,那么在循环标志寄存器131中的相应的第i位被设置为值“1”。相反,如果预测寄存器Pi没有包括在子集合136中,那么在循环标志寄存器131中的相应的第i位被设置为值“0”。典型的循环标志寄存器131包含一个从第3比特向前的任一位置开始的单一的连续序列,并且该序列的最大长度为n-3。
在这个例子中,循环标志寄存器131的位14值25被设置为1,并且所有其他的位被设置为0,以致这种情况下子集合136包括寄存器P14至P25。
预测寄存器标识符附着于循环块的每一个指令以直接的标识预测寄存器文件135的子集合136中的其中一个预测寄存器。
如果,例如,存在32个预测寄存器,预测寄存器标识符用包含在指令中的5比特字段标识。
特殊流水线阶段中的所有指令的标识符都是相同的以致根据预测寄存器的值所有的指令都可操作或不可操作。然而,这需要多于一个的与特殊流水线阶段相关的预测寄存器(例如具有if/then/else或者比较指令)。
在每一个连续循环迭代的初始化之前,执行转移操作,在该操作中将子集合136的每一个预测寄存器的内容设置为它紧靠右侧的预测寄存器的内容。紧靠转移子集合右侧的预测寄存器(图12中的P13)是一个源寄存器137。这样,在每一个转移操作中转移寄存器子集合136的第一个预测寄存器的内容(P14)被设置为源寄存器的内容(“来源”)。
例如,参考图11,在循环执行的开始和核心阶段,源寄存器被预置到状态“1”,而在收尾阶段,为了结束循环将源寄存器137预置为状态“0”。当出现转移时,源寄存器的内容被复制到最右边的寄存器(P14),但是源寄存器的内容保持不变。
在循环建立处理期间,循环标志寄存器131的内容被用作初始化预测寄存器的转移子集合13和源寄存器137。如下面所述的它们的初始化值取决于迭代次数以及循环标志寄存器131中的实际比特模式。
现在参考图13(a)至13(d),图13(a)再次给出了图12中的循环标志寄存器131。图13(b)给出了在循环指令所指定的迭代次数是零的情况下清除源寄存器137和转移子集合136中的所有预测寄存器。
如图13(c)所示,如果由循环迭代所指定的迭代次数是1,清除源寄存器137并且除了紧靠源寄存器137左侧的预测寄存器之外转移子集合136的所有预测寄存器都被清除。紧靠源寄存器137左侧的预测寄存器被设置为1。
如图13(d)所示,如果由循环迭代所指定的迭代次数大于1,于是源寄存器137和紧靠源寄存器137左侧的转移子集合136中的预测寄存器都被设置为1。转移子集合136中所有的其他预测寄存器被设置为0。
这样具有一个或者多个迭代的任一循环的循环建立处理将值00…01分配给预测寄存器文件135中的转移子集合136。
在循环的执行期间,在结束每一个迭代时,转移子集合被从一位置转移到左边,并且源寄存器被复制到转移子集合的右侧端。另外,结束每一个迭代时IC寄存器50减1。
当IC寄存器50到达零时,清除源寄存器137,并且开始循环的收尾阶段。在收尾阶段中的迭代次数是由包含在循环内容寄存器中的EIC确定的,这是通过循环指令设置的作为循环建立处理的一部分。
在任何时候,循环本身可初始化提早由于执行退出指令而结束循环。当执行退出指令时并且与之相关的寄存器设置为1,通过清除IC寄存器50和当完成当前迭代时清除源寄存器而使处理器进入循环结尾阶段。然而,如果退出指令出现在循环流水线阶段1,那么所有的不可取消的状态改变的操作必须在流水线阶段1或之后的循环调度中出现,并且如果它们在阶段i,那么它们必须在退出指令之前提出。
当处理器在收尾阶段,指令按通常的情况发出。在每一个迭代结束时,预测寄存器的子集合136被转移并且循环内容寄存器52中的EIC减小。当到达循环迭代的结尾并且IC寄存器50和循环内容寄存器52中EIC值为零时,处理器退出循环模式。
如果当每次流水线交叉时所使用的寄存器重命名方法重命名,那么通过循环所执行的重命名操作(旋转)的次数总是IC+EIC。如果每次发出产生值的指令时所使用的寄存器重命名方法将要重命名,那么通过循环所执行的重命名操作(旋转)的次数总是(IC+EIC)v,其中v是循环调度中产生值的指令的数目。
在循环序列期间用于执行预测寄存器135的操作的逻辑电路的例子在我们相关待决的公开号为GB-A-13626132的英国专利申请中描述。在该申请中初始化操作由伪代码表示For all i from 2 to n-1Pi′=Li‾AND(PiORLi+1)]]>在本发明的实施例中,修改初始化操作以考虑到迭代次数(例如在循环指令中所指定)从而使源寄存器137和子集合136的第一个寄存器根据IC和循环标志寄存器131中的内容而被设置。所修改的伪代码如下For all i from 3 to n-1if Li=1 and Li-1=0Pi=(IC≠0)Pi-1=(IC>1)elseif Li=1 and Li-1=1Pi=0如CN-A-1329303所描述的,可利用标准的逻辑设计技术来实现一电路以产生有限状态时序机以作为与每一个预测寄存器相联系的操作单元的一部分,其中该电路是用于执行在处理器执行期间预测寄存器文件所需要的初始化操作和其他任何操作。在这种情况下对于Pi计算下一个状态的输入包括IC,除了各种选择信号以及在CN-A-1329303所描述的循环标志寄存器位。
如上所述,体现本发明的处理器被设置为,如果在执行时间发现循环迭代次数为零,并且因此循环体根本不执行,于是在处理器继续之前循环的结束之后寄存器文件旋转一定的次数。将具有如下的效果,即在退出循环之后在发出第一条指令之前跳过了预定数目的可重命名寄存器。在实际上不执行指令的情况下可通过p-1次调度循环指令而方便的完成。
通过有效地一直处理到流水线化循环的结束模式并且设置附加的(通用的)错误判定以防止执行任何指令来完成p-1次发出指令。
如上所述,本发明的实施例具有的优点是在通常情况下和异常情况下(零迭代)的寄存器的定位相同,避免编译器需要提供附加的程序代码以处理异常情况。这减少了所有的程序代码的大小。这也取消了检查异常情况的需要并避免了处理所引入的额外消耗。最后,简化了由编译器或程序器所产生的程序代码。
权利要求
1.用于执行软件流水线化循环的处理器,包括多个寄存器,用于存储通过执行指令而产生和使用的值;寄存器重命名装置,用于在循环执行期间重命名寄存器;以及循环处理装置,用于在软件流水线化循环要求零迭代的情况下,以预定的方式引起寄存器被重命名。
2.按权利要求1的处理器,其中循环处理装置引起寄存器重命名以致循环体内的值在零迭代的情况下与在需要一次或多次迭代的循环的情况在同一寄存器内。
3.按权利要求1或2的处理器,其中所述循环处理装置用于在循环要求零迭代的情况下只引起执行循环的收尾阶段。
4.按权利要求3的处理器,其中所述的循环处理装置包括一个或多个收尾迭代,每一个收尾迭代通过所述的寄存器重命名装置引起一个或多个寄存器的重命名操作。
5.按权利要求4的处理器,其中寄存器重命名装置用于当开始新的迭代时对寄存器重命名,并且在所述收尾阶段所引起的所述寄存器重命名操作总的次数比软件流水线阶段的数目小一。
6.按权利要求4的处理器,其中寄存器重命名装置用于当每次发出产生值的指令时对寄存器重命名,并且在所述收尾阶段所引起的所述寄存器重命名操作总的次数是所产生的产生值的指令的数目并比软件流水线阶段的数目小一,其中产生值的指令是每次迭代所提出的。
7.按权利要求4至6的任一项的处理器,其中所述收尾迭代的次数比软件流水线阶段的数目小一。
8.按权利要求3至7的任一项的处理器,其中在收尾阶段的寄存器重命名操作的次数是可指定的与循环本身的迭代次数无关。
9.按权利要求4至8的任一项的处理器,其中收尾迭代的次数是可指定的与循环本身的迭代次数无关。
10.按权利要求9的处理器,其中收尾迭代的次数被指定在由处理器所执行的一指令中。
11.按权利要求9的处理器,其中收尾迭代的次数被指定在软件流水线化循环的开始期间所执行的一循环指令中。
12.按权利要求11的处理器,其中循环的迭代次数也可独立的指定在所述循环指令中。
13.按权利要求11的处理器,其中所述循环指令具有一独立的字段,所述收尾迭代的次数被指定在该字段中。
14.按权利要求11的处理器,其中所述循环指令具有一独立的字段,循环迭代的次数被指定在该字段中。
15.按权利要求3至14的任一项的处理器,其中当初始化循环时,所述循环处理装置用于接收用于指定循环中的迭代数目的迭代次数并且,如果所指定的数目为零,所述循环处理装置用于仅仅引起执行收尾阶段并且,如果所指定的数目为非零,所述循环处理装置用于引起循环的开始,核心以及收尾阶段的执行。
16.按前面权利要求中的任一项的处理器,适宜指令的判定执行,并且进一步包括分别与不同软件流水线阶段相对应的预测寄存器,每一个预测寄存器在第一状态和第二状态之间是可转换的,在第一状态中与之相对应的软件流水线阶段是可操作的,在第二状态中与之相对应的软件流水线阶段是不可操作的;所述循环处理装置用于根据循环的迭代次数对预测寄存器初始化。
17.按权利要求16的处理器,其中所述循环处理装置用于当循环迭代的次数是零时以一种方式对预测寄存器初始化并且当循环迭代的次数不是零时以至少另外一种方式对预测寄存器初始化。
18.按权利要求16或17的处理器,其中当循环迭代的次数是零时,与循环的阶段相对应的所有寄存器在第二阶段初始化,同时当循环的迭代次数是非零时,与第一流水线阶段相对应的预测寄存器在第一阶段初始化,并且与随后阶段相对应的每一个预测寄存器在第二阶段被初始化。
19.按权利要求16,17或18的处理器,进一步包括转移装置,用于将与第一流水线阶段相对应的预测寄存器的状态转移到与第二流水线阶段相对应的预测寄存器中,依此类推对于与每一个随后的流水线阶段相对应的预测寄存器,并且根据源寄存器设置与第一流水线阶段相对应的预测寄存器的状态;所述循环处理装置,用于根据不同的循环迭代次数对源寄存器进行初始化。
20.按权利要求19的处理器,其中当循环的迭代次数是零或者一时,所述循环处理装置在第二阶段对源寄存器初始化,并且当循环的迭代次数是二或者更多时,在第一阶段对源寄存器初始化。
21.用于处理器的一种编译方法,包括在软件流水线化循环是零迭代次数的情况下,指定目标程序中的将由该处理器进行的一个寄存器重命名。
22.按权利要求21的编译方法,其中在零迭代次数的情况下处理器只执行循环的收尾阶段,并且编译方法涉及包括在目标程序中指定在收尾阶段执行的寄存器重命名操作的次数。
23.按权利要求21或22的编译方法,其中在零迭代次数的情况下处理器只执行循环的收尾阶段,并且编译方法涉及包括在目标程序中指定在收尾阶段执行的迭代次数。
24.按权利要求22或23的编译方法,其中所述信息被指定在一指令中,该指令包括在目标程序中。
25.按权利要求24的编译方法,其中所述指令是在软件流水线化循环的开始期间所执行的循环指令。
26.按权利要求25的编译方法,其中循环指令也独立的指定循环中的迭代次数。
27.由处理器执行的目标程序,所述的目标程序包括指定在软件流水线化循环的收尾阶段要执行的迭代的次数的信息。
28.按权利要求25的目标程序,其中在零迭代次数的情况下处理器只执行循环的收尾阶段,并且目标程序包括用于指定在收尾阶段执行的迭代次数的信息。
29.按权利要求25的目标程序,其中所述信息被指定在一指令中,该指令包括在目标程序中。
30.按权利要求29的目标程序,其中所述指令是在软件流水线化循环的开始期间所执行的循环指令。
31.按权利要求30的目标程序,其中循环指令也独立的指定循环中的迭代次数。
32.一计算机程序,当运行计算机时,该计算机程序引起计算机执行用于处理器的编译方法,计算机程序包括一重命名信息指定部分,用于在软件流水线具有零迭代次数的情况下在目标程序中指定由处理器执行的寄存器重命名。
33.按权利要求27至32的任一程序中,该程序记载在媒体介质上。
34.按权利要求33的程序中,媒体介质是一记录介质。
35.按权利要求34的程序中,媒体介质是一传送介质。
36.用于处理器的编译装置,包括用于在软件流水线具有零迭代次数的情况下在目标程序中指定由处理器执行的寄存器重命名的装置。
37.循环指令,由处理器执行以开始一软件流水线化循环,包括用于在循环的收尾阶段所执行的迭代次数的信息。
38.按权利要求34的循环指令中,进一步包括独立的指定循环的迭代次数。
全文摘要
处理器可执行软件流水线化循环。多个寄存器(20)存储执行指令所产生和所使用的值。寄存器重命名单元(32)在执行循环期间对寄存器重命名。在软件流水线化循环需要零迭代的情况下,寄存器以预定的方式被重命名以使寄存器的位置与执行一次或多次迭代的通常情况下所发生的寄存器的位置相一致。这可通过只执行产生循环调度指令的循环的收尾阶段来实现以致不牵扯他们的结果。在收尾阶段提出的指令引起自动执行预定的重命名。收尾迭代的次数可被指定在用于开始循环的循环指令中。
文档编号G06F9/30GK1372190SQ0210540
公开日2002年10月2日 申请日期2002年1月31日 优先权日2001年1月31日
发明者尼格尔·彼德·托法姆, 雷蒙德·马尔科姆·利维斯利 申请人:斯罗扬有限公司