具体实施方式
1.代表性实施方式
首先,说明本申请公开的发明的代表性实施方式的概要。在对代表性实施方式的概要说明中,加括号参照的附图标记只不过是例示出在标注了该附图标记的构成要素的概念中所包含的部分。
(1)本发明的代表性实施方式的数据处理装置10,包括可进行用于执行各个指令的预定处理的多个执行资源(EXU、LSU),可通过上述多个执行资源进行流水线处理。并且,上述执行资源对于由相同的执行资源处理的指令,按照该指令的流程顺序以有序方式进行处理,对于由互不相同的执行资源处理的指令,与该指令的流程顺序无关地以乱序方式进行处理。通过这样的处理,使执行资源内的局部处理简单化,可用小规模的硬件加以实现,不需要跨执行资源的大范围处理的同步,从而提高处理的局部性和功率效率。
(2)上述数据处理装置包括可取得(fetch)指令的指令取得单元(IFU)。此时,上述指令取得单元包括可基于按各执行资源而不同的作用域的先行指令的寄存器写入信息来检查作为与先行指令的冒险要因的流程依赖的信息队列(WIQ、RWIQ)。由此,作为乱序执行的结果,各执行资源的进展不同,即使在按各执行资源而先行指令不同的状况下,也可检查流程依赖。
(3)上述信息队列进行控制,以使后续指令的寄存器写入不超越先行指令的寄存器读出。具体而言,在后续指令的寄存器写入之前,检查先行指令的寄存器读出序号,若检测出反向依赖关系,则使后续指令的寄存器写入延迟,使先行指令的寄存器读出先执行。由此,可保持处于反依向赖关系的指令的执行结果的匹配性。
(4)可以按上述多个执行资源中的各执行资源而配置局部寄存器。由此,能够确保寄存器读出的局部性。
(5)仅对与读出写入值的执行资源对应的局部寄存器进行寄存器写入。由此,不需要反向依赖检查,并且可减少功耗。
(6)上述执行资源包括可基于上述指令进行运算执行的运算执行单元、和可进行数据的载入和存储的载入存储单元。此时,可以在上述局部寄存器中设置运算指令用的局部寄存器文件和载入存储指 令用的局部寄存器文件。为了确保寄存器读出的局部性,上述局部寄存器文件配置于上述运算执行单元内,上述局部寄存器文件配置在上述载入存储单元内。
(7)通过控制以使后续指令的寄存器写入不超越先行指令的寄存器写入,由此可保持处于反向依赖关系的指令的执行结果的匹配性。
(8)通过在先行指令的寄存器写入被向同一寄存器的后续指令的寄存器写入超越时,抑制先行指令的寄存器写入,可保持处于反向依赖关系的指令的执行结果的匹配性。
2.实施方式的说明
接着,进一步详细说明实施方式。
《本实施方式的比较例》
在此,首先基于图1、图2和图6说明作为实施方式比较例的以往处理器的结构、工作等。
图6例示出用于说明处理器工作例的第1程序。
如图6(A)中用C语言记述的那样,第1程序是对具有N个元素的两个数组a[i]和b[i]进行加法运算,并保存在数组c[i]中的程序。对用汇编语言记述该第1程序的情况进行说明。在汇编程序中,假设具有算后增量(post increment)式的载入和存储指令的体系结构。
如图6(B)所示,首先作为初始设定,通过4条直接转移指令“mov#_a,r0”、“mov #_b,r1”、“mov #_c,r2”和“mov #N,r3”,分别将3个数组的首地址_a、_b、_c和数组的元素数N保存到寄存器r0、r1、r2和r3中。接着,在循环部中,通过算后增量载入指令“mov r0+,r4”和“mov r1+,r5”,从r0和r1所指的数组a和b的地址载入数组元素至r4和r5,同时对r0和r1增量而使其指向下一数组元素。接着,通过减量(decrement)测试指令“dtr3”,对保存在r3中的元素数N进行减量,测试其结果是否是0,若是0则设置标志,若不是0则清除标志。其后,通过加法运算指令“addr4,r5”,对载入到r4和r5中的数组元素进行加法运算,并保存到 r5中。然后,通过算后增量存储指令“movr5,r2+”,将数组元素的加法运算结果的r5的值存储到数组c的元素地址。最后,通过条件分支指令“bf_L00”检查标志,若被清除,则剩余元素数N还不是0,因此分支到标签_L00所指的循环的起始。
图2概略例示出乱序方式的处理器的流水线结构。
该流水线结构由所有指令共用的指令高速缓存访问IC1和IC2、全局指令缓存GIB、运算和载入存储指令用的寄存器重命名REN和指令发出ISS、运算指令用的局部指令缓存EXIB、寄存器读RR、运算EX、载入存储指令用的局部指令缓存LSIB、寄存器读RR、载入存储地址计算LSA、数据高速缓存访问DC1、以及载入指令用的数据高速缓存访问第2级DC2、存储指令用的存储缓存地址及数据写入SBA和SBD、分支指令用的分支BR、与寄存器回写(write back)的某指令共用的物理寄存器回写WB、以及基于向逻辑寄存器的写回的指令返回(Return)RET的各级构成。基于算后增量的地址寄存器更新结果在与地址计算LSA接着的数据高速缓存访问DC1级被回写到物理寄存器。指令取得为每次4条指令,指令发出可以对于载入存储、运算、分支的各种类的每种类而在1个周期发出1条指令。
图3例示出用图2例示的乱序方式处理器执行第1程序时的循环部的流水线工作。
首先,在起始的载入指令“mov r0+,r4”的执行中,通过指令高速缓存访问IC1和IC2、全局指令缓存GIB、寄存器重命名REN、指令发出ISS、局部指令缓存LSIB、寄存器读RR、地址计算LSA、数据高速缓存访问DC1和DC2、物理寄存器回写WB、以及指令返回RET的各级处理来执行指令。在第2载入指令“mov r1+,r5”的执行中,与先行的载入指令发生资源竞争,因此在寄存器重命名REN后发生1个周期的气泡级(bubble stage),但其他是与起始载入指令同样地进行处理的。在第3减量测试指令“dtr3”的执行中,到指令发出ISS之前进行与第1载入指令同样的处理,其后,进行了局部指令缓存EXIB、寄存器读RR、运算EX以及物理寄存器回写 WB的各级处理后,为了恢复与先行指令的顺序关系,隔着4个周期的气泡级而执行指令返回RET级的处理。在第4加法运算指令“addr4,r5”的执行中,对于先行的两条载入指令存在流程依赖,因此,在寄存器重命名REN后发生4个周期的气泡级,然后通过指令发出ISS、局部指令缓存EXIB、寄存器读RR、运算EX、物理寄存器回写WB以及指令返回RET的各级处理来执行指令。在第5算后增量存储指令“mov r5,r2+”的执行中,指令取得是每次4条指令,因此,通过对如下处理执行指令,即该处理为对起始4条指令延迟1个周期的指令高速缓存访问IC1和IC2、全局指令缓存GIB、以及寄存器重命名REN之后,与先行的载入指令发生资源竞争,因此发生1个周期的流水线气泡,其后,指令发出ISS、局部指令缓存LSIB、寄存器读RR、地址计算LSA、数据高速缓存访问DC1、存储缓存地址及数据写入SBA和SBD、以及指令返回RET的各级处理。当寄存器r5在寄存器读RR级要进行读取时,会因流程依赖而等待,但若在存储缓存数据写入SBD级接收时,则不会等待。在循环最后的条件分支指令“bf_L00”的执行中,通过紧接全局指令缓存GIB级之后的分支BR级来处理指令。由于可用1次循环6条指令的小循环将所有指令保持在全局指令队列GIQ中,因此,通过反复执行保持于全局指令队列GIQ中的1个循环的指令来实现分支处理。结果,在紧接BR级之后,执行作为分支前指令的循环起始指令“mov r0+,r4”的全局指令队列GIQ级。
以上这样工作的结果,从执行各指令时的寄存器重命名REN级到返回RET级的循环次数是9~11周期。其间,对每一寄存器写分配不同的物理寄存器,每3个周期开始循环的处理,因此,在第4循环的中途释放第1循环的物理寄存器。另外,逻辑寄存器R5进行基于第2载入指令和第4加法运算指令的回写,因此,在1次循环内对寄存器R5分配2个物理寄存器。结果,对6条逻辑寄存器进行映射所需的物理寄存器数是每1次循环7条,在第1~4循环中,需要不同的物理寄存器,合计为28条物理寄存器。
图4例示出用乱序方式的处理器执行第1程序时的循环部的工作。在图2例示的流水线工作的指令发出ISS级或分支BR级中,使之代表各指令的执行周期。在载入指令中,地址计算LSA、数据高速缓存访问DC1和DC2这3级视为延迟,在分支指令中,分支BR、全局指令缓存GIB和寄存器重命名REN级这3级视为延迟,因此,载入指令和分支指令的延迟是3。首先,在第1周期执行起始的载入指令“mov r0+,r4”、第3减量测试指令“dt r3”、和循环最后的条件分支指令“bf_L00”。在第2周期执行第2载入指令“mov r1+,r5”,在第3周期执行第5算后增量存储指令“mov r5,r2+”。并且,在第4周期开始第2循环的处理,成为与第1周期同样的工作。进一步在第5周期执行第1循环的第4加法运算指令“addr4,r5”和第2循环的第2载入指令“mov r1+,r5”,第6周期成为与第3周期同样的工作。其后,反复每1次循环3周期的工作。
图5例示出将载入延迟从图4的3延长到9时的循环部的工作。在处理大规模数据时不收容在高速的小容量存储器中,因此假定较长的延迟是现实的。随着载入延迟的增加,第4加法运算指令“add r4,r5”的执行开始比图4延迟了6周期。结果,从寄存器重命名REN级到返回RET级的周期数比图3时长6周期,成为15~17周期,在第6循环的途中释放物理寄存器。因此,对6条逻辑寄存器进行映射所需的物理寄存器数增加了2循环的量、即14条,成为共计42条。如上所述,在以往的乱序方式中,虽然依赖于程序、执行延迟,但需要逻辑寄存器的4~7倍左右的物理寄存器。
《实施方式》
图1概略例示出作为本发明的数据处理装置一例的处理器的框结构。
图1所示的处理器10未特别限制,但包括指令高速缓存IC、指令取得单元IFU、数据高速缓存DC、载入存储单元LSU、指令执行单元EXU和总线接口单元BIU。在指令高速缓存IC附近配置有指令取得单元IFU,其中包括最初接受所取得的指令的全局指令队列GIQ、 分支处理控制部BRC、保持由锁存在全局指令队列GIQ中的指令生成的寄存器写信息并管理到寄存器写完成为止的写信息队列WIQ。另外,在数据高速缓存DC附近配置有载入存储单元LSU,其中包括保持载入存储指令的载入存储指令队列LSIQ、载入存储指令用的局部寄存器文件LSRF、载入存储指令用的地址加法运算器LSAG、保持存储指令的地址和数据的存储缓存SB。指令执行单元EXU包括保持运算指令的执行指令队列EXIQ、运算指令用的局部寄存器文件EXRF、运算指令用的运算器ALU。并且,总线接口单元BIU起到处理器10与外部总线的接口的作用。
图7概略例示上述处理器10的流水线结构。
首先,具有所有指令共用的指令高速缓存访问IC1和IC2、以及全局指令缓存GIB级,运算指令用的有局部指令缓存EXIB、局部寄存器读EXRR、以及运算EX。另外,载入存储指令用的有局部指令缓存LSIB、局部寄存器读LSRR、地址计算LSA、数据高速缓存访问DC1的各级,载入指令用的有数据高速缓存访问第2级DC2,存储指令用的有存储高速缓存地址和数据写入SBA和SBD的各级。分支指令用的有分支BR的各级,寄存器回写的某指令包括共用的寄存器回写WB级。
在指令高速缓存访问IC1和IC2级中,指令取得单元IFU从指令高速缓存IC每次取得4条指令,将其保存在全局指令缓存GIB级的全局指令队列GIQ中。在全局指令缓存GIB级中,根据保存的指令生成寄存器写信息,在下一周期保存于写信息队列WIQ。另外,载入存储、运算以及分支的各种类的指令被每次提取1条指令,在局部指令缓存LSIB和EXIB、以及分支BR级被分别保存于载入存储单元LSU的指令队列LSIQ、指令执行单元EXU的指令队列EXIQ以及指令取得单元IFU的分支控制部BRC。并且,在分支BR级中,接受到分支指令时,马上开始分支处理。
在运算指令用流水线中,指令执行单元EXU在局部指令缓存EXIB级,在1个周期中,每次将最大1条指令的运算指令接收到指 令队列EXIQ中,每次最大1条指令地进行译码,并且通过指令取得单元IFU检查写信息队列WIQ,来检测译码中的指令有无对先行指令的寄存器依赖。在接着的局部寄存器读EXRR级中,若不存在寄存器依赖则进行寄存器读,若存在依赖则暂停(stall)该级而使之产生流水线气泡(pipeline bubble)。其后,在运算EX级使用运算器ALU进行运算,并在寄存器回写WB级中,在寄存器中进行存储。
在载入存储指令用的流水线中,在载入指令缓存LSIB级,载入存储单元LSU在1个周期中将每次最大1条指令的载入存储指令接收到指令队列LSIQ中,每次最大1条指令地进行译码,并且通过指令取得单元IFU检查写信息队列WIQ,来检测译码中的指令有无对先行指令的寄存器依赖。在接着的局部寄存器读LSRR级中,若不存在寄存器依赖则进行寄存器读,若存在依赖则暂停(stall)该级而使之产生流水线气泡。然后,在地址计算LSA级使用地址加法运算器LSAG进行地址计算。并且,若是载入指令,则在数据高速缓存访问DC1和DC2级从数据高速缓存DC载入数据,并在寄存器回写WB级保存于寄存器。若是存储指令,则在数据高速缓存访问DC1级进行访问的例外检查和数据高速缓存DC的命中/非命中判断,在存储缓存地址、数据写入SBA和SBD的各级,分别将存储地址和存储数据写入存储缓存。
图8例示出上述处理器10中的全局指令队列GIQ和写信息队列WIQ的结构。
如图8所示,全局指令队列GIQ由16指令的指令队列入口(entry)GIQ0~15、指定写入位置的全局指令队列指针GIQP、运算、载入存储以及随着分支的各种类指令的进展而增进的、指定读出位置的运算指令指针EXP、载入存储指令指针LSP、分支指令指针BRP、以及对这些指针进行译码的指令队列指针译码部IQP-DEC构成。
而写信息队列WIQ由写信息译码器WID0~3、16指令的写入信息入口WI0~15、指定新的写入信息设置位置的写信息队列指针WIQP、指定处于局部指令缓存级EXIB和LSIB中的运算指令和载入 存储指令的位置的载入存储指令局部指针LSLP和运算指令局部指针EXLP、指向载入接下来可利用的载入数据的指令的载入数据写指针LDWP、以及对这些指针进行译码的写信息队列指针译码部WIP-DEC构成。
全局指令队列GIQ按照由全局指令队列指针GIQP的译码生成的全局指令队列选择信号GIQS,将从指令高速缓存IC取得的4条指令ICO0~3锁存到指令队列条目GIQ0~3、GIQ4~7、GIQ8~11或GIQ12~15中,在锁存之后的周期,将锁存的4条指令输出至写信息队列WIQ的写信息译码部WID0~3。同时接收表示取得的4条指令ICO0~3的有效性的指令高速缓存输出有效信号ICOV,对该信号进行断言(assert)后锁存于全局指令队列GIQ中。另外,按照由运算指令指针EXP、载入存储指令指针LSP和分支指令指针BRP这三个指针的译码而生成的运算指令选择信号EXS、载入存储指令选择信号LSS和分支指令选择信号BRS,每次提取1条各种类的指令,作为运算指令EX-INST、载入存储指令LS-INST和分支指令BR-INST进行输出。
在写信息队列WIQ中,首先,写信息译码部WID0~3接收锁存于全局指令队列GIQ中的4条指令,生成这些指令的寄存器写信息。然后,接收到的指令的有效信号IV被断言后,按照由写信息队列指针WIQP的译码而生成的写信息队列选择信号WIQS,将所生成的寄存器写信息锁存于WI0~3、WI4~7、WI8~11、或WI12~15中。写信息队列指针WIQP指向锁存于写信息队列WIQ中的指令中最早的指令,当从该最早的指令开始,4条指令的寄存器写信息成为不需要而被删除时,则能够在写信息队列WIQ中产生空闲,可进行新的4条指令的写信息的锁存。并且,重新锁存了写信息后,则使写信息队列指针WIQP前进,以指接下来的4条目。
而运算指令局部指针EXLP和载入存储指令局部指针LSLP指定从此开始执行的指令,从上述最早的指令到这些指针指定的指令之前的指令为止,是在从此开始执行的指令之前执行的指令,成为流程依赖的检查对象指令。因此,写信息队列指针译码部WIP-DEC生成用 于从写信息队列指针WIQP、运算指令和载入存储指令的局部指针EXLP和LSLP中选择全部流程依赖的检查对象范围的条目的运算指令和载入存储指令用屏蔽信号EXMSK和LSMSK。
图9例示出运算指令用屏蔽信号EXMSK的生成逻辑。
输入信号中,写信息队列指针WIQP为2位、运算指令局部指针EXLP为4位,总计6位,输出的16条指令的写入信息条目WI0~15所对应的运算指令用屏蔽信号EXMSK为16位。为了容易译码,指针以2位单位按00、01、11、10的顺序周期性更新。看到2位中的1位就知道是否是相邻序号,因此是适于范围信号生成的编码。由于写信息队列指针WIQP是每隔4个而前进,因此00、01、11、10时指向条目0、4、8、12。另外,运算指令局部指针EXLP仅指向运算指令,跳过其他指令而前进。
右端是64那样对输出信号值标注的序号。为了容易查表,仅在运算指令用屏蔽信号EXMSK为“1”时进行记载,在为“0”时为空栏。在#1中,两个指针都为“0”一致,因此表示出不存在先行的指令,运算指令用屏蔽信号EXMSK全是“0”。写信息队列指针WIQP保持“0”不变,运算指令局部指针EXLP如#2~15那样前进时,先行指令增加,与此相应地,运算指令用屏蔽信号EXMSK被断言。同样,在#20中,两个指针都为4一致,因此不存在先行的指令,自此开始,写信息队列指针WIQP保持4不变,运算指令局部指针EXLP如#21~31、16~19那样在途中绕回(wraparound)前进时,先行指令增加,与此相应地,运算指令用屏蔽信号EXMSK被断言。在#32以后也是同样的。并且,由写信息队列指针WIQP和载入存储指令局部指针LSLP生成载入存储指令用屏蔽信号LSMSK的逻辑也是相同的。
如上所述,运算指令用屏蔽信号EXMSK生成逻辑乍看似复杂,但逻辑电路例如如图10所示那样,在2输入NAND换算中为50门的小规模逻辑即可。EXMSK之上的横线表示逻辑反相。为了比较,图11例示出由运算指令局部指针EXLP生成运算指令局部选择信号EXLS的4位译码逻辑。在2输入NAND换算中为28门。4位译码 部在控制部中被用于任意处,但上述屏蔽信号生成逻辑仅是2处,尤其是无障碍的逻辑规模。
根据由如上述那样生成的运算指令用屏蔽信号EXMSK,从图8所示的写信息队列WIQ的16条目取出在运算指令局部指针EXLP所指的运算指令之前执行的指令的写信息,并取逻辑和,作为运算指令用写信息EX-WI进行输出。同样,根据载入存储指令用屏蔽信号LSMSK,从写信息队列WIQ的16条目取出在载入存储指令局部指针LSLP所指的载入存储指令之前执行的指令的写信息,并取逻辑和,作为载入存储指令用写信息LS-WI进行输出。
同时,在全局指令缓存GIB级,用锁存部81、82对从全局指令队列GIQ输出的运算指令EX-INST和载入存储指令LS-INST进行锁存,使之与局部指令缓存LSIB和EXIB级同步,输入到运算指令和载入存储指令的寄存器读信息译码部EX-RID和LS-RID并进行译码,生成运算指令和载入存储指令的寄存器读信息EXIB-RI和LSIB-RI。然后,取写信息EX-WI、LS-WI和读信息EXIB-RI、LSIB-RI的每个寄存器序号的逻辑积的关于所有寄存器序号的逻辑和,分别作为运算指令和载入存储指令的发出暂停EX-STL和LS-STL。发出暂停EX-STL和LS-STL经锁存部83、84而被输出。
上述发出暂停被取反时,发出指令。在本实施方式中,运算指令的运算和载入存储指令的地址计算在1周期内完成,因此,发出运算指令和载入存储指令时,其结果从下一周期发出的指令开始可以使用。因此,若发出指令则写信息队列WIQ内的对应的寄存器写信息被清除。因此,将运算指令和载入存储指令的发出暂停EX-STL和LS-STL取反后的信号分别作为运算指令和载入存储指令的寄存器写信息清除信号EX-WICLR和LS-WICLR。而载入指令的延迟是3,因此通常等待2周期后,所对应的寄存器写信息被清除。但是,有时由于高速缓存错误等,为了使载入数据成为可使用状态而需要超过3周期的周期数。因此,实际上输入与要载入数据成为可使用状态相符的载入数据寄存器写信息清除信号LD-WICLR来清除对应的寄存器写 信息。
例如,也存在如图6所示的程序的算后增量载入指令“movr0+,r4”那样更新两个寄存器的指令。此时,将地址寄存器r0和载入数据寄存器r4双方的写信息保存于1条指令的条目中。并且,双方的寄存器成为可使用状态的定时分别是发出指令后的1个周期和3个周期,是不同的。因此,基于载入存储指令对载入指令的寄存器写信息清除信号LS-WICLR进行的r0的寄存器写信息清除是按寄存器序号选择性进行的,保留载入数据寄存器r4的寄存器写信息。而在基于载入数据寄存器写信息清除信号LD-WICLR进行的r4的寄存器写信息清除时,其他寄存器写信息已经被清除,因此不需要按寄存器序号选择性进行,而将载入指令用的条目的寄存器写信息全部清除。
图12例示出图6所示的程序的上述处理器10进行的流水线工作。
省略指令高速缓存访问IC1和IC2,从全局指令缓存GIB级开始记述。首先,在起始的载入指令“mov r0+,r4”的执行中,通过全局指令缓存GIB、局部指令缓存LSIB、局部寄存器读LSRR、地址计算LSA、数据高速缓存访问DC1和DC2以及寄存器回写WB的各级处理来执行指令。
在第2载入指令“mov r1+,r5”的执行中,由于与先行的载入指令发生资源竞争,因此在全局指令缓存GIB级中保持2周期后,与起始载入指令同样地进行处理。
在第3减量测试指令“dt r3”的执行中,通过全局指令缓存GIB、局部指令缓存EXIB、局部寄存器读EXRR、运算EX和寄存器回写WB的各级处理来执行指令。
在第4加法运算指令“add r4,r5”的执行中,由于与先行的减量测试指令发生资源竞争,因此在全局指令缓存GIB级中保持2周期后,进入全局指令缓存EXIB级,由于相对于先行的两个载入指令存在流程依赖,因此在局部指令缓存EXIB级中暂停3周期后,通过局部寄存器读EXRR、运算EX、以及寄存器回写WB的各级处理来执 行指令。
在第5算后增量存储指令“movr5,r2+”中,由于指令取得是每次4条指令,因此比先行指令延迟1周期而进入全局指令缓存GIB级,由于与先行的载入指令发生资源竞争,因此在全局指令缓存GIB级中保持2周期后,通过局部指令缓存LSIB、局部寄存器读LSRR、地址计算LSA、数据高速缓存访问DC1以及存储高速缓存地址和数据写入SBA和SBD的各级处理来执行指令。
在循环最后的条件分支指令“bf_L00”的执行中,通过全局指令缓存GIB和分支BR的各级处理来执行指令。分支处理与上述的乱序方式处理器相同,通过反复执行保持于全局指令队列GIQ中的1次循环的指令来实现。结果,在紧接BR级之后,执行作为分支前指令的循环起始指令“mov r0+,r4”的全局指令队列GIQ级。
第2循环也基本上以第1循环的3周期延迟而被执行。其中,在第3减量测试指令“dt r3”和第4加法运算指令“add r4,r5”的执行中,由于与第1循环的第4加法运算指令“add r4,r5”发生资源竞争,因此在全局指令缓存GIB级中被保持为2周期余量。结果,第3减量测试指令“dt r3”在延迟反映其的2周期余量后被执行,第4加法运算指令“add r4,r5”的因流程依赖引起的暂停减少2周期而多余的周期被抵消,与其他指令同样地以第1循环的3周期延迟而被执行。第3循环以后与第2循环同样地被执行。
接着,说明各指令发出时的流程依赖检查的工作。
图12例示出各周期中的写信息队列WIQ的状态。
在本工作例中,使用从r0到r5的6条寄存器,因此,对这些6条寄存器进行记载。与图9相同,仅在值为“1”时进行记载,在值为“0”时为空栏。图中,细双线表示写信息队列指针WIQP所指的条目,粗线表示运算指令局部指针EXLP所指条目之前的条目,细线和粗线的双线表示载入存储指令局部指针LSLP所指条目之前的条目。因此,从细双线到粗线是运算指令的流程依赖检查对象条目,从细双线到细线和粗线的双线是载入存储指令的流程依赖检查对象条 目。细双线位于下方时,范围在条目15绕回到条目0。
运算指令和载入存储指令用写信息EX-WI和LS-WI的状态也与图9相同,仅在值为“1”时进行记载,在值为“0”时为空栏。并且,运算指令和载入存储指令用读信息EXIB-RI和LSIB-RI,在由于表示应进行流程依赖检查的寄存器而被断言之处标注了阴影线。因此,在标注了阴影线的栏中有“1”时,则发生流程依赖,需要流水线暂停,因此,对运算指令和载入存储指令的发出暂停EX-STL和LS-STL进行断言。
首先,在全局指令缓存GIB级将起始4条指令锁存于全局指令队列GIQ中,传送至写信息队列WIQ中。同时,起始指令作为图8的LS-INST而被送往局部指令缓存LSIB级,第3指令作为EX-INST而被送往局部指令缓存EXIB级。此时,写信息队列WIQ为空,写信息队列指针WIQP、运算指令局部指针EXLP、载入存储指令局部指针LSLP都指向起始条目WI0。
在下一周期中,将起始4条指令的寄存器写信息锁存于写信息队列WIQ的起始4条目WI0~WI3中,写信息队列指针WIQP指向条目WI4,运算指令局部指针EXLP指向条目WI2,载入存储指令局部指针LSLP接着指向起始条目WI0。结果,如图12所示那样,在r0、r1、r4、r5,运算指令用写信息EX-WI被断言,载入存储指令用写信息LS-WI未被断言。而且,r0和r3分别断言,运算指令和载入存储指令用读信息EXIB-RI和LSIB-RI在寄存器序号上不重复,因此,运算指令和载入存储指令的发出暂停EX-STL和LS-STL被断言。
在下一周期中,清除通过执行第1指令和第3指令成为可利用状态的条目WI0的r0和条目WI2的r3的寄存器写信息。另外,第5算后增量存储指令“mov r5,r2+”的写信息被重新锁存于条目WI4中。第6条件分支指令“bf_L100”中没有寄存器写。另外,第7、8指令是循环外指令,在不作为检查对象的状态下由分支取消,无论写什么都对工作没有影响,因此,为了便于说明,对应的条目WI6、7标为空栏。并且,写信息队列指针WIQP指向条目WI8,运算指令局 部指针EXLP指向条目WI3,载入存储指令局部指针LSLP指向条目WI1。结果,如图所示,在r1、r4、r5中运算指令用写信息EX-WI被断言,在r4中载入存储指令用写信息LS-WI被断言。进一步,运算指令用读信息EXIB-RI的r4和r5被断言,载入存储指令用读信息LSIB-RI的r1被断言,运算指令用写信息EX-WI和运算指令用读信息EXIB-RI有重叠,因此,运算指令发出暂停EX-STL被断言。并且,根据该信号,局部指令缓存EXIB级被暂停。
在下一周期中,清除通过执行第2指令而成为可利用状态的条目WI1的r1的寄存器写信息。另外,写信息队列指针WIQP接着指向条目WI8,运算指令局部指针EXLP也接着指向条目WI3,载入存储指令局部指针LSLP指向条目WI4。结果,如图12所示,在r4、r5中运算指令用写信息EX-WI和载入存储指令用写信息LS-WI都被断言。进而,运算指令用读信息EXIB-RI的r4和r5被断言,载入存储指令用读信息LSIB-RI的r2被断言,运算指令用写信息EX-WI和运算指令用读信息EXIB-RI有重叠,因此,运算指令发出暂停EX-STL被断言。并且,根据该信号,局部指令缓存EXIB级被暂停。
在下一周期中,清除通过执行第5指令而成为可利用状态的条目WI4的r2的寄存器写信息。另外,第2循环的起始4条指令的寄存器写信息被锁存于写信息队列WIQ的4条目WI8~WI11中,写信息队列指针WIQP指向条目WI12,运算指令局部指针EXLP接着指向条目WI3,载入存储指令局部指针LSLP指向条目WI8。结果,如图12所示,在r5中运算指令用写信息EX-WI和载入存储指令用写信息LS-WI都被断言。进而,运算指令用读信息EXIB-RI的r4和r5被断言,载入存储指令用读信息LSIB-RI的r0被断言,运算指令用写信息EX-WI和运算指令用读信息EXIB-RI有重叠,因此,运算指令发出暂停EX-STL被断言。然后,根据该信号,局部指令缓存EXIB级被暂停。
在下一周期中,清除通过执行第2循环的第1指令而成为可利用状态的条目WI8的r0的寄存器写信息。另外,第5算后增量存储指 令“mov r5,r2+”的写信息被重新锁存于条目WI12中。并且,写信息队列指针WIQP指向条目WI0,运算指令局部指针EXLP接着指向条目WI3,载入存储指令局部指针LSLP指向条目WI9。结果如图所示,运算指令用写信息EX-WI全部被清除,在r4和r5中载入存储指令用写信息LS-WI被断言。进而,运算指令用读信息EXIB-RI的r4和r5被断言,载入存储指令用读信息LSIB-RI的r1被断言,在寄存器序号上没有重叠,因此,运算指令和载入存储指令的发出暂停EX-STL和LS-STL未被断言。
在下一周期中,清除通过执行第2循环的第2指令来成为可利用状态的条目WI9的r1的寄存器写信息。另外,写信息队列指针WIQP接着指向条目WI0,运算指令局部指针EXLP指向条目WI10,载入存储指令局部指针LSLP指向条目WI12。结果如图12所示,在r4和r5中,运算指令用写信息EX-WI和载入存储指令用写信息LS-WI。进而,运算指令用读信息EXIB-RI的r3被断言,载入存储指令用读信息LSIB-RI的r2被断言,在寄存器序号上没有重叠,因此,运算指令和载入存储指令的发出暂停EX-STL和LS-STL未被断言。
在接下来的3周期中,分别进行与3周期之前同样的工作。不同之处在于写信息队列WIQ的内容错开8条目。虽然未图示,但其后分别进行与6周期之前同样的处理。如上所述,由写信息队列WIQ管理流程依赖,适当地进行指令发出。
图13例示出用本发明实施方式的处理器执行第1程序时的循环部的工作。
在此,在图12例示的流水线工作的局部指令缓存级LSIB和EXIB、或分支BR级中,使之代表各指令的执行周期。在载入指令中,地址计算LSA、数据高速缓存访问DC1和DC2这三级视为延迟,在分支指令中,分支BR、全局指令缓存GIB级视为延迟,因此,载入指令和分支指令的延迟分别是3和2。首先,在第1周期执行起始的载入指令“mov r0+,r4”和第3减量测试指令“dt r3”。在第2周期执行第2载入指令“mov r1+,r5”和循环最后的条件分支指令“bf L100”,在第3周期执行第5算后增量存储指令“mov r5,r2+”。然后,在第4周期开始第2循环的处理,执行起始的载入指令“movr0+,r4”。在第1循环中,执行的第3减量测试指令“dt r3”由于未超越先行的第1循环的第4加法运算指令“add r4,r5”而被未执行。进一步,在第5周期中,除了与第2周期同样的工作之外,还执行第1循环的第4加法运算指令“add r4,r5”,在第6周期中,除了与第3周期同样的工作之外,还执行第3减量测试指令“dt r3”。其后,反复1次循环3周期的工作。
图14例示出将载入延迟从图14的3延长到9时的循环部的工作。
随着载入延迟的增加,第4加法运算指令“add r4,r5”的执行比图4延迟6周期。随之第2循环的第3减量测试指令“dt r3”的执行也延迟6周期。在本发明的方式中,若执行资源不同,则可用乱序方式进行处理,因此,运算流水线的执行延迟不会波及其他而维持1次循环3周期的工作,因载入延迟增加而导致性能降低是比较少的。但是,这样的工作需要高度的分支预测。尤其是在预测的命中/非命中不确定时执行条件分支指令,因此会发生分支预测的嵌套(nest),控制变得复杂。
图15表示在由分支流水线执行图14中在运算流水线中执行的第3减量测试指令“dt t3”的情况。
若如图15所示那样执行,则第4加法运算指令“add r4,r5”的执行延迟不会波及,分支条件确定提前,不需要分支预测的嵌套。但是,在图8所示的电路中,不处理分支流水线上的寄存器读写,因此需要增加电路。但是,在分支指令中还存在寄存器间接分支,由此优选也处理寄存器读写。寄存器间接分支用于从分支源起的移动(displacement)指定分支达不到的长距离分支,因此认为出现频率较低的程序也较多,用分支流水线处理寄存器读写而导致的成本增加,未见得会提高性能。
在本实施方式中,在同一执行资源内进行有序执行,因此不会引起反向依赖和输出依赖的问题。但是,在不同资源之间若不适当处理, 则会引起问题。
图16例示出本实施方式中引起反向依赖和输出依赖的流水线工作。
起始的载入指令“mov r1,r1”从寄存器r1所指的存储器位置将数据载入寄存器r1。第2载入指令“mov r1,r2”从寄存器r1所指的存储器位置将数据载入寄存器r2。第3存储指令“mov r2,@r0”将寄存器r2的值存储到寄存器r0所指存储器位置。第4直接转移指令“mov#2,r2”将2写入寄存器r2。第5直接转移指令“mov#1,r0”将1写入寄存器r0。第6加法运算指令“add r0,r2”将寄存器r0的值加到寄存器r2中。然后,最终的存储指令与第3指令相同。
载入存储指令在存储器流水线执行、立即传送和加法运算指令在运算流水线执行时,最初的3条指令和最后的指令在存储器流水线执行,从第4条开始的3条指令在运算流水线执行。此时,第2载入指令和第4、6指令处于输出依赖的关系,第3存储指令和第4、5条直接转移指令处于反向依赖的关系。并且,在存储器流水线和运算流水线中,有序执行指令,因此,只要利用各执行结果更新各局部寄存器文件EXRF和LSRF,就会使输出依赖和反向依赖不显著。但是,要在另一方流水线参照一方流水线的执行结果,则需要在流水线之间传送执行结果,有可能使输出依赖和反向依赖显著。图16所示的例子中,使用在运算流水线执行的第5、6条指令的执行结果而在存储器流水线执行最后的指令。因此,需要将第5、6条指令的执行结果从运算流水线传送到存储器流水线。由于最后的指令在LSIB级生成读寄存器信息LSIB-RI,因此判断出在该级中需要r0和r2的传送。并且,在判断出的时刻,在最后的指令之前执行的存储器流水线指令的LSRR级完成,反向依赖消除,即使将执行结果从运算流水线传送到存储器流水线,也没有障碍。具体而言,判断出第5、6条指令分别在第4、5周期的回写级WB回写到局部寄存器文件EXRF中之后,需要在第6周期的最后指令的LSIB级的起始传送回写的值,因此,分别在第6、7周期的复制级CPY传送r0和r2。
由于第3存储指令所使用的r2的值在LSRR级不存在,因此不使之读出,但其后,不会从局部寄存器文件LSRF读出,在存储缓存数据级SBD之前,生成值的时刻通过前送(forwarding)来取入。因此,即使在第3存储指令在LSRR级不读出r2的情况下,只要将从运算流水线传送到存储器流水线的值写入到存储器流水线的局部寄存器文件LSRF的r2即可。结果,在存储器流水线的局部寄存器文件LSRF中,在基于第2条指令向r2写入之前,进行基于第6条指令的向r2的写入,输出依赖显著。因此,在第2载入指令中,不进行向r2的寄存器写,仅进行向第3存储指令的数据前送。
上述的复制中,在局部寄存器文件EXRF和LSRF中增加专用的读写端口或将与通常的读写共享现有的端口即可。对于控制成在共享端口而使访问发生竞争时使一方等待来逐次进行访问,只要是设计处理器等数据处理装置的通常的技术人员即可实现。另外,暂时不使用执行结果的情况非常少,因此若在向局部寄存器文件的回写之后还在缓存中保留值时,则即使不增加端口,也能进行复制的情况较多。在图16所示的例子中,在回写级WB之后设置1级缓存复制级BUF/CPY,不需要用于传送的寄存器读端口。
在通常的流水线控制中,面向回写级WB,流过回写信息EXRR-WI、EX-WI、和WB-WI。并且,在后续指令使用值的情况下,在存在多个向同一序号的寄存器的回写信息时,只要使用最新的值即可。与此相对,在本发明的流水线控制中,增加了缓存复制级BUF/CPY的回写信息BFU/CPY-WI。而且,若流水线不同,未必是逐次执行,因此,对指令标注序号来比较程序顺序,识别选择在按程序顺序先于读出指令执行的指令中最新的指令生成的值。在图16中,直接使用在写信息队列WIQ中标注的序号。r2的值由指令序号为3和5的两条指令更新,由指令序号为6的存储指令参照。因此,传送并使用指令序号为5的加法运算指令的结果。
如果程序顺序相反,存储指令为5号、加法运算指令为6号,则传送的值成为指令序号3号的直接转移指令的结果。此时,只要再准 备1级缓存级,值保留在缓存中,则可实现来自缓存的传送。
写信息队列WIQ具有16条目,识别需要4位,但若限制从缓存传送值的指令与参照值的指令的距离,则也可减少位数。而且,在程序上在同一流水线执行的指令连续的情况下,对于这些指令可使用相同的识别序号,因此,即使是相同的位数,也能放宽指令距离的限制。例如,在图16所示的例子中,由于集中到第1、2、3和第4、5、6和第7这三组,因此,这7条指令的识别信息用2位就足够。
若经过缓存复制级BUF/CPY,则失去回写信息,因此,会失去仅在一方的局部寄存器文件具有最新值这样的信息。因此,对各寄存器定义寄存器状态。在图16中对各寄存器保持2位的信息REGI[n](n:0-15),记录全部最新、存储器流水线的局部寄存器文件LSRF最新、以及运算流水线的局部寄存器文件EXRF最新这三种状态。在图16中示出r0、r1和r2的信息。空栏、LS和EX分别表示全部最新、存储器流水线的局部寄存器文件LSRF最新、以及运算流水线的局部寄存器文件EXRF最新这三种状态。
处理反向依赖和输出依赖关系的另一方法是进行控制以使后续指令的寄存器写入不超越先行指令的寄存器读出和寄存器写入。图17表示的例子是扩大图8的写信息队列WIQ作为也保持读信息的读写信息队列RWIQ,不仅能检测流程依赖,还可检测反向依赖和输出依赖。
读写信息队列RWIQ由读写信息译码部RWID0~3、16条指令的读写信息条目RWI0~15、指定新的读写信息设置位置的读写信息队列指针RWIQP、指定处于局部指令缓存级EXIB和LSIB的运算指令和载入存储指令的位置的载入存储指令局部指针LSLP、运算指令局部指针EXLP、指向载入接下来可利用的载入数据的指令的载入数据写指针LDWP、以及对这些指针进行译码的读写信息队列指针译码部RWIP-DEC构成。
在读写信息队列RWIQ中,首先,读写信息译码部RWID0~3接收锁存于局部指令队列GIQ中的4条指令,生成这些指令的寄存器写 信息。然后,当接收到的指令的有效信号IV被断言后,按照通过读写信息队列指针RWIQP的译码而生成的读写信息队列选择信号RWIQS,将生成的寄存器读写信息锁存到RWI0~3、RWI4~7、RWI8~11、或RWI12~15。读写信息队列指针RWIQP指向在锁存于读写信息队列RWIQ中的指令中最早的指令,当该最早的指令起4条指令的寄存器读写信息成为不需要的而被删除时,则在读写信息队列RWIQ中产生空闲,可进行新的4条指令的读写信息的锁存。然后,若重新锁存了读写信息,则使读写信息队列指针RWIQP前进,以指向下4条。
而运算指令局部指针EXLP和载入存储指令局部指针LSLP指定以后要执行的指令,从上述最早的指令到这些指针指定的指令之前的指令,是要在以后执行的指令之前先执行的指令,成为流程依赖、反向依赖和输出依赖的检查对象指令。因此,读写信息队列指针译码部RWIP-DEC生成用于从读写信息队列指针RWIQP、运算指令和载入存储指令的局部指针EXLP和LSLP中选择全部流程依赖、反向依赖和输出依赖的检查对象范围的条目的运算指令和载入存储指令用屏蔽信号EXMSK和LSMSK。
并且,根据运算指令用屏蔽信号EXMSK,从读写信息队列RWIQ的16条中取出在运算指令局部指针EXLP所指的运算指令前先执行的指令的读写信息,并取逻辑和,作为运算指令用读写信息EX-WI和EX-RI进行输出。同样,根据载入存储指令用屏蔽信号LSMSK,从读写信息队列RWIQ的16条中取出在载入存储指令局部指针LSLP所指的载入存储指令之前先执行的指令的读写信息,并取逻辑和,作为载入存储指令用读写信息LS-WI和LS-RI进行输出。
同时,在全局指令缓存GIB级,用锁存部81、82锁存从全局指令队列GIQ输出的运算指令EX-INST和载入存储指令LS-INST,使其与局部指令缓存LSIB和EXIB级同步,输入到运算指令和载入存储指令的寄存器读写信息译码部EX-RWID和LS-RWID并进行译码,生成运算指令和载入存储指令的寄存器读写信息EXIB-RI、EXIB-WI、 LSIB-RI、LSIB-WI。然后,取写信息EX-WI、LS-WI和读信息EXIB-RI、LSIB-RI的每个寄存器序号的逻辑积的、关于所有寄存器序号的逻辑和,分别检测运算指令和载入存储指令的流程依赖。同样,取读信息EX-RI、LS-RI和写信息EXIB-WI、LSIB-WI的每个寄存器序号的逻辑积的、关于所有寄存器序号的逻辑和,分别检测运算指令和载入存储指令的反向依赖。然后,取写信息EX-WI、LS-WI和写信息EXIB-WI、LSIB-WI的每个寄存器序号的逻辑积的、关于所有寄存器序号的逻辑和,分别检测运算指令和载入存储指令的输出依赖。然后,取这三种依赖信息的逻辑和,作为发出暂停EX-STL和LS-STL。
与图8所示的写信息队列WIQ相同,这些发出暂停被取反时,发出指令。在本实施方式中,使运算指令的运算和载入存储指令的地址计算在1周期中完成,因此,当发出运算指令和载入存储指令时,其结果从下一周期发出的指令开始成为可以使用状态。而且,当发出指令时不需要反向依赖检查,因此也不需要寄存器读信息。因此,若发出指令则清除读写信息队列RWIQ内的对应的寄存器读写信息。因此,将对运算指令和载入存储指令的发出暂停EX-STL和LS-STL取反后的信号分别作为运算指令和载入存储指令的寄存器读写信息清除信号EX-RWICLR和LS-RWICLR。而载入指令的延迟是3,因此通常等待2周期后将所对应的寄存器写信息清除。但是,有时由于高速缓存错误等,也需要超过3周期的周期数,以使载入数据成为可使用状态。因此,实际上输入与载入数据成为可使用状态相符的载入数据寄存器写信息清除信号LD-WICLR来清除对应的寄存器写信息。
图18例示出由具有读写信息队列RWIQ(参照图17)的处理器10进行的与图16所示程序相同的程序的流水线工作。
寄存器读写信息在各条目中,读写分别为16个寄存器的16位,共计32位,但在例示的程序中,仅使用r0、r1和r3三条,因此对于三条读写信息6位,表示各周期的值。条目也示出16条中从0到8和15这10条。与图12所示情况相同,读写信息队列RWIQ的值仅在为“1”时进行记载,空栏表示“0”。另外,来自读写信息队列 RWIQ的输出LS-WI、LS-RI、EX-WI和EX-RI的值也是仅在为“1”时进行记载,空栏表示“0”。并且,在运算指令和载入存储指令的寄存器读写信息EXIB-RI、EXIB-WI、LSIB-RI和LSIB-WI的值为“1”时标注阴影线,为“0”时是空栏。因此,若存在流程依赖和反向依赖,则“1”和阴影线位置重叠。
在第2、3周期,发生r1的LS-WI与LSIB-WI的重叠,表示第1指令和第2指令为流程依赖。结果,第2指令的发出暂停2周期。另外,从第2周期到第5周期,发生r2的EX-RI与EXIB-WI的重叠,表示第3指令和第4指令为反向依赖。结果,第4指令的发出暂停5周期。对于输出依赖,栏内显示不一致,因此不重叠,但r2的EX-RI与EXIB-WI在从第2周期到第5周期同时为1,表示第2指令与第4指令为输出依赖。即,第4指令不仅因为上述反向依赖,还由于输出依赖而暂停。进一步,在第6、7周期发生r0的LS-WI和LSIB-RI的重叠,表示第5指令和第7指令为流程依赖。结果,第7指令的发出暂停2周期。
如此,虽然增加了依赖关系检查机构的电路规模,且执行周期也较上述方式增加,但可进行统一的依赖关系检查,不需要管理最新寄存器值存在于哪里。
与此相对,在上述方式中,具有电路规模小、性能强的优点。能够以局部寄存器写为基本,将向其他流水线的寄存器写抑制为必要的最小限度,因此也适于低功耗化。
以上具体说明了由本发明人完成的发明,但本发明不限于此,不言而喻,在不脱离其要旨的范围内可进行各种变更。
例如,在上述例子中,进行控制以使后续指令的寄存器写入不超越先行指令的寄存器写入,但在先行指令的寄存器写入被向同一寄存器的后续指令的寄存器写入超越时,也可以进行控制来抑制先行指令的寄存器写入。采用这样的控制,则可阻止寄存器的保持信息的破坏,因此能够保持处于输出依赖关系的指令的执行结果的匹配性。
在以上说明中,主要就背景技术的利用领域的处理器对由本发明 人完成的发明进行了说明,但本发明不限于此,也能够适用于进行数据处理的数据处理装置。
本发明能将至少包括多个执行资源作为适用条件。