CN1308274A - 在处理器中传送指令结果及处理器的编译方法 - Google Patents

在处理器中传送指令结果及处理器的编译方法 Download PDF

Info

Publication number
CN1308274A
CN1308274A CN01103251A CN01103251A CN1308274A CN 1308274 A CN1308274 A CN 1308274A CN 01103251 A CN01103251 A CN 01103251A CN 01103251 A CN01103251 A CN 01103251A CN 1308274 A CN1308274 A CN 1308274A
Authority
CN
China
Prior art keywords
instruction
value
register
generation
processor
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.)
Pending
Application number
CN01103251A
Other languages
English (en)
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.)
SROYOUNG Ltd
Original Assignee
SROYOUNG Ltd
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 SROYOUNG Ltd filed Critical SROYOUNG Ltd
Publication of CN1308274A publication Critical patent/CN1308274A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/441Register allocation; Assignment of physical memory space to logical memory space
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level
    • G06F8/4452Software pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3824Operand accessing
    • G06F9/383Operand prefetching
    • G06F9/3832Value prediction for operands; operand history buffers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3838Dependency mechanisms, e.g. register scoreboarding
    • G06F9/384Register renaming

Abstract

一个处理器,能够支持软件流水线执行,这个处理器的指令产生单元10以一个预定序列产生需要被执行的指令。处理器根据相应产生值的指令的产生顺序来给所产生的值分配相应的序列号码。每一个被产生的值被分配寄存器集合中的一个寄存器,该寄存器与分配到这个值的序列号码相关。每一次产生一个产生值的指令时,就可以对寄存器进行重新命名,从而编译器对寄存器进行分配的工作被简化,并且指令集合可以更紧凑。

Description

