一种机器可读介质的制作方法

文档序号:6442269阅读:242来源:国知局
专利名称:一种机器可读介质的制作方法
发明的领域本发明有关一个VLIW(Very Large Instruction Word-超长指令字)处理器。本发明也涉及用于这样一个处理器的程序和这种程序的编译。
背景技术
VLIW处理器的一个例子是飞利浦电子公司的TM-1000处理器(TriMedia)。这种处理器被描述在,例如,欧洲专利申请EP 605 927(等价于美国的序列号07/999,080,现已放弃;PHA 21777)中。在一个VLIW处理器中,对指令的并行执行是通过在一单个长指令字中组合多个基本的机器命令获得的。典型地,每一个这样的基本命令代表一个RISC操作。对于每一个时钟周期,一个长指令字被提供给并行排列的功能单元中,这些功能单元以同步方式(lock-step)进行操作。这些命令中的每一个都相应地被提供给这些单元中的一个。典型地,一个单元执行流水化的处理。
TM-1000处理器并行地分发命令,每一个命令位于超长指令字分发寄存器的一个相应的分发槽(issue slot)中。每一个分发槽与相应的一个处理单元组相关,并且与寄存器文件中的两个读端口和一个写入端口相关。一个特定的命令被指定到一个与特定分发槽相连的组中的功能单元中的某一个。该命令一般是包含一个操作码、两个源操作数定义和一个结果操作数定义。源操作数定义和结果操作数定义引用寄存器文件中的寄存器。在命令的执行过程中,源操作数是通过向与分发槽相连的读端口提供提取信号从特定分发槽中读取的。典型地,功能单元从这些读端口接收操作数,根据操作码执行这个命令,然后通过与特定分发槽相连的写入端口将处理结果写回寄存器文件。或者采用另一种方法,命令可以使用少于两个操作数和/或不对寄存器文件产生结果。
一个针对VLIW处理器的典型程序被翻译成针对这些功能单元的一组命令。一个编译时间调度程序将这些命令分配到长指令字中。调度程序通过优化并行操作尽量减少执行程序所需的时间。调度程序在下列条件限制下将命令结合成指令字分配给同一指令的多个命令能被并行处理,并且有数据依赖关系限制。
发明概述本发明的目标之一是提供一个VLIW处理器,相对于传统的VLIW处理器,该处理器具有能减少执行一个程序所需的指令字数目的体系架构。
为达此目的,本发明的VLIW处理器包含一个指令分发端口,用来顺序地提供第一和第二超长指令字。这些指令字的每一个包含一个分布在一个相应的命令级连中的有序的域级连。第一个字包括一个含有第一个域的第一个命令和含有第二个域的第二个命令。第二个字包含具有该第一个和第二个域的第三个命令。这种处理器具有一个第一和第二功能单元,第一个功能单元与分发端口连接用于处理第一个命令,第二个功能单元与分发端口连接,用于与第一单元同步地处理第二个命令。这种处理器还有第三个功能单元与分发端口连接,用于处理第三个命令。
本发明是基于灵活地将指令分发端口划分成分发槽。这意味着,例如,有可能采用不同的命令,这些命令使用不同数目域作为操作数。还有,不同命令可以具有不同长度的操作码。与处理命令的特定电路资源(在此指这些功能单元)相连的域,可以与和不同分发槽相连的不同组中的功能单元组合使用。这比将指令分发端口划分为固定分发槽允许使用更为复杂的命令。为了处理最复杂的命令,没有必要在分发槽中保留更多的空间。在传统的VLIW处理器中,如此复杂的命令不得不以多个指令字序列的形式使用几个较简单的命令来实现。相应地,因为完成该程序需要较少的指令字,与传统的VLIW处理器相比,该发明能允许更快地执行程序。
例如,在类似TM-1000这样的机器中,从三个操作数中计算结果的一个操作(例如,求平均数的操作)至少需要两个连续执行的命令,因此也需要至少两个指令。通过提供具有超过两个操作数的域的一个命令,该操作可以只用一个命令执行。而且,因为这些域能被灵活地分配给命令,这能实现对于所有命令的操作数不必保留超过两个域。
在该发明的一种实施方案中,第三个命令包含了用于执行第一和第二个命令的所有域。所以,例如,如果第一和第二个固定大小的分发槽分别被用于分发第一和第二个命令,第三个命令可以使用第一和第二个分发槽的组合。这简化了调度。
在每个命令中的不同的域,也就是在每一个分发槽中,每一个可以由一个固定的功能,譬如代表一个操作数寄存器的读地址,或者表示一个结果寄存器的写入地址或者表示一个操作码。这些不同域将与指令处理电路的固定部分相连,就象读端口或操作码解码器一样。在这种情况下,第三个指令可以使用两倍数量的操作数和/或产生两倍数量的结果和/或使用两倍大小的操作码。当分发槽每一个分别与一个相应的功能单元的组相连时,用于执行第三个命令的一个功能单元同时属于两个组。
在一个VLIW处理器中,一个命令所使用的域的组合对应于一个分发槽。典型地,一个常规分发槽的大小与第一和第二个命令相同,并用于常规的命令(使用一个分发槽,包含一个操作码域、两个输入寄存器选择域和一个结果寄存器选择域)。在这种情况下,在这种实施方案中用于第三个命令的域包含了整数个常规分发槽。在VLIW处理器程序中,用于命令的分发槽是一种稀缺资源在程序中的用于命令的分发槽数目越多(在相应的指令中使用的相应的分发槽的数目之和),程序越慢。因此,用于第三条命令的常规分发槽的个数最好比用常规命令的组合来实现与第三条命令相同的功能所需的常规分发槽数目少。只有在这种情况下,第三条命令才节省作为稀缺资源的分发槽。
而且,用常规命令实现第三条命令也意味着这些常规命令的中间结果不得不用与普通寄存器大小相应的精度来表示(例如64位或者一个包含8位的8个元素的向量)。使用组合了多个普通命令的效果的第三个命令,如果需要的话,中间结果能以更高的精度来表示,在很多信号(比如图像和声音信号)处理应用中就是这种情况。
较佳地,每一个指令由固定数目的分发槽组成,这里每一个分发槽与一个或多个能够处理命令的功能单元相连。不同的功能单元提供给不同的命令组。这些功能单元与分发槽相连。当一个指令被分发时,从某个分发槽来的命令被送到与这个分发槽相连的功能单元中。对应于分别分发第一和第二个命令的分发槽,提供了一个第一功能单元和一个第二功能单元;同时提供了一个第三个功能单元,既与第一也和第二个分发槽相连。所以,第一和第二命令被分配到不同的功能单元进行处理。对于第三个命令,第三个功能单元认识到应该使用第一和第二分发槽,而第一和第二功能单元认识到它们不应该使用第一和第二分发槽。第三功能单元的激活由第一和第二分发槽中的一个的操作码域来触发。较佳地,这个操作码域控制利用在第一和第二分发槽中引用的操作数的第三个功能单元所做的操作。如果第一和第二分发槽中的某一个可能只包含一个能在自身执行的常规的命令,而不用其他的分发槽,情况就不是这样,以及如果另一分发槽发信号对那个常规命令进行修正,例如操作数的后处理或预处理、条件执行等,情况也不是这样。这会将第三功能单元命令的一些可能功能限制到作为常规命令可利用的那些命令以及这些命令的修改,这些命令只用一个分发槽就可以执行。这个限制将排除很多对于多媒体信号处理应用有用的命令。
本发明也关于一种编译程序的编译器,该编译器用于编译能灵活分配域给指令的VLIW处理器的程序,本发明还关于具有这种灵活分配的程序。
附图的简要描述本发明的这些和其他一些方面将结合附图举例说明。其中,

