具体实施方式
下面仅通过示例的方式来描述本发明的实施例。这些示例代表申请人目前已知的实践本发明的最佳方式,尽管它们不是可以实现本发明的唯一方式。该描述阐述了这些示例的功能以及用于构造和操作所述示例的步骤的序列。然而,相同或等效的功能和序列可以由不同的示例实现。
本文描述的实施例涉及用于在乱序处理器中推测性地分发加载指令的方法以及加载和存储缓冲器,其利用程序不可能包括包含在存储器地址的加载之后立即到相同的存储器地址的存储的代码的认识。具体地说,在本文描述的实施例中,只有在所有较旧的未解析的存储指令(例如,其中还没有解析目的地存储器地址的存储指令)在加载指令的短窗内时,才推测性地分发加载指令。如果在这一窗的外侧存在任何较旧的未解析的存储指令,则停止加载指令。换句话说,如果解析了在所述窗外侧的所有存储指令,则可以推测性地分发所述加载指令。
本文描述的方法以及加载和存储缓冲器允许推测性地分发加载指令(例如,在解析了较旧的存储指令的存储器地址之前被分发),并且因而与不允许加载指令的推测性执行的方法相比较减少了加载指令的不必要的停止(例如,在较旧的未解析的加载指令不与加载指令写入到相同的存储器地址的情况下,该加载指令的停止)的数量。而且,它们与纯推测性方法(例如,其中推测性地分发所有加载指令的方法)相比较减少了由误推测的加载指令引起的倒回的数量,因而改善了处理器的性能。具体地说,因为程序不可能在短窗内写入到存储器地址并且然后从该存储器地址进行读取,以在这一窗中的未解析的存储指令为基础推测性地分发的加载指令不可能被误推测并且因而将引起倒回。
在一些实施例中,所述窗的尺寸被固定,并且在其它实施例中,所述窗的尺寸被动态地调整。
现在参照图1,说明了单线程乱序处理器100,其中如果所有较旧的未解析的存储指令都在加载指令的短窗内,则可以推测性地分发加载指令。处理器100包括配置为从如由程序计数器(PC)指示的程序(按照程序顺序)取出指令的取出级102以及布置为解释所述指令并且执行寄存器重命名的解码和重命名级104。
在指令经过解码和重命名级104之后,将其插入到重排序缓冲器106(ROB)中,并被分派到保留站108或加载和存储缓冲器110用于以指令的类型为基础来进行执行。例如,可以将加载和存储指令分派到加载和存储缓冲器110,并且可以将所有其它指令分派到保留站108。
重排序缓冲器106是使指令能够被乱序地执行但被有序地呈交的缓冲器。重排序缓冲器106保持按照程序顺序插入在其中的指令,但是ROB106内的指令可以由乱序管线112及加载和存储缓冲器110失序地执行。在一些示例中,重排序缓冲器106可以被形成为具有指向ROB106中的最旧的指令的头部和指向ROB106中的最新的指令的尾部的环形缓冲器。指令按照程序顺序从重排序缓冲器106输出。换句话说,当指令被乱序管线112或加载和存储缓冲器110执行时将该指令从ROB106的头部输出,并且将该头部递增到ROB106中的下一个指令。将从重排序缓冲器106输出的指令提供到呈交级114,该呈交级114将该指令的结果呈交到寄存器/存储器。
保留站108从解码和重命名级104接收指令并且将它们存储在队列中。指令在该队列中等待,直到它的输入操作数值可用为止。一旦所有指令的操作数值可用,就认为该指令准备好用于执行并且可以将其分发到乱序管线112用于执行。指令的操作数值可以在更早的、更旧的指令的操作数值之前可用,允许该指令在那些更早的、更旧的指令之前离开所述队列。乱序管线112可以访问一个或多个寄存器文件116以便执行到物理寄存器的读取和/或写入。
加载和存储缓冲器110从解码和重命名级104接收加载和存储指令(例如,从存储器地址读取或写入到存储器地址的指令)并且将它们分别存储在加载和存储缓冲器中。加载指令在加载缓冲器中等待,直到它的源存储器地址被解析为止。一旦加载指令的源存储器地址被解析,就认为该指令准备好并且可以被分发到数据高速缓存118。将分发到数据高速缓存118的任何加载的结果返回到加载和存储缓冲器110,该加载和存储缓冲器又将该结果写入到适当的寄存器文件116。在本文描述的实施例中,加载和存储缓冲器110配置为如果所有较旧的未解析的存储指令在加载指令的短窗内则将加载指令推测性地分发到数据高速缓存118。
在一些情况下,可以不将存储指令分发到数据高速缓存118,直到它的目的地存储器地址被解析并且它由重排序缓冲器106呈交到呈交级114为止。这是因为,在存储指令被呈交之前,存在它可能由于较旧的指令的倒回而被冲掉的机会。具体地说,如果存储指令在呈交时间之前被分发到数据高速缓存118并且接着随后被冲掉,则由存储指令118对数据高速缓存进行的更新不能够被撤销。而且,使存储指令的分发延迟直到呈交时间为止不引起从相同的存储器地址读取的加载指令的延迟,因为能够从存储缓冲器获得满足加载指令的数据。另一方面(如上所述),只要加载准备好,它们就可以被分发,因为它们不更新数据高速缓存118。因此,如果它们被倒回,则不存在需要被撤销的更新。
参照图2来描述示例性加载和存储缓冲器110。
处理器100还可以包括分支预测器120,该分支预测器120配置为在诸如分支指令的被已知引起可能的流改变的指令的情况下预测程序流将采取哪个方向。分支预测是有用的,因为它能够使指令在分支指令的结果已知之前由处理器100推测性地执行。分支预测器120可以从取出级102以及解码和重命名级104接收与新指令有关的输入,并且从乱序管线112以及加载和存储缓冲器110接收与执行的指令有关的输入。
当分支预测器120精确地预测程序流时,这改善了处理器100的性能。然而,如果分支预测器120没有正确地预测分支方向,则发生误预测,这需要在程序能够继续之前进行校正。为了校正误预测,发送到ROB106的推测性指令被丢弃,并且取出级102开始从正确的程序分支取出指令。
现在参照图2,说明了图1的示例加载和存储缓冲器110。如上面参照图1描述的,加载和存储缓冲器110负责从解码和重命名级104接收加载和存储指令,并且将它们存储在各自的加载和存储缓冲器中,直到它们准备好用于分发为止。如上所述,加载指令可以在其源存储器地址被解析时准备好用于分发,并且存储指令可以在其目的地存储器地址被解析并且被呈交级114呈交时准备好用于分发。一旦加载指令准备好用于分发,加载和存储缓冲器110就将该加载指令分发到数据高速缓存118,(i)如果在存储缓冲器中不存在较旧的未解析的存储指令;或者(ii)如果所有较旧的未解析的存储指令在加载指令的短窗内;并且加载指令不能够被存储缓冲器中的存储指令解析(例如,在存储缓冲器中不存在写入到在加载指令中指定的存储器地址的较旧的存储指令)。这一短窗将在本文中被称为推测窗。
图2的加载和存储缓冲器110包括用于存储从解码和重命名级104接收的加载指令的加载缓冲器202,用于存储从解码和重命名级104接收的存储指令的存储缓冲器204,以及用于当存储在加载和存储缓冲器202和204中的加载和存储准备好用于分发时将它们分发到数据高速缓存118的加载和存储逻辑单元206。在一些情况下,加载缓冲器202、存储缓冲器204或者加载和存储缓冲器202和204二者可以被实现为具有头部和尾部的环形缓冲器。
加载缓冲器202从解码和重命名级104接收加载指令并且对它们进行存储,直到它们被分发到数据高速缓存118或者它们被重写为止。加载缓冲器202可以配置为包括多个行208-212和列214-222的表。例如,如图2所示,加载缓冲器202可以包括对于缓冲器中的每一个加载指令的多个行208-212以及ROBID列214、存储器地址列216、存储器地址有效列218、目的地寄存器号码列220和状态列222。尽管图2的示例加载缓冲器202包括五个列214-222,但是其它实施例可以具有更多、更少和/或不同的列。
ROBID列214用于存储加载指令的ROBID。使用ROBID来索引ROB106中的每一个条目/行。因为将每一个指令插入在ROB106中,因此每一个指令被分配指定该指令在ROB106中的位置或时隙的ROBID。因为指令按照程序顺序被存储在ROB106中并且因而ROBID按照程序顺序被分配,ROBID可以用于识别与彼此有关的指令的顺序。每一个加载指令的ROBID连同加载指令一起被解码和重命名级104典型地提供到加载和存储缓冲器110。
存储器地址列216用于存储由加载指令读取的存储器地址。存储器地址典型地不由解码和重命名级104提供到加载和存储缓冲器110。因此,当从解码和重命名级104接收到加载指令时,认为存储器地址是未被解析的。存储器地址随后被解析并存储在存储器地址列216中。在一些情况下,存储器地址可以由乱序管线112解析。在其它情况下,存储器地址可以由加载和存储缓冲器110解析。例如,加载和存储缓冲器110可以包括地址生成单元(未示出),一旦源寄存器准备好被读取,该地址生成单元就生成或解析存储器地址。
地址生成单元可以在它从乱序管线112接收到源寄存器准备好被读取的指示时确定该源寄存器准备好被读取。具体地说,乱序管线112可以配置为当它检测到写入到特定的物理寄存器的指令正在被执行时将特定的物理寄存器准备好被读取的指示发送到保留站108以及加载和存储缓冲器110。
存储器地址有效列218用于指示存储器地址列216中的数据是否有效。存储器地址有效列218可以按照任何适当的方式实现。例如,在一些情况下,存储器地址有效列218可以被实现为单个位,并且在其它情况下,存储器地址有效列218可以被实现为布尔值。因为在创建行时(例如,在从解码和重命名级104接收到加载指令时)存储器地址典型地是未知的,因此可以初始设置存储器地址有效列218(例如,为“0”或“假”)以便指示存储器地址列216中的数据无效。一旦存储器地址被解析并且存储在存储器地址列216中,该存储器地址有效列218就可以被更新(例如,为“1”或“真”)以便指示存储器地址列216中的数据有效。
目的地寄存器号码列220用于存储物理寄存器的号码,其中要存储从在存储器地址列216中识别的存储器地址获得的数据。
状态列222可以用于指示加载指令的当前状态。在一些情况下,每一个指令可以被分配下列状态中的一个:分发和未分发。在这些情况中,当从解码和重命名级104接收到加载指令时,可以将该状态设置为“未分发”。一旦被分发到数据高速缓存118,就可以将该状态改变为“分发”。
存储缓存器204从解码和重命名级104接收存储指令,并且对它们进行存储,直到它们被分发到数据高速缓存118或者被重写为止。与加载缓冲器202类似,存储缓冲器204可以配置为包括多个行224-228和列230-242的表。例如,如图2所示,存储缓冲器204可以包括对于缓冲器中的每一个存储指令的行224-228以及ROBID列230、存储器地址列232、存储器地址有效列234、源寄存器号码列236、源数据列238、源数据有效列240和状态列242。尽管图2的示例存储缓冲器204包括七个列,但是其它实施例可以具有更多、更少和/或不同的列。
ROBID列230用于存储所述存储指令的ROBID。
存储器地址列232用于存储将被存储指令写入到的存储器地址。存储器地址典型地不被解码和重命令级104提供到加载和存储缓冲器110。因此,当从解码和重命名级104接收到存储指令时,认为存储器地址未被解析。存储器地址随后被解析并且存储在存储器地址列232中。在一些情况下,存储器地址可以由乱序管线112解析。在其它情况下,存储器地址可以由加载和存储缓冲器110解析。例如,加载和存储缓冲器110可以包括地址生成单元(未示出),一旦源寄存器准备好被读取,该地址生成单元就生成或解析存储器地址。
存储器地址有效列234用于指示存储器地址列232中的数据是否有效。存储器地址有效列234可以按照任何适当的方式实现。例如,在一些情况下,存储器地址有效列234可以被实现为单个位,并且在其它情况下,存储器地址有效列234可以被实现为布尔值。因为在创建行时(例如,在从解码和重命名级104接收到存储指令时)存储器地址典型地是未知的,因此可以初始设置存储器地址有效列234(例如,为“0”或“假”)以便指示存储器地址列232中的数据无效。一旦存储器地址被解析并且存储在存储器地址列232中,存储器地址有效列234就可以被更新(例如,为“1”或“真”)以便指示存储器地址列232中的数据有效。
源寄存器号码列236包括物理寄存器的号码,包含要被写入到在存储器地址列232中识别的存储器地址的数据。
源数据列238用于存储要被写入到在存储器地址列232中指定的存储器地址的来自在源寄存器号码列236中指定的源寄存器的数据。源数据典型地不被解码和重命令级104提供到加载和存储缓冲器110。因此,当从解码和重命名级104接收到存储指令时,源数据是未知的。加载和存储逻辑单元206可以配置为一旦它从乱序管线112接收到源寄存器准备好被读取的指示就随后从在源寄存器号码列236中指定的源寄存器号码获得源数据。如上面参照图1描述的,乱序管线112可以配置为当它检测到正在执行写入到特定的物理寄存器的指令时向保留站108以及加载和存储缓冲器110发送该特定的物理寄存器准备好被读取的指示。
源数据有效列240用于指示源数据列238中的数据是否有效。源数据有效列240可以按照任何适当的方式实现。例如,在一些情况下,源数据有效列240可以被实现为单个位,并且在其它情况下,源数据有效列240可以被实现为布尔值。因为在创建行时(例如,在从解码和重命名级104接收到存储指令时)源数据典型地不是已知的,因此可以初始设置源数据有效列240(例如,为“0”或“假”)以便指示源数据列238中的数据无效。一旦源数据被获得并存储在源数据列238中,源数据有效列240就可以被更新(例如,为“1”或“真”)以便指示源数据列238中的数据有效。
在其它示例中,存储缓冲器204可以不包括如图2所示的源数据和源数据有效列238和240。在这些示例中,加载和存储逻辑单元206可以配置为当存储指令被选择用于分发到数据高速缓存118时从寄存器文件116获得源数据。这允许与其中存储缓冲器包括源数据和源数据有效列238和240的情况相比较,存储缓冲器204更小。
状态列242可以用于指示存储指令的当前状态。在一些情况下,每一个存储指令可以被分配下列状态中的一个:分发和未分发。在这些情况中,当从解码和重命名级104接收到存储指令时,可以将该状态初始设置为“未分发”。一旦被分发到数据高速缓存118,就可以将该状态改变为“分发”。
加载和存储逻辑单元206负责将准备好的加载和存储指令分发到数据高速缓存118。在一些情况下,在任何周期中,仅一个加载或存储指令能够被分发到数据高速缓存118。在这些情况下,在每一个时钟周期,加载和存储逻辑单元206浏览加载和存储缓冲器202和204以便确定是否存在任何准备好的加载和/或存储。如上所述,在加载指令的源存储器地址被解析时认为该加载指令准备好,并且在存储指令的目的地存储器地址被解析且它由呈交级114呈交时被认为该存储指令准备好。在存在准备好的加载指令和准备好的存储指令二者的情况下,加载和存储逻辑单元206可以使用用于决定是否分发加载或存储的任何适当的手段。通常,加载指令将被给予优先级。然而,在一些情况下,加载和存储逻辑单元206可以配置为如果满足某些条件(例如,存储缓冲器204变满)则将优先级给予存储指令。
如果决定加载指令将被分发到数据高速缓存118,则加载和存储逻辑单元206可以(1)从加载缓冲器202选择准备好的加载指令中的一个以便进行分发;以及(2)确定选择的加载指令是否应该被推测性地分发。在一些情况下,加载和存储逻辑单元206可以配置为从加载缓冲器202选择最旧的准备好的加载指令。
如果在存储缓冲器204中存在比加载指令更旧且未被解析的任何存储指令(例如,目的地存储器地址未知或未被解析),则认为加载指令被推测性地分发。在一些情况下,如果存储缓冲器204中的所有较旧的未解析的存储指令在加载指令的推测窗内,则加载指令仅被推测性地分发到数据高速缓存118。这以程序不可能包括将数据存储到存储器地址并且不久之后从相同的存储器地址读取数据的代码的认识为基础。
在一些情况下,推测窗可以覆盖紧接着在加载指令之前的多个指令。例如,推测窗可以被定义为覆盖紧接着在加载指令之前的八个指令。在这些情况下确定存储缓冲器204中的所有较旧的未解析的存储指令是否在推测窗内可以包括:(i)将推测窗的开始定义为与紧接着在加载指令之前的指令相关联的ROBID;(ii)将推测窗的结束定义为与紧接着在加载指令之前的第X个指令相关联的ROBID,其中X是推测窗的尺寸;以及(iii)将存储缓冲器204中未解析的存储指令的ROBID与推测窗的开始和结束进行比较以便确定存储缓冲器204中所有较旧的未解析的存储指令是否在推测窗内。
如果存储缓冲器204中所有较旧的未解析的存储指令在推测窗内,则加载指令可以被推测性地分发到数据高速缓存。如果存储缓冲器204中存在位于推测窗外侧的至少一个较旧的未解析的存储指令,则加载指令可以被停止。参照图4描述用于根据这些原理分发加载指令的示例方法。
在其它情况下,推测窗可以覆盖紧接着在加载指令之前的多个存储指令。例如,推测窗可以被定义为覆盖紧接着在加载指令之前的两个存储指令。在这些情况下确定存储缓冲器204中所有较旧的未解析的存储指令是否在推测窗内可以包括:(i)使用加载指令的ROBID来识别存储缓冲器204中紧接着在加载指令之前的X个存储指令,其中X是推测窗的尺寸;以及(ii)确定存储缓冲器204中是否存在比识别的指令更旧的任何未解析的存储指令。
如果在存储缓冲器204中不存在比识别的存储指令更旧的未解析的存储指令,则加载指令可以被推测性地分发到数据高速缓存118。如果存储缓冲器204中存在比识别的存储指令更旧的至少一个未解析的存储指令,则加载指令可以被停止。
在一些情况下,推测窗尺寸被固定。在其它情况下,推测窗尺寸被动态地调整。例如,可以以由被推测性分发的加载指令引起的倒回的数量和/或加载指令的不必要的停止的数量为基础来调整推测窗尺寸。参照图5描述用于动态地调整推测窗尺寸的示例方法。
可以使用任何适当的硬件来实现加载缓冲器202、存储缓冲器204及加载和存储逻辑单元206。
现在参照图3,说明了程序代码302、ROB106和存储缓冲器204之间的关系的示意图。图3的示例程序代码302包括两个示例存储指令304和306及一个示例加载指令308。第一示例存储指令304指定寄存器二中的数据将被存储在由寄存器一中的数据指定的存储器地址处。类似地,第二示例存储指令306指定寄存器四中的数据将被存储在由寄存器三中的数据指定的存储器地址处。示例加载指令308指定来自由寄存器六中的数据指定的存储器地址的数据将被加载到寄存器五中。
如上面参照图1描述的,程序中的每一个指令按照程序顺序由取出级102取出并被提供到解码和重命名级104。在执行解码和重命名之后,解码和重命名级104向ROB106提供每一个解码和重命名的指令,该指令连同ROBID一起按照程序顺序被存储在ROB106中。在图3所示的示例中,第一存储指令304被分配ROBID0010,第二存储指令306被分配ROBID0101,并且加载指令308被分配ROBID1000。
解码和重命名级104还将任何存储和加载指令提供或分派到加载和存储缓冲器110用于执行。加载和存储缓冲器110将任何接收到的加载指令存储在加载缓冲器202中并将任何接收到的存储指令存储在存储缓冲器204中。如上面关于图2描述的,当从解码和重命名级104接收/分派加载/存储指令时,相对应的存储器地址典型地是未知的,并且因而被认为未被解析。存储器地址稍后由乱序管线112或加载和存储缓冲器110解析并且被存储在加载或存储缓冲器202或204中。在一些情况下,具有未解析的存储器地址的存储指令可以由存储缓冲器204的存储器地址有效列234识别。具体地说,当存储器地址有效列234指示存储器地址列232中的数据不是有效的时,该存储指令的存储器地址是未解析的。
在图3所示的示例中,第一和第二存储指令304和306二者都被存储在存储缓冲器204中,但是它们二者都具有未解析的存储器地址(如由存储器地址有效列中的数据指示的)。
一旦加载指令的存储器地址被解析并且被存储在加载缓冲器202中,该加载指令就准备好被分发到数据高速缓存118。然而,不认为存储指令准备好分发到数据高速缓存118,直到该存储指令的存储器地址被解析且被存储在存储缓冲器204中并且该存储指令被呈交级114呈交为止。如上面参照图2描述的,一旦加载指令准备好用于分发,加载和存储逻辑单元206就可以确定它是否应该以存储缓冲器204中未解析的存储指令(例如,具有未解析的存储器地址的存储指令)为基础而被分发。在一些情况下,如果存储缓冲器204中所有较旧的未解析的存储指令在加载指令的推测窗310内,则准备好的加载指令就可以仅被推测性地分发到数据高速缓存。
如参照图2描述的,在一些情况下,推测窗310被定义为覆盖紧接着在加载指令之前的某个数量(X)的指令。在这些情况下,窗可以被定义为包括紧接着在加载指令之前的X个指令。可以以加载指令的ROBID和数量X为基础来确定窗。在图3所示的示例中,加载指令的ROBID为1000,并且X为五,因而推测窗310包含与ROBID0011到0111相关联的指令。
一旦推测窗310被定义,确定存储缓冲器204中所有未解析的存储指令是否在推测窗内就可以包括将较旧的未解析的存储指令的ROBID与所定义的推测窗310进行比较。如果存储缓冲器204中不存在较旧的未解析的存储指令,则加载指令可以被非推测性地分发到数据高速缓存。如果存储缓冲器204中所有较旧的未解析的指令在推测窗310中,则加载指令可以被推测性地分发到数据高速缓存。然而,如果存储缓冲器204中存在位于推测窗310外侧的至少一个较旧的未解析的指令,则加载指令被停止,直到推测窗310外侧的较旧的未解析的存储指令被解析为止。
在图3所示的示例中,如果第一和第二存储指令304和306二者都被解析,则加载指令308可以被非推测性地分发到数据高速缓存;如果第一存储指令304被解析但是第二存储指令306没有被解析(因为第二存储指令306(ROBID0101)位于推测窗0011到0111中),则加载指令308可以被推测性地分发到数据高速缓存;并且如果第一存储指令304未被解析,则加载指令308可以被停止,而与第二存储指令306的状态无关(因为第一存储指令304(ROB010)位于推测窗0011到0111外侧)。
现在参照图4,说明了方法400,其可以由图2的加载和存储逻辑单元206执行,用于将加载指令分发到数据高速缓存。在步骤402,加载和存储逻辑单元206从加载缓冲器202选择准备分发的加载指令。当它正在从其读取的存储器地址被解析时,认为加载指令准备好用于分发。如上面参照图2描述的,在一些情况下,加载和存储逻辑单元206可以选择最旧的准备好的加载指令。在其它情况下,加载和存储逻辑单元206可以使用用于选择准备好的加载指令中的一个的其它准则。一旦选择了加载指令,方法400就继续进行到步骤404。
在步骤404,确定存储缓冲器204中是否存在比在步骤402中选择的加载指令更旧的任何未解析的存储指令。如上所述,未解析的存储指令是其目的地存储器地址未被解析的存储指令。确定存储指令是否是未解析的存储指令可以包括分析存储缓冲器204的存储器地址有效列。例如,如果存储器地址有效列指示存储器地址列中的数据无效,则可以确定存储指令是未解析的存储指令。
确定未解析的存储指令是否比加载指令更旧可以包括将未解析的存储指令的ROBID与加载指令的ROBID进行比较。
如果确定存储缓冲器204中不存在比选择的加载指令更旧的未解析的存储指令,则方法400继续进行到步骤406,其中加载指令被非推测性地分发。然而,如果确定存储缓冲器204中存在比选择的加载指令更旧的至少一个未解析的存储指令,则该方法继续进行到步骤408。
在步骤406,将在步骤402中选择的加载指令分发到数据高速缓存118。一旦加载指令被分发,方法400就结束。
在步骤408,确定存储缓冲器204中最旧的未解析的存储指令是否在加载指令的推测窗(例如,窗310)中。在推测窗内的任何存储指令不可能与加载指令正在写入到相同的存储器地址,因而如果存储缓冲器204中的最旧的未解析的存储指令在推测窗中,则加载指令可以被推测性地分发。比加载指令更旧并且在窗外侧的任何存储指令具有与加载指令写入到相同的存储器地址的增加的机会,因而如果存储缓冲器204中存在位于推测窗外侧的至少一个较旧的未解析的存储指令,则加载指令被停止。
推测窗的尺寸可以被固定或者可以被动态地调整。例如,结果显示:包括先前的八个指令的推测窗消除了大多数不必要的停止。因此,在一些情况下,推测窗的尺寸可以被固定在例如八个指令。参照图5描述用于动态地调整推测窗的尺寸的示例方法。
在一些情况下,确定最旧的未解析的存储指令是否在推测窗内可以包括:(i)将推测窗的开始识别为与紧接着在加载指令之前的指令相关联的ROBID(例如,加载指令的ROBID-1);(ii)将该窗的结束识别为与紧接着在加载指令之前的第X个指令相关联的ROBID,其中X是推测窗的尺寸(例如,加载指令的ROB-X);以及(iii)将存储缓冲器204中的存储指令的ROBID与推测窗的开始和结束进行比较以便确定它们是否位于推测窗中。
因为ROB106可以被实现为环形缓冲器,因此在步骤(i)和(ii)中执行的推测操作会使ROBID绕回。例如,如果加载指令的ROBID为0001,X等于四,并且最后的ROBID为1111,则推测窗的开始可以是ROBID0000并且推测窗的结束可以是ROBID1101。在另一示例中,如果加载指令的ROBID为0110,X等于五,并且最后的ROBID为1111,则推测窗的开始可以是ROBID0101并且推测窗的结束可以是ROBID0001。在表1中说明了这些示例。
表1
在其它情况下,确定最旧的未解析的存储指令是否在推测窗内可以包括:(i)使用加载指令的ROBID以便识别存储缓冲器204中紧接着在加载指令之前的X个存储指令,其中X是推测窗的尺寸;以及(ii)确定存储缓冲器204中是否存在比所识别的指令更旧的任何未解析的存储指令。
如果确定存储缓冲器204中最旧的未解析的存储指令在推测窗中,则该方法继续进行到步骤406,其中在步骤402中选择的加载指令被推测性地分发到数据高速缓存。然而,如果确定最旧的未解析的存储指令在推测窗外侧,则方法400继续进行到步骤410,其中在步骤402中选择的加载指令被停止。如果加载指令被停止,则它不符合条件被分发,直到在推测窗外侧的所有存储指令被解析为止。
在一些情况下,在步骤406中将加载指令分发到数据高速缓存之前,加载和存储逻辑单元206可以配置为首先确定加载指令是否能够由存储缓冲器204中的数据解析。如果存储缓冲器204中存在写入到由加载指令读取的存储器地址的任何较旧的被解析的存储指令,则加载和存储逻辑单元206可以确定加载指令能够被存储缓冲器204中的数据解析。如果存储缓冲器204中存在写入到由加载指令读取的存储器地址的至少一个较旧的被解析的存储指令,则加载和存储逻辑单元206可以配置为使用最新的被解析的存储指令的源数据,而不是将存储指令分发到数据高速缓存118。这一数据可以接着随后按照惯例被提供到寄存器文件116。
例如,参照图2,具有ROBID1001的加载指令从存储器地址0x80218048进行读取,并且具有ROB0011的存储指令写入到相同的存储器地址。因此,不是将这一加载指令分发到数据高速缓存,存储指令0011的源数据列238中的源数据可以用于满足该加载指令。在源数据当前可用(如由源数据有效列指示的)的情况下,来自源数据列238的数据可以被立即提供到寄存器文件116。然而,在源数据不可用(如由源数据有效列指示的)的情况下,加载指令可以被停止,直到源数据可用为止。
如上所述,已经识别出程序不可能包括包含在存储器地址的存储之后立即到相同的存储器地址的加载的代码。对此的一个例外是函数返回。具体地说,在函数返回周围的代码可以将数据存储在以后不久被读取(加载)的存储器地址中。具体地说,函数可能已经将一些数据存储在它想要返回到函数调用程序的存储器位置中。在这一情况下,该函数将写入到存储器位置,并且可以接着执行函数返回,该函数返回可以紧密地跟随有将数据从相同的存储器位置读取回的调用程序代码。
因此,在一些实施例中,如果在加载指令的函数窗内的指令中不存在函数返回,则加载指令可以仅被推测性地分发(例如,在较旧的存储指令的存储器地址被解析之前被分发)。这一函数返回方法可以与上面描述的推测窗方法单独地使用或者结合该推测窗方法来使用。例如,在一些情况下,在执行方法400之前,加载和存储逻辑单元206可以配置为首先确定在加载指令的函数窗内的指令中是否存在函数返回。函数窗可以被定义为在加载指令之前的多个指令,其中具有函数返回不是可接受的。函数窗的尺寸可以被固定;被动态地确定(例如,按照参照图5描述的用于动态地调整推测窗的尺寸的方式类似的方式);或者(其中结合上面描述的推测窗方法被使用)是推测窗的尺寸的函数(例如,推测窗的尺寸的60%或者比推测窗的尺寸更小的四个指令)。在函数窗的尺寸是推测窗的尺寸的函数并且推测窗的尺寸被动态地确定的情况下,当推测窗被调整时,函数窗的尺寸可以被动态地调整。
在一些情况下,解码和重命名级104可以配置为给加载和存储缓冲器110提供它检测到的每一个函数返回的ROBID。加载和存储缓冲器110可以接着将这些ROBID存储在单独的函数返回表中。接着,不是执行方法400或者在方法400的执行之前,加载和存储逻辑单元206可以配置为确定函数返回表中的任何函数返回是否在函数窗内。如果在函数窗内存在函数返回,则加载指令被停止,直到所有较旧的存储指令(即,在程序中的加载指令之前的存储指令)被解析为止。然而,如果在函数窗内不存在函数返回,则加载指令可以被推测性地分发或者方法400可以被执行以便确定加载是否将被推测性地分发或停止。
对于程序不可能包括包含到存储器地址的存储之后立即到相同的存储器地址的加载的代码的概念的其它例外,可以实现类似的逻辑。
现在参照图5,说明了用于动态地调整在方法400中使用的推测窗的尺寸的方法500。在一些情况下,可以以倒回的数量、不必要的停止的数量或倒回的数量和不必要的停止的数量二者为基础来调整推测窗的尺寸。
在步骤502,加载和存储逻辑单元206获得对于当前时钟周期的度量数据。在一些情况下,度量数据是与在当前时钟周期中发生的被推测性地执行的加载指令有关的倒回的数量。例如,加载和存储逻辑单元206可以配置为对与每时钟周期被推测性地执行的加载指令有关的倒回的数量进行计数并且记录。在其它情况下,度量数据可以是在当前时钟周期中发生的不必要的加载停止的数量。例如,加载和存储逻辑单元206可以配置为对每时钟周期不必要的加载指令停止的数量进行计数并且记录。
在又一些其它情况下,加载和存储逻辑单元206可以配置为对倒回的数量和停止的数量二者进行计数。在又一些其它情况下,度量数据可以是在当前时钟周期中倒回的数量和停止的数量的组合。例如,度量数据(被称为组合的度量数据)可以根据公式(1)进行计算,其中A和B分别是以倒回的成本和停止的成本为基础的权重。
度量数据=A*倒回的数量-B*停止的数量(1)
一旦获得了度量数据,方法500就继续进行到步骤504。
在步骤504,使用在步骤502中获得的数据来更新重新调整尺寸的度量。在一些情况下,重新调整尺寸的度量可以是由于被推测性地分发的加载指令而发生的倒回的数量的总计数。在这些情况下,更新重新调整尺寸的度量可以包括将在步骤502中获得的度量数据添加到倒回计数器。在其它情况下,重新调整尺寸的度量可以是不必要的加载停止的数量的总计数。在这些情况下,更新重新调整尺寸的度量可以包括将度量数据添加到停止计数器。在又一些其它情况下,重新调整尺寸的度量(被称为第一组合的重新调整尺寸的度量)可以是在步骤502中计算的组合的度量数据的总计数。在这些情况下,更新重新调整尺寸的度量可以包括将度量数据添加到组合的度量计数器。
在又一些其它情况中,加载和存储逻辑单元206可以配置为跟踪倒回的总数量和停止的总数量二者。在这些情况中的一些中,倒回的总数量和停止的总数量中的一个可以是重新调整尺寸的度量并且另一个可以在步骤506中用于确定何时到调整推测窗的时间。在这些情况的其它情况中,重新调整尺寸的度量(被称为第二组合的重新调整尺寸的度量)可以以倒回的总数量和停止的总数量为基础。例如,重新调整尺寸的度量可以根据公式(2)进行计算,其中A和B分别是以倒回的成本和停止的成本为基础的权重。
重新调整尺寸的度量=A*倒回的总数量-B*停止的总数量(2)
一旦更新了重新调整尺寸的度量,方法500就继续进行到步骤506。
在步骤506,确定是否到了调整推测窗的尺寸的时间。在一些情况下,确定是否到了调整推测窗的尺寸的时间包括确定自从最后一次调整以来是否发生了预定数量的周期。在这些情况下,预定数量的周期被选择得足够大以便赶上倒回的不可接受的数量或者不必要的停止。在一些情况下,有用的预定数量的周期可以是100或更大。
在其它情况下,确定是否到了调整推测窗的尺寸的时间可以包括确定是否发生了预定数量(例如八个)的倒回。在又一些其它情况下,确定是否到了调整推测窗的尺寸的时间可以包括确定是否发生了预定数量的停止。
如果确定到了调整推测窗的尺寸的时间,则方法500继续进行到步骤508。如果确定还没有到调整推测窗的尺寸的时间,则方法500继续回到步骤502。
在步骤508,确定重新调整尺寸的度量(例如,倒回计数器;停止计数器;第一组合的重新调整尺寸的度量;或者第二组合的重新调整尺寸的度量)是否在低阈值之下。低阈值可以被硬编码或固定,或者它可以由程序进行设置。例如,在一些情况下,可以存在程序设计人员可以经由程序将低阈值写入到其中的控制寄存器。在一些情况下,低阈值可以以在步骤506中使用的周期的预定数量为基础。在一些情况下,周期的预定数量越高,低阈值就越高。例如,在周期的预定数量为1,000的情况下,低阈值可以是一个倒回或停止。如果重新调整尺寸的度量低于该低阈值,则方法500继续进行到步骤510。然而如果重新调整尺寸的度量高于或等于该低阈值,则方法500继续进行到步骤512。
在步骤510,推测窗尺寸被调整。在重新调整尺寸的度量是倒回的总数量的情况下,倒回的低数量可以指示系统不是充分推测性的,并且因此可以增加推测窗尺寸。在重新调整尺寸的度量是停止的总数量的情况下,停止的低数量可以指示系统是过于推测性的,并且因此可以减小推测窗。在重新调整尺寸的度量是组合的度量(例如第一组合的重新调整尺寸的度量或第二组合的重新调整尺寸的度量)中的一个的情况下,正数可以指示系统是过于推测性的,并且负数可以指示系统不是充分推测性的。因此,如果组合的重新调整尺寸的度量低于该低阈值,则可以增加推测窗。
在一些情况下,以单个指令或单个存储指令来增加或减小推测窗尺寸。在其它情况下,可以以多于一个指令或多于一个存储指令来增加或减小推测尺寸。一旦调整了推测窗尺寸,方法500就继续进行到步骤516。
在步骤512,确定重新调整尺寸的度量(例如,倒回计数器;停止计数器;第一组合的重新调整尺寸的度量;或者第二组合的重新调整尺寸的度量)是否在高/上阈值之上。该高阈值可以被硬编码或固定,或者它可以由程序设置。例如,在一些情况下,可以存在程序设计人员可以经由程序将高阈值写入到其中的控制寄存器。在一些情况下,高阈值可以以在步骤506中使用的周期的预定数量为基础。典型地,周期的预定数量越高,高阈值就越高。例如,在周期的预定数量为1,000的情况下,高阈值可以是两个倒回或停止。在一些情况下,高阈值和低阈值可以相同。在其它情况下,高阈值和低阈值可以不同。
如果重新调整尺寸的度量高于上阈值,则方法500继续进行到步骤514。然而,如果重新调整尺寸的度量低于或等于上阈值,则方法500继续进行到步骤516。
在步骤514,推测窗尺寸被调整。在重新调整尺寸的度量是倒回的总数量的情况下,倒回的高数量可以指示系统是过于推测性的,并且因此推测窗尺寸可以减小。在重新调整尺寸的度量是停止的总数量的情况下,停止的高数量可以指示系统不是充分推测性的,并且因此推测窗尺寸可以增加。在重新调整尺寸的度量是组合的度量(例如第一组合的重新调整尺寸的度量或第二组合的重新调整尺寸的度量)中的一个的情况下,正数可以指示系统是过于推测性的,而负数可以指示系统不是充分推测性的。因此,如果组合的重新调整尺寸的度量高于高阈值,则推测窗可以减小。
在一些情况下,可以以单个指令或单个存储指令来增加或减小推测窗尺寸。在其它情况下,可以以多于一个指令或存储指令来增加或减小推测窗尺寸。一旦调整了推测窗尺寸,方法500就继续进行到步骤516。
在步骤516,重新调整尺寸的度量被重置(例如,总倒回计数器、总停止计数器或第一/第二组合的重新调整尺寸的度量被重置(即,归零))。一旦重置了重新调整尺寸的度量,方法就继续回到步骤502。
尽管本文描述的示例涉及单线程乱序处理器,但是本文描述的方法和原理可以同样适用于多线程乱序处理器。
现在参照图6,说明了多线程乱序处理器600的示意图。处理器600包括两个线程602和604,在本文将被分别称为线程0和线程1。每一个线程602和604包括如上面参照图1描述的取出级606或608、解码和重命名级610或612、重排序缓冲器614或616、呈交级618或620以及分支预测器622或624。线程602和604共享如上面参照图1描述的一个或多个保留站626、乱序管线628、加载和存储缓冲器630、数据高速缓存632以及一个或多个寄存器文件634。
在线程602和602在统一的存储器空间中操作(即,不存在划分或隔离线程602和604之间的存储器空间的存储器单元等等)的情况下,加载和存储缓冲器630可以配置为在分发加载指令之前考虑来自线程602和604二者的存储指令。然而,在其中存在不同的线程602和604的存储器区域的隔离的情况下,加载和存储缓冲器630可以配置为仅考虑与特定的加载指令相关联的线程相关联的存储指令。例如,加载和存储缓冲器630可以配置为仅考虑对于与线程0相关联的加载指令与线程0相关联的存储指令。
在不失去所寻求的效果的情况下,可以扩展或者改变本文给出的任何范围或设备值,这对于本领域的普通技术人员来说是显而易见的。
将理解,上面描述的益处和优点可以涉及一个实施例或者可以涉及几个实施例。所述实施例并不局限于解决任一或所有陈述的问题的实施例或具有任一或所有陈述的益处和优点的实施例。
对“一”项目的任何提及指代那些项目中的一个或多个。术语“包括”在本文中用于意指包括所识别的方法块或元件,但是这样的块或元件不包括排它性的列表,并且装置可以包含附加的块或元素以及方法可以包含附加的块或操作。而且,块、元件和操作本身不被隐含地闭合。
存储用于在实现所公开的方面中使用的机器可执行数据的存储器可以是非暂态介质。非暂态介质可以是易失性或非易失性的。易失性非暂态介质的示例包括基于半导体的存储器,例如SRAM或DRAM。可以用于实现非易失性存储器的技术的示例包括光和磁存储器技术、闪存、相变存储器、电阻性RAM。
对“逻辑”的特定提及指代执行一种或多种功能的结构。逻辑的示例包括布置为执行那些功能的电路。例如,这样的电路可以包括在制造过程中可用的晶体管和/或其它硬件元件。这样的晶体管和/或其它元件可以用于形成实现和/或包含通过示例的方式的下列部件的电路或结构:诸如寄存器、触发器或者锁存器的存储器,诸如布尔运算的逻辑运算器,诸如加法器、乘法器或移位器的数学运算器以及互连。这样的元件可以被提供为定制电路或标准单元库、宏或其它级别的抽象。这样的元件可以在特定的布置中互连。逻辑可以包括具有固定功能的电路,并且电路可以被编程以便执行一种或多种功能;这样的编程可以从固件或软件更新或者控制机制提供。被识别为执行一种功能的逻辑还可以包括实现构成的功能或子过程的逻辑。在示例中,硬件逻辑具有实现一种或多种固定功能操作、状态机或过程的电路。
本文描述的方法的步骤可以在合适时按照任何适当的顺序或同时被执行。此外,在不偏离本文描述的主题的精神和范围的情况下,可以将单独的块从任何方法删除。在不失去所寻求的效果的情况下,可以将上面描述的任何示例的方面与所描述的任何其它示例的方面进行组合以便形成进一步的示例。在附图的元件被表示为通过箭头进行连接的情况下,将认识到,这些箭头仅示出了元件之间的通信(包括数据和控制消息)的一个示例流。元件之间的流可以在任一方向上或在两个方向上。
将理解,仅通过示例的方式给出了优选实施例的上面描述,并且本领域的普通技术人员能够做出各种修改。尽管上面以某种程度的细节或者参照一个或多个单独的实施例描述了各种实施例,但是本领域的普通技术人员可以在不偏离本发明的精神或者范围的情况下对所公开的实施例做出许多修改。