在处理器中传送指令结果及处理器的编译方法
本发明涉及在处理器中传送指令结果并且涉及处理器的编译方法。特别地,本发明涉及用于保存处理器(例如微处理器)中的指令结果的寄存器的分配。
在高性能的计算中,目标机器(例如,微处理器)通常需要高速率地来执行指令。执行时间通常是由应用程序中的循环结构来决定的。为了允许高速地执行指令,一个处理器可能包括多个独立的执行单元,在其它执行单元执行指令的同时,每一个独立的执行单元可以执行一个或者多个指令。
这样一个多执行单元的结构可以被用于提供所谓的、由多级组成的软件流水线。每一个软件流水线级与特定执行单元不具有固定的物理联系。相反,当一个应用程序中的一个循环结构被编译时,根据一个软件流水线规划,组成循环的各个独立迭代的机器指令被安排由不同的执行单元来执行。这个规划被分成连续的级,并且以这样一个方法来规划指令,以允许通过在连续迭代发起之间使用一个被选择的循环发起间隔,由不同的执行单元并行执行多个迭代。这样,当一个迭代i的第一级结束时,这个迭代进入到第二级,在迭代i+1的第一级中开始对下一迭代的执行。这样,在执行迭代i的第二级中指令的同时,执行迭代i+1的第一级中的指令。
在这样的软件流水线循环结构中,通常有必须在流水线中的不同指令之间进行交换的循环变量值,即在循环的每一个不同迭代中必须进行重新评估的表达式。为了处理这样的循环变量,可以将它们保存在一个所谓的循环寄存器文件中。在这个情形下,每一个循环变量被分配循环寄存器文件中的一个逻辑寄存器号码,并且这个逻辑寄存器号码对不同的迭代是不变的。在这个循环寄存器文件中,每一个逻辑寄存器号码被映射到这个寄存器文件中的一个物理寄存器,并且每一次一个新的迭代开始时,这个映射被循环,即,每一次一个流水线边界是闭合的。所以,不同迭代中的相应指令均涉及相同的逻辑寄存器号码,这使被编译的指令简单了,同时避免了一个迭代所产生的一个值被一个不同迭代的一个随后执行的指令所覆盖掉。
对前面所考虑的处理器来说,编译器在将循环寄存器文件中的寄存器分配到一个循环计算中所产生的值中的任务是复杂的,这如本发明的说明书在后面所详细描述的。所以,在一个循环计算中能够提供一个机制来标识中间值,包括循环变量值是非常好,这可以简化在分配循环寄存器文件中的寄存器时编译器的任务。另外,给一个处理器提供其中指令是非常紧凑的一个指令集合也是非常可取的。
根据本发明的第一方面,提供了一个处理器,包括:指令产生装置,用于以一预定序列来产生需要被执行的指令,所述指令序列包括预先选择的、用于产生值的指令,当执行这个预先选择的、用于产生值的指令时,可以产生相应的值;指令执行装置,用于执行所产生的指令;寄存器装置,具有多个寄存器,用于保存执行指令时所产生的值;序列号码分配装置,用于根据所述产生值的指令的产生顺序来向相应产生值的指令所产生的所述值分配相应的序列号码;和寄存器分配装置,用于给每一个所述被产生的值分配所述寄存器中的一个,用于保存该被产生的值,这与被分配到这个值的序列号码相关。
对这样一个处理器,编译器在执行分配寄存器的任务时就简单了。例如,这个寄存器装置的形式可以是一个循环寄存器文件,并且每一次产生预先选择的、用于产生值的一个指令时,寄存器可以被重新映射(重新命名)。这样一个处理器的指令集合也可以变得更紧凑,以使产生值的指令不需要说明任何目的寄存器来保存它们相应的被产生值。
根据本发明的第二方面,提供了一个编译方法,用于将一个高级程序指令序列转换为被一个处理器所执行的、相应的低级指令序列,这个方法包括步骤:决定所述相应序列中的哪一个所述低级指令是预先选择的、用于产生值的指令,并且哪一个是预先选择的、需要值的指令,每一个所述产生值的指令是当被执行时就会产生一个值的一个指令,并且每一个所述需要值的指令是当被执行时就需要前一个产生的、产生值的指令所产生的所述值的一个指令;根据执行期间相应产生值的指令被产生的顺序来向所述被产生值分配相应的序列号码;和用在执行期间所述处理器所使用的信息来给每一个所述需要值的指令进行编码,以标识这个指令所需要的所述产生值,这个信息与被分配到这个产生值上的所述序列号码相关。
根据本发明的第三方面,提供了一个计算机程序,其中当在一个计算机上执行这个程序时,这个程序将促使这个计算机执行实现本发明前述第二方面的一个编译方法。
根据本发明的第四方面,提供了一个计算机程序,其中当在一个计算机上执行这个程序时,这个程序将促使这个计算机执行用于将一个高级程序指令序列转换为被一个处理器所执行的、一个相应的低级程序指令序列,这个计算机程序包括:一个决定部分,用于决定所述相应序列中的哪一个所述低级指令是预先选择的、用于产生值的指令,并且哪一个是预先选择的、需要值的指令,每一个所述产生值的指令是当被执行时就会产生一个值的一个指令,并且每一个所述需要值的指令是当被执行时就需要前一个产生的、产生值的指令所产生的所述值的一个指令;一个分配部分,用于根据执行期间相应产生值的指令被产生的顺序来向所述被产生值分配相应的序列号码;和一个编码部分,用在执行期间所述处理器所使用的信息来给每一个所述需要值的指令进行编码,以标识这个指令所需要的所述产生值,这个信息与被分配到这个产生值上的所述序列号码相关。
现在,通过示例来参考附图,其中:
图1显示了实现本发明的一个处理器的一部分;
图2显示了描述在一个编译过程中所使用的一个符号数据流图的一个示意图;
图3是描述在编译过程中所使用的、图2的一个树型结构内部表示的一个示意图;和
图4提供了一个在解释一个处理器使用软件流水线来执行指令时所使用的表;
图5是被包括在一个前面所考虑的处理器中的一个寄存器文件的一部分的一个示意图表示;
图6(A)和6(B)提供了一个表,以用于解释前面在图5中所考虑的处理器在编译过程中如何指定寄存器;
图7提供了一个表,以用于解释实现了本发明的一个处理器如何使用软件流水线来执行指令;
图8显示了描述在图7的执行中如何分配寄存器的一个示意图;
图9显示了在本发明的一个实施方式中,图1处理器中的一部分;
图10显示了一个流图,以用于解释实现了本发明的编译过程;
图11显示了在根据本发明另一个实施方式的处理器中的一个模式寄存器的一部分;
图12显示了包括一个循环的高级指令的一个示例;和
图13是在执行图12的循环中所使用的寄存器的一个示意图表示。
图1显示了实现本发明的一个处理器的一部分。在这个示例中,这个处理器是一个超长指令字(VLIW)处理器,其硬件能够支持软件流水线和循环寄存器重新命名。这个处理器1包括一个指令产生单元10,一个规划存储单元12,相应的第一、第二和第三执行单元14,16和18,和一个寄存器文件20。这个指令产生单元10具有分别连接到第一、第二和第三执行单元14,16和18的3个产生槽(issue slot)IS1,IS2,IS3。第一总线22将所有这3个执行单元14,16和18连接到寄存器文件20。第二总线24将第一单元和第二单元14和16(但是,在这个实施方式中,不包括第三执行单元18)连接到一个存储器26,在这个示例中,这个存储器26是一个外部随机访问存储器(RAM)设备。替代地,这个存储器26可以是处理器1内部的一个RAM。
顺便说说,虽然图1显示了用共享的总线22和24将执行单元连接到寄存器文件20和存储器26,但是应理解,替代地,每一个执行单元可以通过其独立的连接连接到寄存器文件和存储器。
处理器1执行一系列处理周期。在每一个处理周期中,指令产生单元10可以在每一个产生槽IS1到IS3产生一个指令。这些指令是根据被保存在规划保存单元12中的一个软件流水线规划(下面将描述)而产生的。
指令执行单元10在不同产生槽上所产生的指令被相应的执行单元14,16和18所执行。在这个实施方式中,每一个执行单元可以同时执行比1个指令多的指令,以使一个执行单元在完成前一个指令的执行前,就可以开始执行一个新的指令。
为了执行指令,每一个执行单元14,16和18能够经过第一总线22访问寄存器文件20。所以,被保存在寄存器文件20的寄存器中的值可以被执行单元14,16和18所读取和写入。另外,第一和第二执行单元可以经过第二总线24访问外部存储器26,以使也可以读取和写入被保存在外部存储器26的存储器位置中的值。第三执行单元18不能够访问外部存储器26,所以在这个实施方式中,仅能够操作被保存在寄存器文件20中的值。
下面,将更详细地描述图1处理器的操作,并且将参考一个特定的示例来描述用于编译指令的一个编译过程。在这个特定的示例中,已经假定,以高级语言C所编写的一个应用程序包括下述简单的循环:
1:for(i=0;i<m;i++)
2:dy(i)=dy(i)+da*dx(i)
在用于执行线性代数的应用程序(软件包)中,很容易发现这样一个循环。在这个循环中,一个数组dy的每一个元素dy(i)(i=0,1,…,m-1)之间是以一个常数值da和另一个数组dx中一个相应元素dx(i)之间乘积来递增的。
图1处理器编译这个循环的过程从产生如图2所显示的一个符号数据流图开始。下一个步骤是执行各种优化步骤,来将图2的数据流图转换为更接近图1处理器的实际机器指令的一个形式。在这个优化步骤期间,这个编译器决定在这个循环中哪一个值将被改变(循环变量值),并且哪一个值将保持不变。例如,在整个循环的期间,da的值是不会被改变的。
数组dx和dy将被保存在外部存储器26(图1)的存储器位置中,所以,在图2的数据流图中对它们的引用必须被转换为相应的存储器访问操作。这样,每一个数组dx和dy至少需要一个指针来指向外部存储器26中保存了这个数组元素的存储器位置。每一个这样的指针被保存在寄存器文件20的一个寄存器中。
虽然也可以使用一个类似的、指向存储器中其保存位置的指针来处理常数值da,但是,因为这个值是一个不在循环中发生改变的值,所以,在执行循环期间,一个更方便和快速的方法是将它直接保存在寄存器文件20的其自己寄存器中。最后,在这个优化过程中,这个编译器考虑这个可以被使用的处理器指令中的任何有利的特征,例如自动增加地址的模式。
图3显示了从这个优化过程所产生的、表示图2数据流图的一个内部编译器表示的一个示例。图3显示了各机器指令和它们之间的相关关系(从第一指令指向第二指令的一个箭头表示这第二指令与第一指令的执行结果相关)。图3中与每一个箭头相关联的还有一个数,这个数表示完成对这个箭头开始点所表示的这个指令的执行所需要的处理器周期数目。
图3中第一指令I1是一个载入指令“ld v0,(r1++)”。这个指令被用于将数组元素dx(i)的值载入到寄存器文件20的一个寄存器v0中。这个值被从外部存储器26中、由寄存器文件20的另一个寄存器r1所指向的存储器位置中读取出来。在指令I1中在“r1”后面的“++”表示在读取这个寄存器r1所指向的存储器位置后,寄存器r1的值被增加以指向外部存储器26中的下一个存储器位置。这是编译器利用处理器1自动增加地址模式的优点的一个示例。
第二指令I2是一个乘法指令“mul v1,r3,v0”。这个乘法指令被用于将在第一指令中被载入到寄存器v0中的dx(i)的值,乘以被保存在寄存器文件20的另一个寄存器r3中的值da。乘法结果被保存在寄存器文件20的一个寄存器v1中。
图3中的第三指令I3是另一个载入指令“ld v2,(r2++)”。这第二载入指令被用于将被保存在由寄存器文件20的一个寄存器r2所指向的存储器位置中的数组元素dy(i)的值载入到寄存器文件20的一个寄存器v2中。这第二载入指令也是一个自动增加地址模式的指令,在完成读取操作后它自动地增加寄存器r2,以使然后指向刚才读取的位置后一个存储器位置。
图3的第四指令I4是一个加法指令“add v3,v1,v2”。这个指令将被保存在寄存器v1和v2中的相应值(即,da*dx(i),和dy(i))加在一起,并且然后将结果保存在寄存器文件20的另一个寄存器v3中。
图3中的第五指令I5是一个保存指令“st v3,(r4++)”。这个指令被用于将被保存在寄存器v3中的值保存在外部存储器26中、由寄存器文件20的另一个寄存器r4所指向的、用于保存dy(i)的存储器位置中。
在第二载入指令I3中,从其中读取dy(i)的存储器位置(寄存器r2所指向的)必须是与保存指令I5中将dy(i)写入到其中的存储器位置相同(寄存器r4所指向的)。所以,最好是在第二载入指令I3和保存指令I5中使用一单个寄存器(例如r2)来指向dy(i)。但是,在这个示例中,使用一单个寄存器是不可能的,因为(这从后面的描述中就会更清楚)软件流水线导致在下一个迭代中,在执行当前迭代中的保存指令I5以前执行第二载入指令I3。如果保存指令I5将使用与载入指令I3相同的寄存器r2来指向dy(i),则在这个寄存器r2被当前迭代中的保存指令I5使用以前,寄存器r2将被下一个迭代的载入指令I3增加。因为这个原因,在图3中使用两个寄存器r2和r4来指向dy(i),这两个寄存器在每一个迭代的开始时具有相同的值,并且在迭代期间每一个被增加一次,但是r4的增加相对于寄存器r2的增加来说是滞后的。
在图3中,可以看出,指令I1到I4所产生的结果均是在循环中被改变的量,它们是在循环中随着每一个迭代而改变的量。因为这个原因,这些中间值被分配了临时寄存器标识符(号码)v0到v3。这些不是最后的寄存器分配,而仅仅是这个编译器所使用的、关于这些指令结果的临时标记(在数据流图上的箭头)。寄存器r1到r4,在另一方面,被分配了最终的(永久的)寄存器号码,因为到寄存器r1到r4的计算结果具有不超过一个迭代的延迟和寿命,即,到了r1在一给定迭代中需要被重新写入的时间,任何其它迭代不再需要在前一个迭代中被保存在r1中的被产生值。
从原理上说,图3中所显示的、执行循环中的一个迭代的过程包括评价从没有父亲的节点开始的树中的节点,并且朝树的根部方向而工作。在这个情形下,所以,执行的顺序是从图3的I1到I5。
编译过程的下一级是产生一个软件流水线规划。
软件流水线的第一级包括决定一个循环开始的间隔(Ⅱ),即,在循环中连续迭代开始之间的间隔。这个循环开始间隔与处理器中可用的资源相关,资源包括需要执行的指令数目和在数据流图中是否出现了任何周期。例如,图1处理器具有3个指令产生槽IS1到IS3和3个执行单元14,16,和18,这3个执行单元中仅有执行单元14和16能够访问外部存储器26。另外一个可能的情形是,从执行单元被优化成独立地执行不同的任务的意义上来说,执行单元可以是“专用单元”。例如,可以是仅特定执行单元能够执行特定类型的指令。
在本发明的示例中,考虑到可以获取的资源,将假定循环开始间隔被决定为两个周期。另外,将假定仅第三执行单元18配备了执行加法和乘法指令所需要的资源(例如,一个算术和逻辑单元ALU)。
在这第一级后,下一级是产生服从一个所谓的模规划限制的一个规划。这个限制与组成一个迭代(即,图3中指令I1到I5)的指令相关。对每一个可用的产生槽,一个指令可以被安排成在周期x从相关的槽产生,如果并且仅当如果在周期y没有从相同的产生槽产生任何指令,其中y模Ⅱ与x相等。这个模限制,如果满足的话,可以确保每一个产生槽每处理器周期最多仅产生一个指令。
下面的表1提供了与图3树形结构相应的一个模规划表。表1显示了组成循环的一个迭代的5个指令I1到I5如何被规划的。特别地,表的列3到列5显示当产生每一个指令时规划中的周期,所发生的软件流水线级,和产生指令的产生槽(即,执行指令的单元)。在表1中,最后的4列表示逻辑寄存器号码,并且阴影被用于表示值的生命周期,如后面将参考图5,6(A)和6(B)所详细描述的。表1
如表1中所显示的,因为模规划限制,没有两个指令可以被安排成在相同的产生槽相距2个周期的整数倍。这样,一旦这第一载入指令I1已经被安排成在周期0从产生槽1产生出来,下一个指令,即在周期2中被产生的乘法指令I2必须被安排成从与产生槽1不同的产生槽产生出来。在这个情形下,是产生槽3。产生槽3之所以被选择,仅仅是因为在这个示例中第三执行单元18能够执行乘法指令。类似地,一旦第二载入指令I3已经被安排成在周期3内,从产生槽1产生出来,下一个指令,即被安排成在周期5中被产生的加法指令I4必须被从与产生槽1不同的产生槽所产生,在这个情形下,又是这个产生槽3。这第5指令,又是保存指令I5,需要在周期9中被产生。因为这个模限制,这不能够在产生槽1也不能够在产生槽3中被产生,并且必须相应地被分配到产生槽2。
应理解,在表1中的安排仅与一个迭代相关。每Ⅱ周期,就根据相同的规划来开始另一个迭代。这样,当当前的迭代在级1时,这紧前一个迭代将是在级2,在这级以前的级将在级3,在这以前的迭代将在级4,在这以前的迭代在级5。在所有迭代中,指令被安排成从相同的产生槽产生,每一个产生槽每Ⅱ周期产生相同的指令。
图4显示了从第一到第6个不同迭代(i=0到i=5)如何相互并行执行。在图4中,符号如下:
L1表示第一个载入指令I1,
M表示乘法指令I2,
L2表示第二载入指令I3,
A表示加法指令I4,和
S表示保存指令I5。
在周期0中,第一个迭代(i=0)从在产生槽1产生第一载入指令L1开始。在周期1中,不产生任何指令。在周期2中,从产生槽1产生载入指令L1开始,开始执行第二迭代(i=1)。同时,也从产生槽3产生第一迭代的乘法指令M。在周期3中,仅产生第一迭代的第二载入指令L2。应理解,在产生第一迭代的L2时,第二迭代的L1还没有被完成。可以得出结论,在这个实施方式中,图1处理器中的第一执行单元14必须能够互相平行地同时执行这两个载入指令。
在周期4中,从槽1产生这个迭代的第一载入指令L1开始,开始执行第三迭代(i=2)。同时,从产生槽3产生第二迭代的乘法指令M。
以这个方法来继续执行,直到已经完成了这个迭代的所有操作。
从图4中可以看出执行这个迭代的流水线本质。例如,在周期8中,第5个迭代(i=4)是在表1规划中的级1,而第四迭代(i=3)在级2上,第三迭代(i=2)在级3,第二迭代(i=1)在级4,第一迭代(i=0)在级5。
如上面所描述的,“v0”到“v3”仅仅是被分配到寄存器的临时标识符(标记)。这些临时寄存器标识符必须被翻译成可以被指令所说明的逻辑寄存器标识符。这个翻译任务是被编译器来执行的,并且考虑了处理器在运行时分配寄存器的方法。
在描述这个任务如何被实现本发明的一个处理器所执行以前,首先,将参考图5,6(A)和6(B)来解释没有实现本发明的、前面所考虑的一个处理器如何执行这个任务的。
图5显示了前面考虑的这个处理器中一个寄存器文件120的一部分的一个示意图表示。图5中所显示的部分120R是被处理器使用来保存循环变量值的部分。这个寄存器文件120也可以具有另一个来保存循环不变量值的部分(图5中没有显示)。
如图5中所显示的,部分120R包括被安排成寄存器文件20中连续地址的、多个(在这个示例中16个)寄存器r0到r15。
在寄存器文件120中,在一个指令中被说明的逻辑寄存器标识符被使用一个映射偏移OFFSET映射到一个物理寄存器地址。例如,如图5所显示的,这个映射偏移OFFSET是10,这意味着一个逻辑寄存器标识符s0被映射到物理寄存器r10。逻辑寄存器标识符s1被映射到物理寄存器r11,等等。这个映射“绕回(wrap-around)”部分120R,以使例如,当OFFSET为10时,逻辑寄存器标识符s6被映射到物理寄存器r0。
在前面所考虑的、具有图5寄存器文件的处理器中,当使用了软件流水线执行时,每一次开始执行一个新的迭代时,即,每Ⅱ个处理器周期,映射偏移值OFFSET就被改变。改变映射偏移值的效果是改变在指令中所说明的逻辑寄存器标识符与寄存器文件20的部分20R中实际物理寄存器之间的映射关系。这等效于对这些寄存器进行重新命名。
以软件流水线方式执行的这些指令(即,在这个示例中,表1所显示的5个指令)需要保持相同的逻辑寄存器标识符,而与被执行的特定迭代无关。但是,然后,对寄存器的重新命名必须是这样,以使能够给在任何给定迭代中所产生的每一个循环变量值提供其自己的寄存器,并且当需要时,能够被需要这个值的任何其它指令所访问,只要这个值被需要(即,对这个值的生命周期来说,被表1中的4个最后列中一个相关列的阴影所显示的)。
例如,如表1中所显示的,用于保存周期0中产生的第一载入指令所产生的值的寄存器被分配了临时寄存器标识符v0,并且相关的被产生值的最小寿命为3个处理器周期,因为在周期2中它可以被用作乘法指令中的一个输入操作数中。类似地,在周期2中被产生的乘法指令所产生的值被分配了临时寄存器标识符v1,并且这个被产生值的最小生命周期为4个处理器周期,因为在周期5中的加法指令需要这个值。
考虑这个值的寿命,并且每隔前面所考虑处理器的Ⅱ周期,对物理寄存器进行重新命名,可以得出结论,对前面所考虑的处理器来说,这个编译器需要9个不同的逻辑寄存器标识符s0到s8来标识用于保存本发明示例中循环变量值的寄存器。
现在参考图6(A)和6(B),将解释对前面所考虑的处理器来说,如表1中所显示的、这个编译器将临时寄存器标识符v0到v3翻译成逻辑寄存器标识符s0到s8的方法。在图6(A)和6(B)中,已经假定,开始时,映射偏移值OFFSET为10。当开始第一迭代(i=0)时,第一载入指令需要被分配其中可以保存被载入值的一个物理寄存器。因为这个值是需要一个寄存器的第一值,所以这个寄存器被使用逻辑寄存器标识符s0所规定,这个逻辑寄存器标识符s0在寄存器文件20中被映射到物理寄存器r10。
前面所考虑处理器中的寄存器的第一次重新命名在处理器周期2开始时开始,而其后,OFFSET被减去1,其值变为9。
在周期2中产生2个指令,第一迭代的乘法指令和第二迭代的第一载入指令。这个乘法指令需要第一迭代中第一载入指令所产生的值。因为是在周期2的开始时才对寄存器进行重新命名,所以逻辑寄存器标识符s1必须被用于从物理寄存器r10中检索这个值。第二迭代的第一载入指令中的逻辑寄存器标识符必须与第一迭代的第一载入指令中的逻辑寄存器标识符一致(s0)。第一迭代中的乘法指令也必须被提供一个寄存器来保存其结果。在当前在使用寄存器r9和r10时,第一空闲寄存器是寄存器r11,这寄存器r11与逻辑寄存器标识符s2相应。
在周期3中,产生第一迭代的第二载入指令。这个指令需要能够保存其被载入值的一个寄存器。在寄存器r9到r11已经被使用后,第一个空闲寄存器是寄存器r12。但是,因为后面将要解释的原因,这个编译器必须预留r12来用于保存一个随后的迭代所产生的值,所以第一迭代的第二载入指令所产生的被载入值被分配了一个寄存器r13,这需要逻辑寄存器标识符s4。
在前面所考虑的处理器中,对寄存器的重新命名发生在处理器周期4的开始时,而其后,OFFSET再被减去1,其值变为8。
在周期4中,产生了第二迭代的乘法指令和第三迭代的第一载入指令。这些指令的逻辑寄存器标识符与前面乘法和第一载入指令的逻辑寄存器标识符相同。物理寄存器r10可以被重新用于保存第二迭代中乘法指令的结果,当在周期2中,被保存在前一个迭代的这个寄存器中的循环变量值的寿命完成时。
在周期5中,所产生的指令是第一迭代的加法指令和第二迭代的第二载入指令。加法指令的输入操作数被包括在寄存器r11和r13中,需要这个加法指令规定逻辑寄存器标识符s3和s5。寄存器r14,这是在被使用的寄存器r13后的第一个空闲寄存器,被分配来用于保存加法指令的结果。这个寄存器是由逻辑寄存器标识符s6来规定的。
现在可以看看在第一迭代中必须跳过寄存器r12的原因。被用于分配来保存第二迭代的第二载入指令的结果的逻辑寄存器标识符s4必须与第一迭代的相应第二载入指令中所规定的逻辑寄存器标识符相同。如果s4在第一迭代中被映射到r12,s4在第二迭代中将被映射到r11。但是,这是不可能这样做的,因为r11,这是用于保存第一迭代的乘法指令所产生的值的寄存器,在周期5的开始时仍然被使用。
与图3中指令I1到I5相应的、翻译指令所产生的指令集合将被显示在图6(A)的底部。
从图6(A)和6(B)中可以看出,编译器将临时寄存器标识符v0到v3翻译成逻辑寄存器标识符s0到s8的任务对前面所考虑的处理器来说是复杂的。例如,在第一迭代中,很容易获得的寄存器r12不可以被分配成用于保存第二载入指令所产生的值,因为这将在下一个周期中导致一个碰撞。
下面的表2提供了与表1相应的一个模规划表,但是是根据本发明的一个实施方式的。
表2
规划 时间     规划的指令分配     值序列
周期 产生槽1 产生槽2 产生槽3    S1    S2    S3
    1     0  ld(r1++)     0     0     1
    1     2     2     3
    2     2  mul@5,r3     4     4     5
    3  ld(r2++)     6     6     7
    3     4     8     8     9
    5  add@5,@6     10     10     11
    4     6     12     12     13
    7     14     14     15
    5     8     16     16     17
    9  st@7,(r4++)     18     18     19
