具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例的附图,对本公开实施例的技术方案进行清楚、完整地描述。显然,所描述的实施例是本公开的一部分实施例,而不是全部的实施例。基于所描述的本公开的实施例,本领域普通技术人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
图1A示出了示例性的标量中央处理器(CPU)指令流水线,该指令流水线包括五阶段流水线,其中,每条指令可以在每个时钟周期发出并在固定的时间(例如,5个时钟周期)内执行。每条指令的执行分成5步:取指(IF)阶段1001、读寄存器(RD)阶段(或译码阶段)1002、算术/逻辑单元(ALU)阶段(或执行阶段)1003、访存(MEM)阶段1004和写回(WB)阶段1005。在IF阶段1001中,从指令高速缓存器中取出指定指令。所取出的指定指令的一部分用于指定可用于执行指令的源寄存器。在RD阶段1002中,译码并生成控制逻辑,将所指定的源寄存器的内容取出。根据控制逻辑,使用所取出的内容在ALU阶段1003中执行算术或逻辑运算。在MEM阶段1004中,执行指令可读/写数据高速缓存器中的存储器。最后,在WB阶段1005中,通过执行指令而获得的值可以写回到某个寄存器中。
如图1A所示的流水线在执行简单指令序列时可以很顺畅,每个时钟周期可以执行一条指令。但是,程序中的指令序列并不总是简单序列,通常会存在指令间的相关,这些相关可能导致流水线执行冲突甚至出错。目前影响流水线主要可以分为三类:资源冲突(结构相关)、数据冲突(数据相关)和控制冲突(控制相关)。
在程序中,如果两条指令访问同一个寄存器或内存地址,而且这两条指令中至少一条是写指令,那么这两条指令就存在数据相关。数据相关根据冲突访问中读和写的次序可以分为三种情况:RAW(写后读)、WAW(写后写)、WAR(读后写)。对于RAW(写后读),后面的指令需要使用到前面的所写的数据,也称为真相关;对于WAW(写后写),两个指令同写一个目标地址,也称为输出相关;对于WAR(读后写),后面的指令覆盖前面指令所读的目标地址,也称为反相关。
可以通过寄存器重命名技术解决WAW(写后写)和WAR(读后写)可能的流水线冲突。可以采用阻塞技术、流水线前递技术等解决RAW(写后读)可能的流水线冲突。对于阻塞技术,将被阻塞的流水级所在的寄存器保持原值不变,同时向被阻塞的流水级的下一级流水级输入指令无效信号,采用流水线空泡(bubble)填充。对于流水线前递技术,将当前流水级的执行(EX)阶段的运算结果直接送到下一级流水级的译码阶段,作为该下一级流水级的EX阶段的输入,即有一条从执行阶段到译码阶段的前递通路。例如,也可以有从访存阶段到译码阶段的前递通路。
如图1A所示的常规的标量流水线,每个时钟周期平均执行的指令的条数小于等于1,即它的指令级并行度小于等于1。超标量指在一个周期内并行执行多条指令的方法,具有增加的指令级并行度,能够在一个周期内处理多条指令的处理器就被称为超标量处理器。超标量处理器在通常的标量(scalar)处理器的基础上增加额外的资源,创建多条管线(pipeline),每条管线执行分配给自己的指令,以此来实现并行化。图1B示出了示例性的超标量中央处理器(CPU)指令流水线,流水线中的每一级可并行输入4条指令,例如指令1-4被并行处理,指令5-8被并行处理,指令9-12被并行处理。如图1B所示的常规的标量流水线,每个时钟周期平均执行的指令的条数大于1,即它的指令级并行度大于1。
例如,超标量处理器还可以进一步支持乱序执行(out-of-order execution)。乱序执行指CPU采用允许将多条指令不按程序规定的顺序分开发送给相应电路单元处理的技术。乱序执行涉及不少的算法,这些算法基本上都是以保留站为基础进行设计的。保留站的核心思想是把译码完成后的指令根据各自的指令种类送往各自的保留站中保存下来,如果该指令的所有操作数都已准备齐全,则可以开始进行乱序发射。
对于采用乱序执行和超标量等技术的CPU,虽然采用寄存器重命名技术解决WAW(写后写)数据相关和WAR(读后写)数据相关,然而采用阻塞以及流水线前递技术并没有很好地解决RAW(写后读)数据相关,受影响的指令只能在保留站中等待而无法发射到执行单元,导致执行单元的资源存在一定的闲置,最终影响了CPU的总体性能。
本公开的发明人注意到,对于RSIC-V指令集(ISA),使用编译器gcc对典型程序(例如CoreMark,由EEMBC(Embedded Microprocessor Benchmark Consortium)的Shay Gla-On于2009年提出的一项基准测试程序)编译后产生的一种示例性的指令序列,如下所示:
mv x8,x15
ld x5,0(x8)
上述指令序列中,mv指令指示在通用寄存器之间进行数据拷贝,这里将寄存器x15中的数据移动到寄存器x8中;ld指令用于以“源操作数加偏移量”为地址加载数据到通用寄存器,这里以x8中储存的值加偏移量0作为地址去读取存储器中的值,并将读取回的数写入寄存器x5中。因此,在该指令序列中,在后的ld指令的源寄存器(rs)和在前的mv指令的目的寄存器(rd)都是寄存器x8,即这两条指令之间具有RAW(写后读)数据相关。因此,通常需要等mv指令执行完毕准备写回时,后面的ld指令才能发射、执行。虽然mv指令涉及运算,但实际上对于其源寄存器(在上述示例中为寄存器x15)中的值没有做修改,执行完毕之后寄存器x8和寄存器x15具有相同的数值。那么,如果把ld指令的rs从指向寄存器x8变成指向寄存器x15,进行修改后得到如下指令:
ld x5,0(x15)
那么执行该修改后的指令的结果与之前的指令“ld x5,0(x8)”的结果是相同的。因此,通过将寄存器x15的值“前递”给ld指令,在不影响上述指令序列功能的情况下,就能消除“移动后使用”所产生的“真相关”(即上述RAW(写后读)数据相关)。
另外,例如在RISC-V指令集中,mv指令是一种比较特殊的伪指令,在进行解码之后,它所对应的原指令(base instruction)是addi rd,rs1,0imm,把源操作数rs1里的值加立即数0后写回到目标操作数rd。
基于上述现象以及理解,本公开的至少一实施例提供了一种调节指令流水线的方法,包括:接收移动型指令,这里,移动型指令包括目标操作数与第一源操作数,指示将第一源操作数指向的源地址的数据移动到目标操作数指向的目标地址;接收在指令序列中位于移动型指令之后的对象指令,这里,对象指令包括对象源操作数,指示使用对象源操作数指向的源地址进行对象操作;响应于移动型指令的目标操作数与对象指令的对象源操作数相同,将对象指令中的对象源操作数替换为移动型指令的第一源操作数以得到修改指令。本公开的实施例所提供的调节指令流水线的方法可以利用较少的资源消除涉及移动型指令的RAW(写后读)数据相关,显著地提高了CPU性能。
本公开的至少一实施例还提供了一种对应于上述方法的调节指令流水线的装置、包括该调节指令流水线的装置的处理器、非暂时性地存储用于实现上述方法的计算机可执行指令。
下面将结合具体示例对本公开的各个实施例进行说明。
如图2所示,本公开的至少一实施例提供了一种调节指令流水线的方法100,该方法包括步骤S101~步骤S103。
步骤S101:接收移动型指令。
移动型指令包括目标操作数与第一源操作数,指示将第一源操作数指向的源地址的数据移动到目标操作数指向的目标地址。根据该移动型指令的具体示例,该移动型指令还可以包括第二源操作数等,该第二源操作数例如可以为立即数、固定的寄存器等。
步骤S102,接收在指令序列中位于移动型指令之后的对象指令。
对象指令在指令序列中位于移动型指令之后,包括对象源操作数,指示使用对象源操作数指向的源地址进行对象操作。本公开的实施例对于对象指令没有具体限制,该对象指令包括一个或多个对象源地址,还可以包括自身的目标地址等。
步骤S103,响应于移动型指令的目标操作数与对象指令的对象源操作数相同,将对象指令中的对象源操作数替换为移动型指令的第一源操作数以得到修改指令。在移动型指令的目标操作数与对象指令的对象源操作数相同的情形下,将对象指令中的对象源操作数替换为移动型指令的第一源操作数以得到修改指令,该修改指令之后将作为被执行的指令。
由此,在至少一个实施例中,调节指令流水线的方法还可以进一步包括执行修改指令,以使用移动型指令的第一源操作数指向的源地址进行对象操作。
在本公开的各个实施例中,“移动型指令”指代实质上在两个操作数所指向的寄存器/内存地址之间进行数据拷贝的指令,该指令包括目标操作数以及一个或多个源操作数,执行了该指令之后目标操作数所指向的寄存器/内存地址的值与其中一个源操作数指向的寄存器/内存地址的值相同。例如,在本公开的至少一个实施例中,“移动型指令”包括移动指令本身或与移动指令等价的等价指令,例如,对于RISC-V的指令集,移动型指令的示例包括但不限于:
· mv指令:mv rd,rs1
·等价于mv指令的addi指令:addi rd,rs1,0(即立即数为0)
· c.mv指令:c.mv rd,rs1
·等价于c.mv指令的add指令:add rd,x0,rs2(即rs1默认为寄存器x0)
·等价于c.mv指令的sub指令:sub rd,rs1,x0(即rs2默认为寄存器x0)
· fmv指令:fmv.s rd rs1以及fmv.d rd rs1
·等价于fmv指令(fmv.s和fmv.d)的fsgnj指令:fsgnj.s rd,rs1,rs2以及fsgnj.d rd rs1 rs2
上述移动型指令中,例如,mv指令的源操作数rs1、addi指令的源操作数rs1、c.mv指令的源操作数rs1、add指令的源操作数rs2、sub指令的源操作数rs1、fmv指令的源操作数rs1、fsgnj指令的源操作数rs1对应于上述方法100的中“第一源操作数”。寄存器x0(零寄存器)专门用于存放常数0,即该寄存器的值恒为零。
本公开的“移动型指令”也可以适用于其他指令集,例如,复杂指令集(CISC),例如X86指令集,本公开的实施例对此不作限制。
图3示出了一个示例中操作数前递网络的示意图。在上述实施例的调节指令流水线的方法针对mv指令的具体示例中,参考图3,指令序列中具有先后的两个指令instr0和instr1(这里指令instr1对应方法100中的“对象指令”),指令instr0具有源操作数rs1和rs2并且具有目标操作数rd,指令instr1具有源操作数rs1和rs2并且具有目标操作数rd,对于指令instr0和指令instr1进行如下操作:
首先,判断在先的指令instr0是否为mv指令(即instr0_is_mv);其次,判断指令instr1的两个源操作数r1和r2之一是否与指令instr0的目标操作数rd相同(即instr0.rd==instr1.rs1或者instr0.rd==instr1.rs2),当其中一个情形存在时,即(instr0_is_mv&&instr0.rd==instr1.rs1)为真或(instr0_is_mv&&instr0.rd==instr1.rs2)为真,那么对指令instr1进行修改得到修改后的指令instr1,将原指令instr1中的源操作数rs1或rs2的值替换为指令instr0的源操作数rs1(因为mv指令中rs2默认为空)的值。之后,再执行修改指令instr1,这样就实现了操作数前递,克服了该指令序列中在涉及移动型指令的情形的RAW(写后读)数据相关,使得原指令instr1可以被提前执行(例如提前发射并执行),提高了CPU的效率。
例如,在一个典型的示例中,指令序列如下:
add x5,x0,x6
mul x10,x5,x7
在上述指令序列中,由于在先的add指令中一个源操作数指向0(即零寄存器x0),因此其等价于c.mv指令,即为移动型指令,并且在后的mul指令(对应于本公开中的“对象指令”,下面对于类似情形不再特别指出)的源操作数之一x5(寄存器x5)与在先的add指令中的目标操作数x5相同,因此可以进行操作数(寄存器x6)前递,由此得到修改后的mul指令:mul x10,x6,x7。由此,可以并行执行该add指令和该修改后的mul指令,而不影响mul指令的结果,改善了该指令序列在CPU中执行的效率。
在本公开的实施例中,在先的移动型指令与在后的对象指令无需直接相邻,二者之间可以有一条或多条其他指令(即中间指令)。例如,在一个典型的示例中,指令序列如下:
add x5,x0,x6
div x11,x12,x13
mul x10,x5,x7
与前面的指令序列不同的是,在作为移动型指令的add指令和作为对象指令的mul指令之间插入了div指令,但是div指令与add指令所实际使用的操作数x5和操作数x6无关,即不会修改操作数x5和操作数x6的值,因此仍然可以进行操作数前递,由此得到修改后的mul指令:mul x10,x6,x7。由此,可以在div指令之前(例如与add指令同时)或与div指令同时执行该修改后的mul指令,而不影响mul指令的结果,改善了该指令序列在CPU中执行的效率。
在上述实施例的一些实施例中,执行上述调节指令流水线的方法,对于移动型指令的不同情形,还可能存在操作数前递可能导致错误的例外情况。
例如,在至少一个实施例中,在方法100中,在将对象指令中的对象源操作数替换为移动型指令的第一源操作数以得到修改指令之前,还进一步确定移动型指令的目标操作数非指向存放常数的目标地址,否则停止执行该调节指令流水线的方法。该存放常数的目标地址例如为零寄存器(寄存器x0,其值恒为0)。当移动型指令的目标操作数指向存放常数的目标地址,那么通常在执行之后,将导致该移动型指令的目标操作数的值将不等于该移动型指令的源操作数的值,进而使得后续的对象指令的源操作数不能采用该移动型指令的源操作数替换。例如,在该调节指令流水线的方法中,当遇到mv指令时,判断该mv指令的rd是否为寄存器x0,如果是,则不能进行操作数前递,即不(再)执行该调节指令流水线的方法,由此避免操作数前递导致的错误。
例如,在一个典型的示例中,指令序列如下:
add x0,x0,x6
mul x10,x0,x7
在上述指令序列中,虽然在先的add指令中一个源操作数指向0(即零寄存器),因此其等价于c.mv指令,但是该add指令的目标操作数也是零寄存器,而零寄存器的值恒为零,因此大部分情况下与源操作数x6(寄存器x6)的值不等。因此,虽然在后的mul指令的源操作数之一x0与在先的add指令中的目标操作数x0相同,但是也不能进行操作数前递。
例如,在至少一个实施例中,在方法100中,在将对象指令中的对象源操作数替换为移动型指令的第一源操作数以得到修改指令之前,还进一步确定移动型指令和对象指令在指令序列中执行顺序未被在先的转移指令破坏。如果移动型指令和对象指令在指令序列中执行顺序被在先的转移指令破坏,那么在指令序列执行过程中该对象指令将在移动型指令之前执行,因此二者之间并不存在操作数前递的条件,那么不能进行操作数前递,即不(再)执行该调节指令流水线的方法,由此避免操作数前递导致的错误。
例如,在一个典型的示例中,指令序列如下:
0x10 bne:a short forward branch,jump to 0x18 mul
0x14 addi x5,x6,0
0x18 mul x10,x5,x7
在上述指令序列中,连续的三条指令的取值地址分别为0x10、0x14和0x18,并且“ashort forward branch,jump to 0x18 mul”的含义为“短向前分支,跳转到地址0x18的mul指令”。排序第二的addi指令中包括立即数0,因此其等价于mv指令;排序第三的mul指令的源操作数之一x5与在先的addi指令中的目标操作数x5相同。但是,排序第一的bne指令跳转到地址0x18的mul指令,因此实际执行时,mul指令将紧接着bne指令执行,先于addi指令执行,因此addi指令和mul指令之间并不存在操作数(寄存器x6)前递的条件,不能进行操作数前递,即不(再)执行该调节指令流水线的方法。
然而,在另一个典型的示例中,指令序列如下:
0x10 bne:a short forward branch,jump to 0x1c div
0x14 addi x5,x6,0
0x18 mul x10,x5,x7
0x1c div x11,x12,x13
连续的四条指令的取值地址分别为0x10、0x14、0x18和0x1c,并且“ashortforward branch,jump to 0x1c div”的含义为“短向前分支,跳转到地址0x1c的div指令”。排序第二的addi指令中包括立即数0,因此其等价于mv指令;排序第三的mul指令的源操作数之一x5与在先的addi指令中的目标操作数x5相同。虽然排序第一为bne指令,要跳转到地址0x1c的div指令,但是addi指令和mul指令之间的顺序关系并没有受到该bne指令的影响(即没有被转移指令破坏),因此addi指令和mul指令之间仍然存在操作数(寄存器x6)前递的条件,能进行操作数前递,执行该调节指令流水线的方法。
在本公开的实施例中,在先的移动型指令与在后的对象指令无需直接相邻,二者之间可以有一条或多条其他指令(即中间指令),此时对于在不同情况下,中间指令对于能否实现操作数前递可能导致不利影响,因此需要在进行前递操作之前进行判断,避免操作数前递导致的错误。
例如,在至少一个实施例中,在方法100中,在将对象指令中的对象源操作数替换为移动型指令的第一源操作数以得到修改指令之前,还包括:接收在指令序列中位于移动型指令和对象指令之间的中间指令,其中,该中间指令包括中间目标操作数;确定中间指令的中间目标操作数与移动型指令的目标操作数不同。在该实施例中,如果中间指令的中间目标操作数与移动型指令的目标操作数相同,那么执行了移动型指令以及中间指令之后,原移动型指令的目标操作数(例如寄存器或内存地址)对应的值已经变得不再相关于(例如等于)原移动型指令的第一源操作数(例如寄存器或内存地址)对应的值,因此移动型指令和对象指令之间不再存在操作数前递的条件,不能进行操作数前递,即不(再)执行该调节指令流水线的方法,由此避免操作数前递导致的错误。
例如,在一个典型的示例中,指令序列如下:
add x5,x0,x6
div x5,x12,x13
mul x10,x5,x7
在上述指令序列中,在add指令和mul指令之间插入了div指令,div
指令作为中间指令具有对应的中间源操作数和中间目标操作数。div指令的(中间)目标操作数x5(寄存器x5)与在前的add指令的目标操作数x5相同,因此在div指令执行之后,相对于在前的add指令执行完的时刻,修改了寄存器x5的值,因此此时寄存器x5的值将与add指令的源操作数x6(寄存器x6)无关。在div指令之后的mul指令将使用寄存器x5修改后的值进行计算,因此add指令和mul指令之间不存在操作数(寄存器x6)前递的条件,不能进行操作数前递,即不(再)执行该调节指令流水线的方法,由此避免操作数前递导致的错误。
例如,在至少一个实施例中,在方法100中,在将对象指令中的对象源操作数替换为移动型指令的第一源操作数以得到修改指令之前,还包括:确定中间指令的中间目标操作数与移动型指令的第一源操作数不同。如果中间指令的中间目标操作数与移动型指令的第一源操作数相同,那么执行了移动型指令以及中间指令之后,原移动型指令的目标操作数(例如寄存器或内存地址)对应的值已经变得不再相关于(例如等于)原移动型指令的第一源操作数(例如寄存器或内存地址)对应的值,因此移动型指令和对象指令之间不再存在操作数前递的条件,不能进行操作数前递,即不(再)执行该调节指令流水线的方法,由此避免操作数前递导致的错误。
例如,在一个典型的示例中,指令序列如下:
add x5,x0,x6
div x6,x12,x13
mul x10,x5,x7
在上述指令序列中,在add指令和mul指令之间插入了div指令,div指令作为中间指令具有对应的中间源操作数和中间目标操作数。div指令的(中间)目标操作数x6(寄存器x6)与在前的add指令的(第一)源操作数x6相同,因此在div指令执行之后,相对于在前的add指令执行完的时刻,修改了寄存器x6的值,因此此时add指令的目标操作数x5(寄存器x5)的值将与add指令的源操作数x6(寄存器x6)无关。因此,add指令和mul指令之间不存在操作数(寄存器x6)前递的条件,不能进行操作数前递,即不(再)执行该调节指令流水线的方法。
本公开实施例的上述调节指令流水线的方法100不但可以应用于常规的标量CPU中,例如,在至少一个实施例中,该方法100还可以主要应用于采用超标量(superscalar)技术的CPU之中,可在同一周期内对输入的数条指令进行条件检查并前递。也可通过添加缓存栈,暂存上一周期出现的移动指令信息,从而对下一周期的数条指令进行条件检查并前递。
例如,在至少一个实施例中,对于超标量处理器(或进一步支持乱序执行的超标量处理器),在方法100中,对象指令和移动型指令属于同一个指令周期或不同指令周期。
例如,在超标量处理器中,一个指令周期会内有多条指令被解码并送入重命名单元,在寄存器重命名单元中对译码单元发来的指令(例如,微指令(uop))进行检测,检测是否有根据本公开实施例的移动型指令(例如,RISC-V指令集中的mv和c.mv指令),在存在移动指令的情形,判断在同一个周期中取指地址在后的指令或后续周期中的指令是否满足前递条件,如果满足,则执行根据本公开实施例的方法。
例如,在至少一个实施例中,对于超标量处理器(或进一步支持乱序执行的超标量处理器),在方法100中,在具有中间指令的情形,中间指令与移动型指令或对象指令属于同一个指令周期,移动型指令与对象指令属于不同的指令周期;或者,移动型指令、中间指令与对象指令分别属于不同的指令周期。
例如,在一个典型的示例中,如图4A所示,例如在四路超标量CPU中,在相邻的两个指令周期中,在前一指令周期中具有如下指令序列:
0x08 add x5,x0,x6
0x0c mul x10,x5,x7
在上述指令序列中,由于取指地址在先的add指令中一个源操作数指向0(即零寄存器),因此其等价于c.mv指令;取指地址在后的mul指令的源操作数之一x5(寄存器x5)与在先的add指令中的目标操作数x5相同,因此可以进行操作数(寄存器x6)前递,由此得到修改后的mul指令:mul x10,x6,x7。由此,可以并行执行该add指令和该修改后mul指令,而不影响mul指令的结果,改善了该指令序列在CPU中执行的效率。
例如,在一个典型的示例中,如图4B所示,例如在四路超标量CPU中,在相邻的两个指令周期中,具有如下指令序列:
0x0c add x5,x0,x6
0x14 mul x10,x5,x7
在上述指令序列中,由于在前一周期且取指地址在先的add指令中一个源操作数指向0(即零寄存器),因此其等价于c.mv指令;在后一周期且取指地址在后的mul指令的源操作数之一x5(寄存器x5)与在先的add指令中的目标操作数x5相同,因此可以进行操作数(寄存器x6)前递,由此得到修正后的mul指令:mul x10,x6,x7。由此,可以并行执行该add指令和mul指令,而不影响mul指令的结果,改善了该指令序列在CPU中执行的效率。
图4C示出了采用本公开实施例的调节指令流水线的方法的统计数据,该仿真采用四路超标量乱序CPU运行单次CoreMark程序迭代中前递成功的次数统计,并且基于统计数据,该四路超标量乱序CPU采用本公开实施例的操作数前递技术实现了4.1%的性能提升。在图4C中,箭头表示存在操作数前递,而箭头上标注数字则表示在仿真过程中操作数前递成功的次数。如图4C所示,可以看出本公开实施例的方法支持跨一个周期的前递,并且直接相邻指令的情形前递成功的次数远多于指令之间有间隔的情形,并且指令间间隔越远前递成功的次数越少,这种直接相邻指令的情形可以存在同一指令周期中也可以存在相邻指令周期中。由此可见,“中间指令”的存在将会降低前递的成功概率。
上述描述以四路超标量CPU(例如采用乱序技术)为例进行了说明,但是本公开实施例的调节指令流水线的方法并不限制于于超标量CPU的具体规格(例如二路超标量、四路超标量等)。
图5是本公开至少一实施例提出的调节指令流水线的装置的示意图,该装置200可以用于执行图2所示的方法100。
如图5所示,调节指令流水线的装置200包括指令接收单元201和指令修改单元202。例如,该调节指令流水线的装置200适用于中央处理器(CPU),该CPU可以是单核处理器或多核处理器,或者,该CPU可以是超标量CPU,例如,还可以是超标量乱序CPU。
指令接收单元201配置为接收移动型指令以及接收在指令序列中位于移动型指令之后的对象指令,其中,移动型指令包括目标操作数与第一源操作数,指示将第一源操作数指向的源地址的数据移动到目标操作数指向的目标地址,以及对象指令包括对象源操作数,指示使用对象源操作数指向的源地址进行对象操作。
指令修改单元202配置为,响应于移动型指令的目标操作数与对象指令的对象源操作数相同,将对象指令中的对象源操作数替换为移动型指令的第一源操作数以得到修改指令。
例如,在至少一个实施例中,调节指令流水线的装置200还包括执行单元203,该执行单元203配置为执行修改指令,以使用移动型指令的第一源操作数指向的源地址进行对象操作。
例如,在至少一个实施例中,指令接收单元201还配置为,在将对象指令中的对象源操作数替换为移动型指令的第一源操作数以得到修改指令之前,确定移动型指令的目标操作数非指向存放常数的目标地址。
例如,在至少一个实施例中,指令接收单元201还配置为,在将对象指令中的对象源操作数替换为移动型指令的第一源操作数以得到修改指令之前,确定移动型指令和对象指令在指令序列中执行顺序未被在先的转移指令破坏。
例如,在至少一个实施例中,指令接收单元201还配置为,在将对象指令中的对象源操作数替换为移动型指令的第一源操作数以得到修改指令之前,接收在指令序列中位于移动型指令和对象指令之间的中间指令,其中,中间指令包括中间目标操作数,以及还配置为确定中间指令的中间目标操作数与移动型指令的目标操作数不同。
例如,在至少一个实施例中,指令接收单元201还配置为,在将对象指令中的对象源操作数替换为移动型指令的第一源操作数以得到修改指令之前,接收在指令序列中位于移动型指令和对象指令之间的中间指令,其中,中间指令包括中间目标操作数,以及还配置为确定中间指令的中间目标操作数与移动型指令的第一源操作数不同。
例如,指令接收单元201、指令修改单元202和执行单元203可以采用硬件、软件、固件以及它们的任意可行的组合实现,本公开对此不作限制。
该调节指令流水线的装置200的技术效果与图2所示的调节指令流水线的方法100的技术效果相同,可以用于显著改善处理器(CPU)的性能,此处不再赘述。
本公开至少一实施例还提出了一种调节指令流水线的装置,包括:存储器,用于非暂时性存储计算机可执行指令;以及处理器,用于运行计算机可执行指令,其中,计算机可执行指令被处理器运行时执行本公开至少一实施例提出的调节指令流水线的方法。同样地,例如,该调节指令流水线的装置适用于中央处理器(CPU),该CPU可以是单核处理器或多核处理器,或者,该CPU可以是超标量CPU,例如,还可以是超标量乱序CPU。
图6示出了根据本公开实施例的数据处理设备600的示意图。如图6所示,根据本公开实施例的数据处理设备600可以包括处理装置601以及存储器602,其可以通过总线603进行互连。
处理装置601可以根据存储在存储器602中的程序或代码执行各种动作和处理。具体地,处理装置601可以是一种集成电路芯片,具有信号的处理能力。例如,上述处理装置可以是通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本公开实施例中公开的各种方法、步骤、流程及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,可以是X86架构或者是ARM架构等。
存储器602存储有计算机可执行指令,其中,计算机可执行指令在被处理装置601执行时实现本公开至少一实施例提供的调节指令流水线的方法。存储器602可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(ROM)、可编程只读存储器(PROM)、可擦除可编程只读存储器(EPROM)、电可擦除可编程只读存储器(EEPROM)或闪存。易失性存储器可以是随机存取存储器(RAM),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的RAM可用,例如静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、同步动态随机存取存储器(SDRAM)、双倍数据速率同步动态随机存取存储器(DDRSDRAM)、增强型同步动态随机存取存储器(ESDRAM)、同步连接动态随机存取存储器(SLDRAM)和直接内存总线随机存取存储器(DRRAM)。应注意,本文描述的方法的存储器旨在包括但不限于这些和任意其它适合类型的存储器。
本公开的实施例还提供了一种处理器,包括如上述的调节指令流水线的装置,并且在至少一些实施例中还可以包括取指单元、译码单元、重命名寄存器、发射单元、提交单元等。例如,该处理器可以是中央处理器(CPU),该CPU可以是单核处理器或多核处理器,或者,该CPU可以是超标量CPU,例如,还可以是超标量乱序CPU。
本公开的实施例还提供了一种计算机可读存储介质,用于非瞬时性地存储计算机可执行指令,该计算机可执行指令在被处理器执行时实现本公开至少一实施例提供的调节指令流水线的方法。
类似地,本公开实施例中的计算机可读存储介质可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。应注意,本文描述的方法的存储器旨在包括但不限于这些和任意其它适合类型的存储器。
本公开的实施例还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行根据本公开实施例的调节指令流水线的方法。
上述调节指令流水线的装置、处理器以及存储介质的技术效果与图2所示的调节指令流水线的方法100的技术效果相同,均可以用于显著改善处理器(CPU)的性能,此处不再赘述。
对于本公开,还有以下几点需要说明:
(1)本公开实施例附图只涉及到与本公开实施例涉及到的结构,其他结构可参考通常设计。
(2)在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合以得到新的实施例。
以上所述仅是本公开的示范性实施方式,而非用于限制本公开的保护范围,本公开的保护范围由所附的权利要求确定。