图1是根据本发明的一个VLIW处理器的框图;图2a-c是指令字格式的图;图3是一个分发槽解码电路的框图;图4是编译一个程序的流程图;图5是将命令分配到指令槽的图。
优选实施方案图1是一个VLIW处理器的图。VLIW处理器包含一个指令字存储器系统10、一个程序计数器11、一个解码和启动电路12、功能单元14a-k以及一个多端口寄存器文件16。计数器11被连接到存储器系统10的一个地址输入。存储器系统10有一个指令分发寄存器(未显示出来),该寄存器被分割成分发槽(也称为指令总线)。一个分发槽有几个功能并行的通路,以传送当前保存在分发寄存器中的指令字的各个位。分发寄存器的一个输出被连接到解码和启动电路12。电路12的输出连接到功能单元14a-k和多端口寄存器文件16。寄存器文件16的读取端口和写入端口连接到功能单元14a-k。存储器系统10在计数器11的控制下连续地向解码和启动电路12输送指令字。较佳地,系统10使用指令高速缓存和/或预取,但这对于本发明而言不是本质的。系统10也可以在输出之前对以压缩格式存储的指令字执行解压缩操作。解码和启动电路12接收指令字。电路12把发自存储器系统10的功能并行的通路当作一个域的集合,每一个域被关联到一个或多个通道。域的集合组成一个命令。命令的集合形成一个单一指令字。
图2a用第一种格式表示一个指令字,其中指令字被分成许多分发槽20a-e。分发槽20a-e中的每一个对应于一个命令。每一个槽有一个域用于一个操作码22a-e,有两个域用于操作数24a-e、26a-e(表示对寄存器文件16中一个相应的寄存器的引用),以及有一个域用于结果28a-e的目的地(表示对寄存器文件16中一个相应的寄存器的引用)。
图2b,c表示第二种格式的一个指令字,其中多个分发槽组合成“超级槽(superslot)”。例如,超级槽29a组合常规的槽20a和20b的域,而超级槽29b组合槽20c-e的域。超级槽格式允许实现的命令比以单个常规槽实现的命令使用更多的操作数。一般地,每一个单独的域22a-e,24a-e,26a-e,28a-e要么在超级槽29a和29b中具有和常规槽20a-e相同的功能,要么根本没有功能。例如,域24a-e和26a-e中具体的一个以第一种格式以及以第二种格式定义了一个操作数,或者根本不被使用。域22a-e中具体的一个以第一种格式以及以第二种格式用于一个操作码,或者根本不被使用。域28a-e中具体的一个以第一种格式以及以第二种格式用于目的地,或者根本不被使用。作为选择,第二种格式中的域22a-e,24a-e,26a-e,28a-e具有与第一种格式的域不同的用途。
图3是一个VLIW处理器的图,包括解码和启动电路30的部分、功能单元32a-c和多端口寄存器文件34的部分。解码和启动电路30部分包含一个连接到功能单元32a-c的指令解码器300。单元32a-c连接到寄存器文件34的读取端口302a和302b。一个结果写入单元304连接到寄存器文件34的一个写入端口342。读取端口302a,b的输出被连接到功能单元32a-c的输入。功能单元32a-c的输出连接到342的写入端口。解码和启动电路12包含如图3中每一个分发槽类似的电路。解码和启动电路12根据每一个域的功能处理来自域22a-e,24a-e,26a-e,28a-e中的信息。操作数域24a-e,26a-e的每一个分别与寄存器文件16中的一个读取端口关联。解码和启动电路12使用域24a-e,26a-e的内容来寻址相应的读取端口。类似地,目标域28a-e对应于寄存器文件16中的写入端口。解码和启动电路12使用域28a-e的内容来寻址相应的写入端口。操作码域22a-e每一个被输送到解码和启动电路12中的一个相应的指令解码器300,于是被解码的操作码被输送到功能单元14a-k中选定的一些单元中。典型地,解码和启动电路12使用流水线化的操作,例如在对指令字解码期间启动操作数的提取。在来自前一个指令字的一个命令仍在执行的同时,对来自一个指令字的命令的解码和提取也正在被执行,并且同时来自更早的一个指令字的命令的结果正在被写入目的地址。因为域22a-e,24a-e,26a-e,28a-e的功能预先已定义,并且独立于格式,所以操作数提取可以在指令解码完成之前开始。
多个功能单元14a-k被编排成组,就象图3中的组。每一个组分别与以第一种格式的一个指令字的一个相应的分发槽联系起来。当解码和启动电路12侦测到一个第一种格式的指令字时,电路12为每一个槽确定与该槽联系的组中的哪些单元(如果有的话)应该在该槽中执行这个命令。该功能单元随后接受控制信号执行该命令。这样,解码和启动电路12每次将导致一个组中的功能单元开始执行一个命令。典型地,同一类型的功能单元出现在不同组中。例如,每一个组包含一个ALU(算术逻辑单元)。这防止出现由于每次使用每个组中不超过一个功能单元造成的瓶颈。
功能单元14a-c中的某些不只属于一个组。这些单元被称为下面所说的超级功能单元。超级单元14a-c中的每一个与两个或多个特定的组联系起来。这意味着超级单元14a-c中的每一个能使用从至与这些特定的组相关的寄存器文件16的读入端口来的操作数。还有,超级单元14a-c能使用至与这些特定的组相关的寄存器文件16的写入端口。超级功能单元14a-c的命令来自以第二种格式的指令字。这些命令被放在超级槽29a和29b中。在超级槽中的操作数域24a,b和26a,b起着为超级单元14a-c从寄存器文件16中提取操作数的作用。域24a,b和26a,b的每一个连接到所有指令字的同一个读取端口,不管这个指令字的格式如何。结果是,提取能够在格式确定之前开始。类似地,目标域28a,b起到控制至寄存器文件16的写入端口的作用。每一个这些域都连接到所有指令字的同一个写入端口,独立于格式。当解码和启动电路12导致一个特定的超级单元开始执行一个命令时,电路12将防止功能单元14d-k中的任何一个开始执行与超级单元相连的组中的命令。在超级槽29a,b中的被解码的操作码域22a,b对应于与这些组相连的常规槽20a,b中的操作码域22a,b,并用于控制仅这些相关的超级单元14a-c。例如,可能只使用这些槽中的某一个的操作码来控制超级单元,但是也可能用一个组合电路来组合两个或多个这些槽的操作码。这样,能为超级单元14a-c中的每一个定义大量的不同操作。超级单元14a-c执行命令来实现那些需要超过两个操作数和/或产生超过两个结果的操作。这些操作的一些例子是AV(R1,R2,R3..) 产生三个或多个操作数R1,R2,R3..的平均数;ME(R1,R2,R3..) 产生三个、五个或多个操作数的中值;SO(R1,R2) 排列两个操作数R1和R2,较大的操作数将置于一个结果寄存器中,而较小的置于另一个结果寄存器中;TP(R1,R2,R3,R4...) 一个有着R1,R2,R3,R4行的矩阵的转置;RT(R1,R2,R3) 将一个具有R1,R2,R3元素的向量旋转一个特定的角度。
在一个传统的VLIW处理器中,以上操作需要顺序执行几个命令。在一些情况下,多端口寄存器文件中的寄存器用以代表一组小的数的组合。例如,如果这个寄存器是64位宽的,每个寄存器能表示4个16位数。在这种情况下,这些数的每一个可以独立地被操作。例如,响应一个ADD命令,功能单元可以对来自两个寄存器的4对数做加法。
这种方法也能用于超级单元。例如,4个寄存器能表示16位的数的一个4×4矩阵。每个寄存器分别包含一个相应的四元组R1=(a11,a12,a13,a14),R2=(a21,a22,a23,a24),R3=(a31,a32,a33,a34),R4=(a41,a42,a43,a44),每个元组分别表示该矩阵的相应的一行。保存在不同的寄存器但处于各元组中相同位置的元素集合代表矩阵的一列。在转置操作中,这些在不同的行但在相同位置的元素被保存在RESULT1=(a11,a21,a31,a41)和RESULT2=(a12,a22,a32,a42)中。用于矩阵转置操作的一个超级单元能用2个分发槽,产生一个4×4矩阵的两行。通过向这个功能单元发出2个命令,一个用于产生所转置的矩阵的上两行,另一个用于提供下两行,很快就能完成转置操作。
正移操作(shuffle operation)与上述操作相似SH R1,R2,R3->R4(,R5)这个操作根据寄存器R3中定义的置换规则(permulation),对保存在寄存器R1和R2中数字进行置换和/或选择,把置换之后的结果数字保存在寄存器R4和可选的寄存器R5中。
在一些情况下,一个或多个操作数有标准值。在这些情况下,定义一个额外的命令很有优势,它仅占用一个分发槽。在这个额外的命令中,操作码定义这个特殊的操作和一个或多个操作数的标准值。标准值也可以是隐式定义的。这个额外命令包含仅引用余留操作数的操作数引用。这样一个命令能被用在具有第一种格式或者是第二种格式的一个指令字的一个单一操作槽中。当解码和启动电路12遇到这样的指令时,它向超级单元自身提供标准参数。这样,这个超级单元能接收到既使用一个分发槽也使用两个或多个分发槽的一个命令。在前一种情况下,采用标准值并且指令字能包含更多的命令。
在图1的实施方案中,每个超级单元使用与整数个功能单元的组关联的分发槽的所有域。一个备选的超级单元可以使用这些分发槽的一些但不是全部的域。例如,这样的一个备选单元可以处理3个操作数,其中2个来自一个特定分发槽的域,第3个来自另一个分发槽。当采用这样的一个备选单元时,其相关的分发槽的其它域可为其它的单元所用,而这些单元能与备选超级单元开始并行执行。举例说,这些其它的功能单元或许有仅仅一个操作数或根本没有操作数,或者不产生结果。所说的其它单元仅用备选单元留下未用的域中的一些。还有,这些其它功能单元或许就是备选超级功能单元自身,其使用该分发槽的一些域外加另一个分发槽的域。然而,使用备选功能单元对可从一个单一指令字接收命令的单元的结合加以复杂的限制。通过使用这些分发槽的所有域,或至少不使用部分已分配槽的剩余的域,能避免这个限制。这样能达到更高的并行度,并且指令字的编译更容易。
一个编译器为VLIW处理器产生指令字。这个编译器以相互之间有数据依赖关系的多个命令来描述一个程序。编译器搜索一种把所有的命令放置在一个指令字的集合中的方式。在程序执行期间,编译器执行最少数量的需要顺序执行的指令字。图4是用来表示一个编译程序的方法的流程图。在第一步40中,接收一组操作及这些操作之间的数据依赖关系描述。接下来,编译器开始搜索来放置用于这些操作的命令到一个指令字集合中的方式。第二步42测试是否接收来的所有操作的命令已被放置。如果是,这个编译过程就完成了。如果没有,执行第三步44,选择一个还没有为其放置命令的操作,并且对于该操作产生其操作数的前一“源操作”已经被放置。更进一步,在包含这个“源操作”的命令已放置好的指令字之后,在这个指令字集合中挑选出最早的指令字。第四步46测试构造一个指令字是否可能,这个指令字包括已经包含在最早的指令字中的命令加上一个用于被选择的操作的命令。步骤46考虑命令的特性和功能单元的分组。要对其测试以下两项是否可能-把命令放在不同的组中;并且-为超级功能单元放置命令以便没有别的命令使用与那些超级单元相连的组的分发槽。
如果这是可能的,被选择的指令字被更新,并且这个方法返回到第二步42。如果这是不可能的,执行第5步48,被选指令字的后续指令字被选中并重复执行第四步46。
图5是用于进一步解释第四步46的图示。在左边,一组操作表示为第一节点50a-d。在右边,一组分发槽表示为第二节点52a-e。第四个步骤的任务是测试是否存在一个从第一节点50a-d到第二节点52a-e的映射。在这个映射中,一个超级功能单元50d的一个操作映射到两个或多个分发槽52d,e。其它的第一节点50a-d对应常规的操作,每一个映射到第二节点52a-e中的某一对应的节点。节点52a-e的每一个对应于一个分发槽,这个分发槽与一个组关联,这个组包含一个能执行该相关操作的功能单元。当然,图4所示仅是一个简化的例子。总的来说,最小化的执行受限于命令间的数据依赖(即,如果一个第一个命令使用一个第二个命令的结果作为输入,这些命令应该放置在不同的指令字中,包含第一个命令的指令字在包含第二个命令的指令字之后)。而且,最小化的执行受到功能单元能够开始并行执行每个指令字的所有命令的能力的制约。
权利要求
1.一种机器可读介质,其包含一个程序,用于执行编译用于VLIW处理器的指令的方法,这个处理器包含功能单元组(14a-14k),每个指令字分别针对功能单元的每一组被允许包含至多一个相应的命令,这个处理器也包含至少一个另一功能单元(14a-14c),这个另一功能单元与这些组中的至少两个组相关联,每个包含针对该另一功能单元的命令的指令字不允许包含针对在所述组中的至少两个组中的任一功能单元的命令,这个方法包含-接收必须由该功能单元执行的命令集;-搜索命令到指令字的相容分配,所说的搜索包含从搜索中消除那些既包含一个用于该功能单元的命令又包含至少一个用于来自上述组中的至少两个组的任一功能单元的命令的指令字。
2.一种机器可读介质,其包含一个用于VLIW处理器的程序,这个程序包含一个第一个指令字,这个指令字包含一个第一和第二个命令(20a;20b),这两个命令分别包含第一和第二个域(28a;28b),并且第二个指令字包含第三个命令(29a),这个命令既包含第一个域也包含第二个域。
3.根据权利要求2的机器可读介质,其中,由所有用在第一个命令中的所有域构成的域集(22a-28a;22b-28b)被包含在第三个命令中。
4.根据权利要求3的机器可读介质,其中,所有用在第二个命令中的域构成的一组域(22a-28a;22b-28b)被包含在第三个命令中。
全文摘要
一个VLIW处理器有第一和第二两个功能单元,用于执行一个第一指令字中的第一和第二命令。相应地,第一和第二命令分别包含了第一个域和第二个域。本处理器还有一个第三功能单元,用于执行在第二指令字中的第三个命令。这第三个命令既包含第一个域也包含第二个域。
文档编号G06F9/38GK1516003SQ0310631
公开日2004年7月28日 申请日期1999年1月15日 优先权日1998年1月16日
发明者G·A·斯莱文伯格, J·T·范艾恩多芬, S·拉思南, G A 斯莱文伯格, 寄, 范艾恩多芬 申请人:皇家菲利浦电子有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1