在表2中,每一个独立迭代所需要的5个指令被安排在与表1相同的周期和产生槽内,但是每一个指令的格式已经被改变并且被简化了。
再参考图3,在一个静态安排的处理器中,图3树的节点被评价的顺序被编译器固定了。利用这些知识,编译器知道在程序执行期间值被产生和需要的确切顺序,相对当前指令产生时所达到的序列号,这个编译器能够通过它们的序列号来引用前面计算出的值。
每一个在执行一个软件流水线循环规划期间被产生的值被编译器在编译期间分配一个序列号码。例如,第一个被产生的值具有序列号0,随后产生的值的序列号是依次增加的。当一个循环规划被软件流水线化时,这个循环将同时有k个迭代被激活,其中k是在进行规划后软件流水线级的数目。这k个迭代被以同时的方式来执行,其中每一个随后的迭代在前一个迭代开始后Ⅱ个周期才开始。
图7又提供了前面所描述的、图4的表,但是对特定指令其数字被加入到圆括号中,以显示在编译期间序列号如何被分配给值的。
在图7的周期8中,产生了第5迭代(i=1)的第一载入指令L1。这个载入指令是一个产生值的指令,因为它产生了这个迭代的随后乘法指令M所需要的值dx(i)。如图7所显示的,假定,这个编译器给周期8第一载入指令L1所产生的值的序列号是0。
在周期8中,另一个产生值的指令也被指令产生单元10所产生,其产生的同时也产生了第5迭代的第一载入指令L1。这其它的指令是前一迭代(第四)的乘法指令M。这个同时被产生的产生值的指令是从产生槽3所产生的,在一预定产生槽的顺序中(1-2-3),这是在产生槽1之后的,所以编译器给乘法指令所产生的值分配在分配给第一载入指令L1所产生值的序列号码后面的一个序列号码,即,序列号码1。
这样,尽管在任何给定周期中,可以从不同的产生槽产生两个或者多个产生值的指令,编译器可以系统地将不同的序列号码分配给这些指令所产生的值。通过以同时产生指令的产生槽的预定顺序来分配序列号码,可以系统地来进行分配(可预测的)。
在周期9中,产生槽1产生另一个产生值的指令,即,第四迭代的第二载入指令L2。这个指令所产生的值也相应地被分配了序列号码2。类似地,在周期9中,第三迭代的加法指令A被从产生槽3产生。另外,这个指令也是一个产生值的指令,并且这个指令所产生的值必须被分配一个序列号码。分配到周期9中加法指令所产生的值的这个序列号码是3,因为产生所考虑的加法指令的这个产生槽(产生槽3)在产生另一个同时被产生的、产生值的指令(第四迭代的L2)的产生槽(槽1)的后面。
在周期9中也被产生的第一迭代的保存指令不是一个产生值的指令。实际上,它是一个需要值的指令。相应地,没有序列号码被分配到与保存指令相关的任何值。
在周期10中,指令产生单元10同时产生了两个产生值的指令,即,新迭代的第一载入指令L1(第6迭代)和前一个迭代(第5)的乘法指令。L1是从槽1被产生的,所以它所产生的值被分配到下一个序列号码,4。这个乘法指令是从槽3被产生的,并且其产生的值被分配了序列号码5。
在处理器在运行时执行指令序列的期间,这个处理器根据将产生这些值的、产生值的指令的产生顺序,来将寄存器分配到被产生值,以使在图7中具有序列号码0到5的被产生值被分配到图8中所显示的寄存器。
现在再参考表2,现在可以解释在表2中的乘法指令的形式。这个乘法指令具有被规定为“@5”的第一操作数和被规定为“r3”的第二操作数。这第二操作数是一个直接操作数,并且简单地表示为如表1的寄存器r3的内容。这个寄存器保存了循环不变量值da。第一操作数的参考“@5”指第一操作数所需要的值是其序列号码比当前序列号码小5的值。当图7的周期10中的乘法指令被产生时,被分配的序列号码为5。所以,从这个参考“@5”,这个处理器能够在进行执行时知道它应使用其序列号码比当前序列号码小5的值作为第一操作数,即,在周期8中所产生的第一载入指令L1所产生的值。它也知道,被分配用于保存L1结果的寄存器将是在寄存器文件20的可重新命名部分中最近被分配寄存器的前5个寄存器,即,其逻辑寄存器标识符为5的寄存器。
这样,一个需要值的指令,例如乘法指令M所需要的每一个输入值可以由被分配到这个输入值的序列号码和在产生这个需要值的指令时所达到的序列号码之间的差异来确切地规定。这个差异(例如,“@5”)可以被称作一个序列偏移。
图9更详细地显示了图1处理器的部分,在本发明的一个实施方式中,图1处理器执行为被产生值分配序列号码的功能,执行寄存器分配和标识的功能。
在图9中,寄存器文件20共有N个寄存器,其中较低号码的K个寄存器组成了一个静态地址区域20S,而较高号码的N-K个寄存器组成了一个一个动态地址(可重新命名)的区域20R。这个可重新命名的区域一般与已经参考图5而描述的部分120R类似。静态地址区域20S的寄存器被用于保存循环不变量的值,而可重新命名区域20R的寄存器被用于保存循环变量的值。在这两个区域之间的界限是可以被编程的。在表2的示例中,寄存器r1到r4在静态地址区域20S中,并且这样来对这个界限进行编程,以使可重新命名的区域从r5开始(即,K=5)。
提供了一个检测产生值指令的单元30,它检测何时产生一个产生值的指令。这个检测产生值指令的单元30被方便地包括在图1的指令产生单元10中。在检测到产生这样一个指令后,这个检测产生值指令的单元30产生一个重新命名RENAME信号。这个RENAME信号被施加到一个寄存器重新命名单元32。这个寄存器重新命名单元32连接到保存一个映射偏移值OFFSET的一个映射偏移保存单元34。对这个RENAME信号作出响应,这个寄存器重新命名单元32将被保存在映射偏移保存单元34中的映射偏移值OFFSET减去1。
被保存在映射偏移保存单元34中的映射偏移值OFFSET被施加到一个映射单元36。这个映射单元36也接收一个逻辑寄存器标识符(R),并且输出一个物理寄存器地址(P)。这个逻辑寄存器标识符(数字)是在0到N-1内的一个整数。这个映射单元36实现从逻辑寄存器标识符到物理寄存器地址的一个双向单映射。每一个物理寄存器地址也是在范围0到N-1内的一个整数,并且直接标识一个实际的硬件寄存器。
如果一个指令规定了一个逻辑寄存器标识符R作为其一个操作数,并且R是在0到K-1并且包括K-1的范围内时,然后,物理寄存器号码与这个操作数的逻辑寄存器号码一致。但是,如果R是在范围K到N-1内,然后,这个操作数的逻辑寄存器号码有P这样给出:
P=K+|R-K+OFFSET|N-K
在这个表达式中,|y|x意味着y对x的模。
当产生了一个产生值的指令,并且这个产生值的指令将产生需要被保存在一个可重新命名的寄存器中的值时,在可重新命名区域20R中的下一个空闲寄存器被自动分配到将被产生的值。简单地,这个寄存器是具有逻辑寄存器号码为0的寄存器,即,物理寄存器号码K+|OFFSET-K|N-K。将执行这个指令的执行单元被告知所分配寄存器的物理寄存器号码,以使当最后产生这个值时,这个值能够被保存在相关的物理寄存器中。然后,根据检测单元30所产生的RENAME信号,映射偏移值OFFSET被减去1。
当产生一个需要值的指令,这个需要值的指令需要被保存在一个可重新命名寄存器中的一个值时,在指令中,使用其相对最新被分配寄存器的序列偏移值来规定保存这个被需要值的寄存器。这个序列偏移可以被直接用于提供逻辑寄存器标识符R。所以,这个序列偏移被提供到映射单元30,然后,这个映射单元30产生相应的物理寄存器号码P。例如,在图8中,当产生迭代i=4的乘法指令时,最新分配的寄存器是其逻辑寄存器标识符R=0的寄存器。这个乘法指令需要被保存在逻辑寄存器标识符R=5的寄存器所保存的产生值dx(4)。这样,序列偏移“@5”直接提供了被需要寄存器的逻辑寄存器标识符(5)。
类似地,应理解,一个被产生的指令可以同时是一个产生值的指令和一个需要值的指令。
现在参考图10,现在将解释在将高级语言程序指令序列转换为一个被图1处理器所执行的、相应的低级语言程序指令序列中所使用的一个编译方法的一部分。在这个处理器支持软件流水线执行的情形下,这个编译方法将包括参考图2,3和表1来描述的、用于产生一个软件流水线规划的步骤。
在图10的第一步骤S1中,这个编译器决定相应序列的哪一个低级指令是预选择的产生值的指令,相应序列的哪一个低级指令是预选择的需要值的指令。例如,图3中指令I1到I4均是预选择的产生值的指令。另外,指令I2,I4和I5均是预选择的、需要值的指令,它们需要前一个被产生的产生值的指令所产生的值。
在步骤S2中,这个编译器以产生这些指令的顺序来给产生值的指令所产生的值来分配序列号码。被分配的序列号码必须反映在一个软件流水线循环中所有同时被执行的迭代,如前面参考图7而描述的。
然后,在步骤S3中,每一个需要值的指令被使用信息,例如上面提到的序列偏移,来进行编码,这与被分配到相关需要值的指令所需要的被产生值的序列号码相关。
实现了本发明的一个编译方法可以用根据一个计算机程序而工作的一个通用计算机来实现。这个计算机程序可以是被任何合适的承载媒质,例如一个存储器媒质(例如,软盘或者CD-ROM)或者一个信号来承载。这样一个承载信号可以是经过一个通信网络,例如互联网而下载的一个信号。后附的计算机程序权利要求应被理解为包括了一个计算机程序本身或者上述形式中的任何一个形式。
在计算每一个输入值的序列偏移时,编译器的任务是简单的,因为对一给定需要值的指令来说,这个序列偏移简单地就是被分配到相关输入值的序列号码和当产生指令时的达到的被分配序列号码之间的差异。这使就在寄存器文件的环型部分(可重新命名部分)中的分配来说,编译器的任务更简单和快速。
另外,与在表1中的其相应指令相比,表2中的每一个指令比较短,其差异在于不需要指定目的寄存器。这可以使代码更紧凑,执行速度也更快。
本发明的另一个实施方式可以提供具有两个或者多个寄存器重新命名模式的一个处理器。例如,如图11所显示的,这个处理器可以具有一个模式寄存器,这个模式寄存器具有第一和第二模式比特M1和M2来用于记录当前被选择的寄存器重新命名模式。这个模式寄存器40可以被提供在图9的寄存器重新命名单元32中,例如。这第一模式比特M1被用于控制是否打开或者关闭寄存器重新命名。第二模式比特M2是有效的,仅当第一模式比特M1指出打开了寄存器重新命名功能时。在这个情形下,第二模式比特M2被用于控制将使用两个可以使用的寄存器重新命名模式中的哪一个。这两个可以使用的模式中的一个是参考表2和图7到9来描述的模式,其中在每一次产生产生值的指令时,就重新命名寄存器。另一个可以使用的寄存器重新命名模式可以是任何其它合适的寄存器重新命名模式。例如,这另一个可以使用的寄存器重新命名模式可以是前面所考虑的、参考图5,6(A)和6(B)而描述的模式,其中每一次跨越一个软件流水线界限时,就对寄存器重新命名,即,每隔Ⅱ个处理器周期,其中Ⅱ是上面提到的循环开始间隔。
当然,如果根本不需要提供关闭寄存器重新命名的能力,可以忽略第一模式比特M1。类似地,如果仅需要根据是否产生产生值的指令来简单地打开或者关闭寄存器重新命名的功能,就可以忽略第二模式比特M2。
在执行时,例如在程序的控制下,模式比特或者每一个模式比特可以被自动地改变。
下面,现在将参考图12和13来描述参考表2和图7到9来描述的基本寄存器重新命名的一个可选增强项。这个可选增强项是用于克服产生于一个特殊情形的、可能出现的寄存器位置不一致性的缺点的,其中与执行一个软件流水线循环的一个循环体一次或者多次的正常情形相比,在这个特殊情形中,根本不执行这个循环体。例如,其中根本不执行这个循环体的这个特殊情形是产生于当一个循环指令建立了一个迭代循环,而一个循环控制变量被从一个开始值增加到一个结束值,但是这个结束值比开始值小,这个结束值是在执行时循环指令所遇到的一个变量。这个特殊情形导致寄存器位置与当执行循环体一次或者多次时的寄存器位置不一致,这在下面将被解释。
考虑具有v个产生值的指令和p个软件流水线级的一个软件流水线循环规划。例如,在表2的规划中,v=4和p=5。如果这个循环迭代n次,然后这个寄存器文件将在执行循环时被环回v(n+p-1)次。一个编译器使用这个信息来预测在这个循环中被产生值在寄存器文件中的位置,这个值然后在循环体外被使用。即,它是被循环的最后迭代所产生的值,并且随后在循环体外就被需要。实际上,每一个被最后迭代所产生的值具有与循环迭代次数n无关的一个位置,并且当循环迭代次数n大于0时,这个位置是不变的。这个循环的最后迭代需要这个循环规划被产生p次。所以,在最后迭代的开始和从循环最后退出之间,存在对循环的pv个环回。如果任何值在进入循环时是有效的,并且在退出循环时也是有效的,然后就必须有至少pv个循环寄存器。
任何在循环的一个迭代中被产生的、被作为在前一个迭代中其本身的一个函数而计算出的值被称作一个回归。在进入到循环以前,这样的回归被进行初始化,然后在完成循环后被使用。一个循环的示例被显示在图12中。在这个示例中,在进入到循环以前,一个标量变量s被进行初始化(行1),在循环体内具有一个回归(行4),并且在完成循环后(行7)也被使用。所以,其寿命在整个循环内均有效。
如前面所描述的,这个编译器将这样安排,在每一个迭代中,行4的代码将从逻辑寄存器号码SR读取在前一个迭代中被产生的值s,并且将在当前迭代中所产生的新值s写入到逻辑寄存器号码SW。这些寄存器号码被这样选择,以使在环回寄存器文件v次,在前一个迭代中被写入到寄存器SW的值现在可以从当前迭代中的寄存器SR中获得。
初始值s,在图12中的行1被定义的,必须被输入到一个合适的寄存器S1,并且必须这样选择寄存器S1,当第一迭代在行4中从SR中进行读取时,在行1中被写入到S1中的值已经被旋转以使现在可以从寄存器SR中访问它。在第一迭代中行1和行4之间的确切旋转数目与行4发生的软件流水线级和使用s的指令在循环规划中的位置相关。假设需要将S1中的值移动到SR所需要的旋转数目是q。
将s最后一次写入到逻辑寄存器号码SW是发生在循环的最后迭代的第4行。这个最后被写入的值是在从循环退出后,在行7中从逻辑寄存器号码SE读取的。假设需要将SW中的值移动到SE的旋转次数是t。
这些寄存器S1,SW,SR,和SE之间的关系被示意性地表示在图13中。在图13中,这个圆表示寄存器文件的旋转区域。旋转区域的大小(即,图13的周长)假设是pv个寄存器,这是当至少有在进入循环时有效、在退出循环时也有效的一个值时才需要的寄存器数目。在旋转区域中的独立寄存器被沿周长等间隔地划分。
假设在软件流水线级k来读取s(行4),其中0<=k<=p-1。也假设,当在规划中旋转了w次后来读取s(行4),其中0<=w<=v-1。所以,q=kv+w并且t=v(p-k-1)+v-w。从这点可以得出,从行1中s的开始定义到退出循环后使用s的、需要值的指令能够发现这个值的位置的旋转次数是q+t-v,简单地,就是v(p-1)。
所以,假定一个初始逻辑寄存器S1,其中在执行这个循环以前将s写入到逻辑寄存器S1,这个编译器知道在完成循环后,将在逻辑寄存器号码S1+v(p-1)中发现最后被写入的s值。但是,这不适合于特殊的情形,其中根本不执行这个循环体,如果在执行时,发现图12的行2中的循环控制变量N的值为0或者是负的,就出现这个特殊情形。在这个特殊情形中,简单地,将在S1中发现行7所需要的s值,而不是在寄存器S1+v(p-1)中(与所有其它情形相同)。这个不一致性的不方便处在于,这个编译器将需要在编译的代码中补充特殊的指令来处理在执行时N将是0或者负的情形。理想的,人们希望能够避免编译器来采取这样的特殊措施。
所以,在上面提到的、对寄存器重新命名方法的增强中,这个处理器被安排成,如果在执行时发现循环迭代次数为0,因此根本不可能执行这个循环体,然后在这个处理器继续转到循环的末尾以前,将寄存器文件旋转v(p-1)次。其效果是产生在退出循环以后的第一指令以前,跳过v(p-1)个序列号码。通过产生循环规划指令p-1次而不需要实际执行指令,就可以方便地实现这点。产生每一个产生值的指令的动作将旋转寄存器文件,以使每一个完整循环规划的产生将寄存器文件旋转v次。使用这样的方法,当循环迭代次数是0时,s的初始值可以从逻辑寄存器S1+v(p-1)获得,如所希望的。
通过有效地直接进入到软件流水线循环的关闭模式,并且设置一个附加的(全程)谓词错误(predicate false)来避免执行任何指令,就可以产生指令p-1次。
上面所描述的增强确实促使处理器在循环迭代次数是0的情形下在执行行动采取特殊的措施。但是,通常这是不可能发生的,所以典型的执行时间代价将非常小。
当使用其它寄存器重新命名技术,例如前面所考虑的、参考图5,6(A)和6(B)而描述的技术时,也可以采用这个增强选项。在这个情形下,这个处理器被安排成在一个0迭代次数的下,将寄存器旋转p-1个寄存器。
这样,本发明的另一个方面可以提供一个处理器,每一次跨越一个软件流水线界限时(而不是每一次产生一个产生值的指令时)这个处理器对可重新命名的寄存器进行重新命名,并且在一个0迭代次数的情形下跳过一个或者多个可重新命名的寄存器。在这样一个处理器中,被跳过的寄存器数目与产生值的指令的数目无关,并且与软件流水线级的数目相关。优选地,跳过的寄存器数目是p-1。
另外,应理解,对需要被正确计算的序列偏移来说,因为可预测的执行而必须被关闭的指令仍然必须增加值的序列号码。但是,这决不会增加需要保存一个循环中的中间值的寄存器的数目。
假设回归值(用在任何前一迭代中其本身的一个函数来计算的任何循环变量值)以正确的顺序在循环外被初始化,就可以联系软件流水线来正确地操作上面所描述的技术。
包括在每一个需要值的指令中的信息不需要是一个序列偏移。也可能使用其直接分配序列号码或者相对某参考点而不是目前所达到的序列号码的被分配序列号码来规定保存所需要值的寄存器的标识。类似地,在一个产生值的指令中,与被分配序列号码相关的信息可以被规定成以使寄存器的分配更灵活。例如,一个序列偏移(例如,“@-2”)可以被规定来表示用于保存被产生值的一个除0之外的逻辑寄存器号码。另外,这个目的寄存器可以根据被分配序列号码来明确地规定。
应理解,被分配到被产生值的序列号码是有限的,例如255,以使在达到其限制值后,序列又从0开始。
通过示例,尽管上面的描述涉及能够进行软件流水线执行的一个VLIW处理器,应理解,本发明能够应用于不具有这些特征的处理器。实现了本发明的一个处理器可以被作为一个处理器“核心”包括在一个高集成度“单片系统”(SOC)中,以用于多媒体应用,网络路由器,视频移动电话,智能机动车,数字电视,语音识别,3D游戏,等等。

Claims (29)

1.一个处理器,包括:
指令产生装置,用于以一预定序列来产生需要被执行的指令,所述指令序列包括预先选择的、当执行时用于产生相应值的指令;
指令执行装置,用于执行所产生的指令;
寄存器装置,具有多个寄存器,用于保存执行指令时所产生的值;
序列号码分配装置,用于根据所述产生值的指令的产生顺序来向所述产生值的指令所产生的所述值分配相应的序列号码;和
寄存器分配装置,用于给每一个所述被产生的值分配所述寄存器中的一个,用于保存该被产生的值,这与被分配到这个值的序列号码相关。
2.如权利要求1的处理器,其中所述寄存器分配装置被用于将其所述寄存器分配给每一个所述被产生值,而与被包括在当执行时产生这个值的、产生值的指令中的信息无关。
3.如权利要求1或者2的处理器,其中所述指令序列也包括至少一个预选择的、需要值的指令,当被执行时,所述需要值的指令需要所述产生值的指令中前一个被产生的指令所产生的所述值,这个处理器进一步包括被分配寄存器标识装置,在执行这样一个需要值的指令期间,所述被分配寄存器标识装置被用于采用包括在需要值的指令中的信息,这与被分配到所述前一个被产生指令的所述产生值的所述序列号码相关,来标识被分配成用于保存这个值的寄存器。
4.如权利要求3的处理器,其中所述信息是表示在这个点上,以所述预定序列,产生所述需要值的指令中最近被分配的序列号码和被分配到所述前一个产生指令的产生值的所述序列号码之间的差异的一个序列偏移。
5.如前述权利要求中任何一个的处理器,其中所述寄存器装置包括:
一组物理寄存器,可分配成用于保存所述被产生值;
映射装置,用于将被指令执行装置所规定的逻辑寄存器标识符映射到所述集合中相应的物理寄存器;和
寄存器重新命名装置,用于在处理器工作期间,动态地改变在所述逻辑寄存器标识符和所述相应的物理寄存器之间的所述映射。
6.如权利要求5的处理器,其中所述寄存器分配装置被用于将所述物理寄存器中的一个分配给每一个所述产生值的指令所产生的所述值,其中在产生这个产生值的指令的时刻被应用的所述映射中,这个物理寄存器具有一预定的逻辑寄存器标识符。
7.如权利要求5或者6的处理器,其中所述寄存器重新命名装置被用于在每一次产生这样一个产生值的指令时,改变所述映射。
8.如权利要求7的处理器,其中所述寄存器重新命名装置可以选择性地在一个关闭模式和一个打开模式之间进行切换,在一个关闭模式中,当产生这样一个产生值的指令时不改变所述映射,而在打开模式中,每一次产生这样一个产生值的指令时就改变所述映射。
9.如权利要求7或者8的处理器,其中所述寄存器重新命名装置可以选择性地在一个第一重新命名模式和一第二重新命名模式之间进行切换,在第一重新命名模式中,每一次产生这样一个产生值的指令时就改变所述映射,第二重新命名模式与所述第一重新命名模式不同。
10.如权利要求9的处理器,其中在所述第二重新命名模式中,在执行一个软件流水线循环期间,每一次跨越一个软件流水线界限,就改变所述映射。
11.如权利要求8到10的处理器,进一步包括一个模式寄存器,所述模式寄存器具有一个或者多个用于规定所述寄存器重新命名装置具有哪一个所述模式的模式比特。
12.如权利要求5到11中任何一个的处理器,其中:
在一个寄存器文件的一个可重新命名的区域中,所述集合的物理寄存器被安排成具有连续的地址,并且一个接一个;和
所述映射装置是用于使用一个映射偏移将一个被规定的逻辑寄存器标识符映射到其相应的物理寄存器,所述映射偏移表示这个被规定逻辑寄存器标识符和所述可重新命名区域中相应的物理寄存器的所述地址之间的一个可变差异。
13.如权利要求12的处理器,其中所述寄存器重新命名装置被用于通过将所述映射偏移增加或者减少来改变所述映射偏移。
14.当权利要求12或13从属于权利要求4时,如权利要求12或者13的处理器,其中所述逻辑寄存器标识符由所述序列偏移直接提供。
15.如前述权利要求中任何一个的处理器,其中所述指令产生装置具有多个指令产生槽,并且能够被用于在不同的相应指令产生槽同时产生多个指令;和
所述指令执行装置具有分别与所述指令产生槽相应的多个指令执行单元,每一个指令执行单元可以被用于执行在其所述相应的指令产生点被产生的指令。
16.如权利要求15的处理器,其中当在不同的相应指令产生槽同时产生两个或者多个产生值的指令时,所述序列号码分配装置可以被用于根据分配到产生这两个或者多个产生值的指令的相应指令产生槽的一预定产生槽顺序,来向这些指令所产生的产生值分配不同的相应序列号码。
17.如前述权利要求中任何一个的处理器,可以被用于以一个软件流水线的方式来执行所述序列的指令,其中所述预选择的、产生值的指令包括当被执行时将产生在循环中值方式变化的值的指令。
18.如前述权利要求中任何一个的处理器,进一步包括循环处理装置,在执行所述指令期间发现一个软件流水线循环需要一个0次的迭代时,可以被用于在产生循环后的第一指令前,促使所述序列号码分配装置跳过一个或者多个所述序列号码。
19.如权利要求18的处理器,其中被跳过的序列号码数目与在所述循环中每一迭代所产生的所述产生值的指令的数目相关,并且也与所述循环中软件流水线级的数目相关。
20.如权利要求18或者19的处理器,其中所述循环处理装置可以被用于在所述事件中促使产生所述循环的指令,产生的次数与所述循环中软件流水线级的数目相关,而禁止所述指令执行装置执行这些指令,因此所述循环中每一个所述产生值的指令被产生所述次数。
21.一个编译方法,用于将一个高级程序指令序列转换为将要被一个处理器所执行的、相应的低级指令序列,这个方法包括步骤:
决定所述相应序列中的哪一个所述低级指令是预先选择的、用于产生值的指令,并且哪一个是预先选择的、需要值的指令,每一个所述产生值的指令是当被执行时就会产生一个值的一个指令,并且每一个所述需要值的指令是当被执行时就需要前一个产生的、产生值的指令所产生的所述值的一个指令;
根据执行期间相应产生值的指令被产生的顺序来向所述被产生值分配相应的序列号码;和
用在执行期间所述处理器所使用的信息来给每一个所述需要值的指令进行编码,以标识这个指令所需要的所述产生值,这个信息与被分配到这个产生值上的所述序列号码相关。
22.如权利要求21的方法,其中在所述编码步骤中,所述信息是表示在产生所述需要值的指令时刻,分配到最近所述产生值的序列号码与被分配到这个指令所需要的所述产生值的所述序列号码之间的差异。
23.如权利要求21或者22的方法,其中在所述编码步骤中,每一个所述产生值的指令被进行编码,并且不使用处理器使用来标识保存所述被产生值的位置的信息。
24.如权利要求21到23中任何一个的方法,其中所述高级程序指令序列包括一个循环结构,这个方法进一步包括步骤:
分析所述循环结构,以将这个循环结构的高级程序指令转换为根据一个软件流水线级,被处理器迭代执行的所述低级指令规划;和
当在所述规划中的一个所述指令是这样一个产生值的指令,其中其所述产生值是一个循环中被改变的值时,在不同的迭代中向这个指令所产生的值分配不同的序列号码。
25.一个计算机程序,其中当在一个计算机上执行这个程序时,这个程序将促使这个计算机执行实现本发明权利要求21到24中任何一个编译方法。
26.一个计算机程序,其中当在一个计算机上执行这个程序时,这个程序将促使这个计算机执行用于将一个高级程序指令序列转换为被一个处理器所执行的、一个相应的低级程序指令序列,这个计算机程序包括:
一个决定部分,用于决定所述相应序列中的哪一个所述低级指令是预先选择的、用于产生值的指令,并且哪一个是预先选择的、需要值的指令,每一个所述产生值的指令是当被执行时就会产生一个值的一个指令,并且每一个所述需要值的指令是当被执行时就需要前一个产生的、产生值的指令所产生的所述值的一个指令;
一个分配部分,用于根据执行期间相应产生值的指令被产生的顺序来向所述被产生值分配相应的序列号码;和
一个编码部分,用在执行期间所述处理器所使用的信息来给每一个所述需要值的指令进行编码,以标识这个指令所需要的所述产生值,这个信息与被分配到这个产生值上的所述序列号码相关。
27.如权利要求25或者26中的计算机程序,是被一个承载媒质所承载的。
28.如权利要求27的计算机程序,其中所述承载媒质可以是一个存储媒质。
29.如权利要求27的计算机程序,其中所述承载媒质可以是一个信号。
CN01103251A 2000-02-08 2001-02-08 在处理器中传送指令结果及处理器的编译方法 Pending CN1308274A (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
GBGB0002848.0A GB0002848D0 (en) 2000-02-08 2000-02-08 Communicating instruction results in processors and compiling methods for processors
GB0002848.0 2000-02-08

Publications (1)

Publication Number Publication Date
CN1308274A true CN1308274A (zh) 2001-08-15

Family

ID=9885153

Family Applications (1)

Application Number Title Priority Date Filing Date
CN01103251A Pending CN1308274A (zh) 2000-02-08 2001-02-08 在处理器中传送指令结果及处理器的编译方法

Country Status (5)

Country Link
US (1) US6826677B2 (zh)
EP (1) EP1124182A3 (zh)
JP (1) JP2001282532A (zh)
CN (1) CN1308274A (zh)
GB (2) GB0002848D0 (zh)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101894013A (zh) * 2010-07-16 2010-11-24 中国科学院计算技术研究所 处理器内指令级流水线控制方法及其系统
CN101770387B (zh) * 2008-12-26 2013-03-13 北京中电华大电子设计有限责任公司 一种含有配对寄存器的寄存器分配方法
CN104412233A (zh) * 2013-05-30 2015-03-11 英特尔公司 流水线调度中混叠寄存器的分配
CN105242906A (zh) * 2014-04-25 2016-01-13 美国博通公司 利用世代数的重命名
CN106293627A (zh) * 2016-07-27 2017-01-04 珠海市杰理科技有限公司 寄存器调用及调用指令编码的方法、装置
CN108052347A (zh) * 2017-12-06 2018-05-18 北京中科睿芯智能计算产业研究院有限公司 一种执行指令选择的装置、方法及指令映射方法
CN109188994A (zh) * 2017-06-30 2019-01-11 沈阳新松机器人自动化股份有限公司 一种梯形图编译方法及相应的plc系统
CN116400982A (zh) * 2023-05-26 2023-07-07 摩尔线程智能科技(北京)有限责任公司 配置中继寄存器模块的方法和装置、计算设备和可读介质

Families Citing this family (47)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
SE0002440D0 (sv) 2000-06-28 2000-06-28 Virtutech Ab Interpreter
GB2398412B (en) 2001-10-12 2005-02-09 Pts Corp Processors and Compiling methods for Processors
CA2365375A1 (en) * 2001-12-18 2003-06-18 Ibm Canada Limited-Ibm Canada Limitee Optimizing source code for iterative execution
US7200738B2 (en) 2002-04-18 2007-04-03 Micron Technology, Inc. Reducing data hazards in pipelined processors to provide high processor utilization
US20030237080A1 (en) * 2002-06-19 2003-12-25 Carol Thompson System and method for improved register allocation in an optimizing compiler
US7058938B2 (en) * 2003-03-05 2006-06-06 Intel Corporation Method and system for scheduling software pipelined loops
JP2005129001A (ja) * 2003-09-30 2005-05-19 Toshiba Corp プログラム実行装置、マイクロプロセッサ及びプログラム実行方法
US7493481B1 (en) * 2004-05-17 2009-02-17 Netxen, Inc. Direct hardware processing of internal data structure fields
US7673294B2 (en) * 2005-01-18 2010-03-02 Texas Instruments Incorporated Mechanism for pipelining loops with irregular loop control
US7761691B2 (en) * 2005-10-27 2010-07-20 National Tsing Hua University Method for allocating registers using simulated annealing controlled instruction scheduling
KR100662846B1 (ko) 2005-11-09 2007-01-02 삼성전자주식회사 데이터 처리 시스템 및 데이터 처리방법
US7840954B2 (en) * 2005-11-29 2010-11-23 International Business Machines Corporation Compilation for a SIMD RISC processor
EP2477109B1 (en) 2006-04-12 2016-07-13 Soft Machines, Inc. Apparatus and method for processing an instruction matrix specifying parallel and dependent operations
EP2527972A3 (en) 2006-11-14 2014-08-06 Soft Machines, Inc. Apparatus and method for processing complex instruction formats in a multi- threaded architecture supporting various context switch modes and virtualization schemes
US7809930B2 (en) * 2007-01-24 2010-10-05 Arm Limited Selective suppression of register renaming
US8413151B1 (en) 2007-12-19 2013-04-02 Nvidia Corporation Selective thread spawning within a multi-threaded processing system
US8615770B1 (en) 2008-08-29 2013-12-24 Nvidia Corporation System and method for dynamically spawning thread blocks within multi-threaded processing systems
US8959497B1 (en) * 2008-08-29 2015-02-17 Nvidia Corporation System and method for dynamically spawning thread blocks within multi-threaded processing systems
EP2616928B1 (en) 2010-09-17 2016-11-02 Soft Machines, Inc. Single cycle multi-branch prediction including shadow cache for early far branch prediction
WO2012135041A2 (en) 2011-03-25 2012-10-04 Soft Machines, Inc. Register file segments for supporting code block execution by using virtual cores instantiated by partitionable engines
EP2689326B1 (en) 2011-03-25 2022-11-16 Intel Corporation Memory fragments for supporting code block execution by using virtual cores instantiated by partitionable engines
EP2689327B1 (en) 2011-03-25 2021-07-28 Intel Corporation Executing instruction sequence code blocks by using virtual cores instantiated by partitionable engines
WO2012162188A2 (en) 2011-05-20 2012-11-29 Soft Machines, Inc. Decentralized allocation of resources and interconnect structures to support the execution of instruction sequences by a plurality of engines
CN103649931B (zh) 2011-05-20 2016-10-12 索夫特机械公司 用于支持由多个引擎执行指令序列的互连结构
KR101832679B1 (ko) 2011-11-22 2018-02-26 소프트 머신즈, 인크. 마이크로프로세서 가속 코드 최적화기
KR101703401B1 (ko) 2011-11-22 2017-02-06 소프트 머신즈, 인크. 다중 엔진 마이크로프로세서용 가속 코드 최적화기
CN104321747B (zh) * 2012-04-19 2017-11-17 西门子公司 用于多核/众核可编程逻辑控制器的时间裕隙应用流水线平衡
US9811342B2 (en) 2013-03-15 2017-11-07 Intel Corporation Method for performing dual dispatch of blocks and half blocks
US10275255B2 (en) 2013-03-15 2019-04-30 Intel Corporation Method for dependency broadcasting through a source organized source view data structure
US9904625B2 (en) 2013-03-15 2018-02-27 Intel Corporation Methods, systems and apparatus for predicting the way of a set associative cache
WO2014150971A1 (en) 2013-03-15 2014-09-25 Soft Machines, Inc. A method for dependency broadcasting through a block organized source view data structure
KR102063656B1 (ko) 2013-03-15 2020-01-09 소프트 머신즈, 인크. 블록들로 그룹화된 멀티스레드 명령어들을 실행하기 위한 방법
US9569216B2 (en) 2013-03-15 2017-02-14 Soft Machines, Inc. Method for populating a source view data structure by using register template snapshots
WO2014150991A1 (en) 2013-03-15 2014-09-25 Soft Machines, Inc. A method for implementing a reduced size register view data structure in a microprocessor
US9891924B2 (en) 2013-03-15 2018-02-13 Intel Corporation Method for implementing a reduced size register view data structure in a microprocessor
WO2014150806A1 (en) 2013-03-15 2014-09-25 Soft Machines, Inc. A method for populating register view data structure by using register template snapshots
KR20150130510A (ko) 2013-03-15 2015-11-23 소프트 머신즈, 인크. 네이티브 분산된 플래그 아키텍처를 이용하여 게스트 중앙 플래그 아키텍처를 에뮬레이션하는 방법
US10140138B2 (en) 2013-03-15 2018-11-27 Intel Corporation Methods, systems and apparatus for supporting wide and efficient front-end operation with guest-architecture emulation
US9886279B2 (en) 2013-03-15 2018-02-06 Intel Corporation Method for populating and instruction view data structure by using register template snapshots
CN105164637B (zh) * 2013-05-30 2017-12-19 英特尔公司 用于执行循环的方法、系统、装置和处理器以及机器可读介质
US9424011B2 (en) * 2014-04-01 2016-08-23 International Business Machines Corporation Recursive expression simplification
US20160070662A1 (en) * 2014-09-04 2016-03-10 National Instruments Corporation Reordering a Sequence of Memory Accesses to Improve Pipelined Performance
GB2539410B (en) * 2015-06-15 2017-12-06 Bluwireless Tech Ltd Data processing
GB2539411B (en) 2015-06-15 2017-06-28 Bluwireless Tech Ltd Data processing
CN105354117B (zh) * 2015-10-26 2018-10-19 清华大学 超标量处理器中指令相关性检测的方法
US11366646B2 (en) * 2020-01-23 2022-06-21 Huawei Technologies Co., Ltd. Method and apparatus for predicting and scheduling copy instruction for software pipelined loops
US20240086162A1 (en) * 2022-09-09 2024-03-14 Microsoft Technology Licensing, Llc Interleaved machine instruction placement in memory

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5826055A (en) * 1991-07-08 1998-10-20 Seiko Epson Corporation System and method for retiring instructions in a superscalar microprocessor
US5628021A (en) * 1992-12-31 1997-05-06 Seiko Epson Corporation System and method for assigning tags to control instruction processing in a superscalar processor
GB9305263D0 (en) * 1993-03-15 1993-05-05 Univ Westminster Parrallel computation
US6205538B1 (en) * 1994-08-24 2001-03-20 Sun Microsystems, Inc. Instruction result labeling in a counterflow pipeline processor
US5911057A (en) * 1995-12-19 1999-06-08 Texas Instruments Incorporated Superscalar microprocessor having combined register and memory renaming circuits, systems, and methods
JP2933026B2 (ja) * 1996-08-30 1999-08-09 日本電気株式会社 複数命令並列発行/実行管理装置
GB2317464A (en) * 1996-09-23 1998-03-25 Advanced Risc Mach Ltd Register addressing in a data processing apparatus

Cited By (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101770387B (zh) * 2008-12-26 2013-03-13 北京中电华大电子设计有限责任公司 一种含有配对寄存器的寄存器分配方法
CN101894013A (zh) * 2010-07-16 2010-11-24 中国科学院计算技术研究所 处理器内指令级流水线控制方法及其系统
CN101894013B (zh) * 2010-07-16 2013-07-31 中国科学院计算技术研究所 处理器内指令级流水线控制方法及其系统
CN104412233A (zh) * 2013-05-30 2015-03-11 英特尔公司 流水线调度中混叠寄存器的分配
CN104412233B (zh) * 2013-05-30 2019-05-14 英特尔公司 流水线调度中混叠寄存器的分配
CN105242906B (zh) * 2014-04-25 2018-05-04 安华高科技通用Ip(新加坡)公司 利用世代数的重命名的处理装置和方法
CN105242906A (zh) * 2014-04-25 2016-01-13 美国博通公司 利用世代数的重命名
CN106293627A (zh) * 2016-07-27 2017-01-04 珠海市杰理科技有限公司 寄存器调用及调用指令编码的方法、装置
CN106293627B (zh) * 2016-07-27 2019-01-11 珠海市杰理科技股份有限公司 寄存器调用及调用指令编码的方法、装置
CN109188994A (zh) * 2017-06-30 2019-01-11 沈阳新松机器人自动化股份有限公司 一种梯形图编译方法及相应的plc系统
CN108052347A (zh) * 2017-12-06 2018-05-18 北京中科睿芯智能计算产业研究院有限公司 一种执行指令选择的装置、方法及指令映射方法
CN108052347B (zh) * 2017-12-06 2021-07-20 北京中科睿芯智能计算产业研究院有限公司 一种执行指令选择的装置、方法及指令映射方法
CN116400982A (zh) * 2023-05-26 2023-07-07 摩尔线程智能科技(北京)有限责任公司 配置中继寄存器模块的方法和装置、计算设备和可读介质
CN116400982B (zh) * 2023-05-26 2023-08-08 摩尔线程智能科技(北京)有限责任公司 配置中继寄存器模块的方法和装置、计算设备和可读介质

Also Published As

Publication number Publication date
GB0002848D0 (en) 2000-03-29
GB2355094B (en) 2002-05-01
JP2001282532A (ja) 2001-10-12
EP1124182A3 (en) 2005-08-03
US20010016901A1 (en) 2001-08-23
EP1124182A2 (en) 2001-08-16
GB2355094A (en) 2001-04-11
GB0102461D0 (en) 2001-03-14
US6826677B2 (en) 2004-11-30

Similar Documents

Publication Publication Date Title
CN1308274A (zh) 在处理器中传送指令结果及处理器的编译方法
US11816559B2 (en) Dilated convolution using systolic array
CN101268444B (zh) 用于多处理器上流媒体应用的数据转换
US7926046B2 (en) Compiler method for extracting and accelerator template program
CN1184564C (zh) 计算机系统及在计算机系统中执行指令的方法
CN1271889A (zh) 用于使用寄存器分配器建立调用约定序言和收尾程序代码的方法和装置
CN1421001A (zh) N基数类型算术表达式的优化
Guo et al. A graph covering algorithm for a coarse grain reconfigurable system
CN1922574A (zh) 无需额外的代码分析来进行链接时代码优化的方法和系统
CN1581069A (zh) 具有多位字段的寄存器的重命名
CN1310386A (zh) 映射电路和方法
CN1853164A (zh) 用于开发dsp编译器构件块的组合方法
Kessler Scheduling expression DAGs for minimal register need
JPH0816871B2 (ja) プログラム翻訳装置およびプログラム翻訳方法
JP2000284970A (ja) プログラム変換装置及びプロセッサ
US7356812B2 (en) Passing parameters by implicit reference
Choi et al. Address assignment combined with scheduling in DSP code generation
US9081561B2 (en) Method for improving execution performance of multiply-add instruction during compiling
Zhao et al. Exact memory size estimation for array computations
US20040064811A1 (en) Optimal register allocation in compilers
Wilson et al. An ILP-based approach to code generation
Fan et al. Modulo scheduling for highly customized datapaths to increase hardware reusability
Sharma et al. Array interleaving—an energy-efficient data layout transformation
CN1892603A (zh) 一种基于组合并算法的偏移量分配优化方法
Ma et al. A graph-based spatial mapping algorithm for a coarse grained reconfigurable architecture template

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C02 Deemed withdrawal of patent application after publication (patent law 2001)
WD01 Invention patent application deemed withdrawn after publication