线程活锁单元转让专利

申请号 : CN200580032259.3

文献号 : CN101031877B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : D·博恩斯K·文卡特拉曼

申请人 : 英特尔公司

摘要 :

本发明涉及用来在线程不能随着指令退休而前进时为该线程指定优先权的方法、设备和系统实施例。对于至少一个实施例,所述线程是多处理器系统中的多个激活线程的其中之一,该多处理器系统包括存储器活锁破坏器逻辑和/或饥饿避免逻辑。此外还描述了其他实施例并且要求保护所述其他实施例。

权利要求 :

1.一种处理器,包括:

包括第一逻辑处理器和第二逻辑处理器的处理器内核;

耦合到第一逻辑处理器的第一线程活锁单元;

耦合到第二逻辑处理器的第二线程活锁单元;

其中,所述第一线程活锁单元用来响应于指示所述第一逻辑处理器未能前进的条件而请求对第二逻辑处理器的停滞;以及响应于所述第一逻辑处理器在第一时间量内未能前进而进一步请求所述第一逻辑处理器的优先权;和仲裁器;并且

所述第一线程活锁单元,所述第二线程活锁单元以及所述仲裁器还用来响应所述第一线程活锁单元请求所述第一逻辑处理器的优先权而在所述第一逻辑处理器和所述第二逻辑处理器之间强加所述第一逻辑处理器的优先权。

2.权利要求1的处理器,其中:

所述第一线程活锁单元还用来确定第一逻辑处理器是否在第一软件线程的指令执行期间未能前进;以及所述第二线程活锁单元用来确定第二逻辑处理器是否在第二软件线程的指令执行期间未能前进。

3.权利要求1的处理器,还包括:

耦合到所述第一和第二逻辑处理器的存储器活锁单元。

4.权利要求3的处理器,其中:

所述存储器活锁单元还用来启动解决活锁的动作。

5.权利要求1的处理器,其中:

所述仲裁器用来在第一逻辑处理器和第二逻辑处理器之间强加优先权,以便解决长等待时间高速缓存器错失。

6.权利要求3的处理器,其中:

所述第一线程活锁单元和所述第二线程活锁单元还用来把优先权让给所述存储器活锁单元。

7.权利要求1的处理器,其中:

响应于所述第一逻辑处理器在第一时间量内未能前进而进一步请求撤消对所述第二逻辑处理器的停滞。

8.权利要求7的处理器,其中:

所述第一线程活锁单元还用来响应于所述第一逻辑处理器在响应于所述第一线程活锁单元请求第一逻辑处理器的优先权而在所述第一逻辑处理器和所述第二逻辑处理器之间强加所述第一逻辑处理器的优先权的第二时间量内未能前进而请求所述第二逻辑处理器的状态的复位。

9.权利要求2的处理器,其中:

所述第一线程活锁单元还用来响应于确定第一逻辑处理器在第一软件线程的指令执行期间未能前进而变为激活。

10.权利要求9的处理器,其中:

如果第一逻辑处理器激活,则所述第二线程活锁单元用来把优先权让给第一逻辑处理器.

11.权利要求2的处理器,其中:

所述第二线程活锁单元还用来响应于确定第二逻辑处理器在第二软件线程的指令执行期间未能前进而变为激活。

12.权利要求11的处理器,其中:

如果第二逻辑处理器激活,则所述第一线程活锁单元用来把优先权让给第二逻辑处理器。

13.权利要求12的处理器,其中:

所述第一线程活锁单元用来在由第二逻辑处理器执行的高优先权锁定操作期间把优先权让给第二逻辑处理器。

14.权利要求1的处理器,其中:

所述处理器内核包括至少一个附加逻辑处理器,所述至少一个附加逻辑处理器中的每一个附加逻辑处理器耦合到附加线程活锁单元;以及至少一个所述附加线程活锁单元连同所述第一线程活锁单元和第二线程活锁单元以及所述仲裁器用来在第一逻辑处理器、第二逻辑处理器和所述至少一个附加逻辑处理器之间强加优先权。

说明书 :

技术领域

本发明的公开内容总体涉及信息处理系统,并且尤其涉及检测和校正多线程处理系统内的多个并发线程之间的活锁(livelock)。

背景技术

为了改进信息处理系统(比如那些包括微处理器的信息处理系统)的性能,已经采用了硬件和软件技术。在硬件侧,用于改进微处理器的性能的微处理器设计方法已经包括提高时钟速度、流水线式处理、分支预测、超标量执行、无序执行以及高速缓存。许多此类方法已经导致晶体管数量的增加,并且在某些实例中,甚至已经导致晶体管数量的增加速率大于性能改进的速率。
不是尝试严格地通过附加的晶体管来改进性能,其他的性能增强涉及软件技术。已经被采用来改进处理器性能的一种软件方法被称作“多线程”。在软件多线程中,可以把一个指令流划分成多个指令流,所述多个指令流可以被并行执行。或者,可以并行执行多个独立的软件流。
在一种被称作时间片多线程或者时间复用(“TMUX”)多线程的方法中,单个处理器在固定的时间周期之后在各线程之间进行切换。在另一种方法中,单个处理器在出现触发事件之后在各线程之间进行切换,所述触发事件例如是长等待时间高速缓存器错失(cache miss)。在被称作基于事件切换的多线程(“SoEMT”)的后一种方法中,在给定时间最多只有一个线程激活。
在硬件中越来越多地支持多线程。例如,在一种方法中,在例如芯片多处理器(“CMP”)系统的多处理器系统中的各处理器可以并发地对多个软件线程当中的一个进行操作。在被称作同时多线程(“SMT”)的另一种方法中,使得单个物理处理器对于操作系统和用户程序表现为多个逻辑处理器。对于SMT,在不需要切换的情况下,多个软件线程可以在单个处理器上同时激活并且执行。也就是说,每一个逻辑处理器维持一整套所述体系结构状态,但是所述物理处理器的许多其他资源被共享,比如高速缓存器、执行单元、分支预测器、控制逻辑以及总线。从而对于SMT,来自多个软件线程的指令在每个逻辑处理器上并发地执行。
对于支持软件线程的并发执行的系统(比如SMT和/或CMP系统),存在发生以下情况的可能性:在两个或多个并发激活线程之间对共享资源的争用可能会阻止至少其中一个线程继续前进。由于与另一个激活线程的资源争用而导致一个线程不能继续前进的情况可以被称作“活锁”。
附图简述
可以参照附图来理解本发明的实施例,其中相同的附图标记指代相同的元件。这些附图不是限制性的,而是用于说明设备、系统和方法的所选实施例,所述设备、系统和方法用于检测和校正多线程处理系统内的多个并发线程之间的活锁。
图1是一个处理器的至少一个实施例的方框图,该处理器包括多个线程活锁单元,其中的每一个用来确定多个逻辑处理器的其中之一的线程前进.
图2的方框图示出能够执行所公开的技术的多线程系统的至少一个实施例。
图3的方框图示出一个处理器的至少一个实施例的前端和执行内核,该处理器包括多个逻辑处理器当中的每一个的线程活锁单元。
图4的方框图示出一个处理系统的至少一个实施例的存储器分层结构,该处理系统包括多个逻辑处理器当中的每一个的线程活锁单元。
图5和6的状态图示出用于检测和减轻多个并发线程之间的活锁的方法的至少一个实施例。
图7的方框图示出进入图5和6所示的方法的空闲状态的复位条件。
图8的流程图示出用于在多个处理器之间仲裁活锁优先权请求的方法的至少一个实施例。
图9的方框图示出在各线程活锁单元和一个存储器活锁单元之间共享的活锁破坏器逻辑的至少一个实施例。
详细描述
在下面的描述中阐述了多个具体细节以便提供对本发明的更为全面的理解,所述细节例如是处理器类型、多线程环境以及微体系结构。然而,本领域技术人员应当理解,可以在无需这种具体细节的情况下实践本发明。此外,没有详细示出某些公知的结构、电路等等,以避免不必要地模糊本发明。
这里公开的方法、设备和系统可以检测并且避免多线程处理系统中的活锁。对于至少一个所公开的实施例,线程活锁单元包括用于跟踪逻辑处理器的软件线程的指令的退休(retirement)的机制。跟踪退休只是跟踪线程是否在前进的一种方法。虽然这里讨论的实施例专注于指令退休以作为前进指标,但是本领域技术人员将意识到,其他实施例可以利用不同的或者附加的指标来确定线程是否在前进。例如,可以评估线程进展信号或寄存器,可以跟踪指令指针的前进,或者可以评估任何其他指示进展的信号或指标。
图1示出了用来执行多线程的处理器104和仲裁器180的至少一个实施例。处理器104和仲裁器180可以驻留在单个芯片封装103内。处理器104可以包括多个逻辑处理器150a-150n,以便支持并发多线程。对于至少一个实施例,处理器104利用其多个逻辑处理器150a-150n来提供SMT处理能力。对于这种实施例,每个逻辑处理器150a-150n具有其自身的指令定序器(例如参见图3的340)。对于这种实施例,逻辑处理器150维持其自身的体系结构状态版本,但是可以在所有的并发SMT软件线程之间共享单个处理器内核104的执行资源。
对于SMT,多个软件线程可以并发地运行,其中的每一个软件线程在多个逻辑处理器150的其中之一上运行。逻辑处理器150a-150n在这里可以被互换地称作“物理线程”。除非另行明确指明,在没有“物理”或“软件”的前缀时,这里使用的术语“线程”总体指代激活逻辑处理器以及该逻辑处理器正在执行的相关软件指令流。
图1示出了可以与每一个逻辑处理器150a-150n相关的线程活锁单元(“TLU”)165a-165n。因此,对于至少一个实施例,对于处理器104的每一个物理线程150a-150n,在每线程的基础上复制TLU 165。在这里,特定物理线程150的TLU 165有时可以被简单地称作该物理线程的“TLU”。
图1示出处理器104还可以包括存储器活锁单元(“MLU”)166。存储器活锁单元166可以执行以下操作:1)基于存储器活锁指标检测来自单个处理器104的各并发线程的各存储器操作之间的活锁,以及2)采取动作以解决这种活锁。
下面结合图5到7更详细地讨论TLU 165的操作。一般来说,线程活锁单元165可以执行以下操作:1)基于特定的线程活锁指标确定其相关逻辑处理器的软件线程无法前进(“被活锁”),以及2)采取动作以解决这种活锁。对于至少一个实施例,线程活锁单元165通过对自从其逻辑处理器已经退休了一个指令之后的周期数进行计数来确定没有前进,或者已经以其他方式证明了可能的前进。线程活锁单元165所能检测的其中一个特定状况被称作“指令饥饿”。指令饥饿是这样一个状况,其中第一线程可能阻断或者过度延迟另一个线程的指令获取。结果,我们称该另一个线程“指令饥饿”或者I饥饿。正在经历指令饥饿的线程正在经历可用于执行的指令的缺乏,即该线程由于没有用来退休的指令而无法前进。
当线程活锁单元165采取动作以尝试解决活锁时,该线程活锁单元165在这里被称为“激活”。线程活锁单元165可以变为“激活”以便执行几个活锁破坏器动作当中的任何一个,进行所述活锁破坏器动作以便尝试刺激与该TLU 165相关的线程的前进。例如,响应于其相关逻辑处理器150不能前进,第一逻辑处理器150的TLU 165可以采取动作以便请求停滞一个或多个其他逻辑处理器150,或者请求对一个或多个其他逻辑处理器150的微体系结构状态进行复位(这里有时被称作“核爆(nuke)”)。此外,例如激活的TLU 165可以调用活锁破坏器(例如参见下面结合图9对共享活锁破坏器950的讨论),以便采取动作来减轻指令饥饿。此外,如果检测到长等待时间高速缓存器错失,激活的TLU 165可以向仲裁器180请求优先权。下面结合图5-7更详细地讨论采取这种行动的某些实施例。
因此,根据一个实施例,各TLU 165a-165n连同仲裁器180在处理器104的各逻辑处理器150a-150n和MLU 166之间强加优先权,以便在SMT软件线程的执行期间检测并减轻活锁状况。此外,各TLU165a-165n自身可以在逻辑处理器150a-150n之间强加优先权,以便检测并减轻活锁状况。最后,对于多内核处理系统,仲裁器180也可以在多个内核之间强加优先权,以便减轻线程活锁。然而,在各种不同实施例中,这些特征当中的一些或全部可以存在也可以不存在。
图2的方框图示出多内核多线程计算系统200的至少一个实施例,该系统200能够执行所公开的技术,以便检测并减轻多个并发线程之间的活锁。图1和2中的相同元件具有相同的附图标记。
图2示出计算系统200包括至少一个处理器内核104a和存储器202。存储器202可以存储用于控制处理器104a-104n的操作的数据240和指令241。对于至少一个实施例,处理器104a可以是驻留在单个芯片封装103内的多个处理器内核104a-104n当中的一个。包括104n的附加的处理器是可选的。在图2中用椭圆和虚线表示附加处理器的可选特性。
图2示出除了处理内核104a-104n之外,附加逻辑280可以驻留在芯片封装103上。这种附加逻辑280在这里有时被称作“非内核(uncore)”。附加逻辑280可以包括高速缓存器251以及仲裁和控制逻辑252当中的一个或多个。高速缓存器251可以是在处理器104a-104n之间共享的最后一级共享的统一数据和指令高速缓存器。仲裁和控制逻辑252可以包括点对点通信控制器、全局通信队列和/或仲裁逻辑180(见图1)。
附加逻辑280还可以可选地包括集成存储器控制器253。集成存储器控制器253可以提供到芯片外存储器202的接口。对于这种实施例,芯片组255主要支持图形相关的功能。芯片组255还可以提供与一个或多个输入/输出(I/O)设备290的连接。对于至少一个实施例,芯片组255可以包括一个或多个芯片组设备,其中的每个芯片组设备提供单独的接口功能。例如,其中一个芯片组设备可以支持图形功能,而另一个芯片组设备可以支持I/O连接和/或与固件集线器(未示出)的接口。
对于在芯片封装103内不包括集成存储器控制器253的实施例,芯片组255可以提供到芯片外存储器202的接口。对于这种实施例,芯片组255除了存储器控制功能之外还可以提供上面描述的图形、I/O和/或固件功能。
虽然这里讨论的系统200的实施例具有作为仲裁和控制逻辑252的一部分的点对点通信控制器,但是这种控制器并不是对于所有实施例都需要的。实际上,本领域技术人员将认识到,这里讨论的活锁检测和校正机制的实施例可以在一个采用多分支(multi-drop)总线或其他通信拓扑的系统中执行。
如图1所示的那样,图2示出系统200的一个或多个处理器内核104a-104n的至少一个实施例可以是一个多线程内核,该多线程内核包括用于每个逻辑处理器150a-150n的TLU 165并且还包括存储器活锁单元166。
对于包括多个处理器内核104a-104n的处理系统200的一个实施例,如果用于处理器内核104a-104n上的其中一个物理处理器150a-150n的TLU已经采取了校正动作但是其相关物理线程150仍然不能在其相关软件线程的指令执行过程中实现前进,则该TLU可以向仲裁逻辑180发信号。在这种情况下,可能是另一个处理器内核104的动作正在干扰第一处理器内核104a的前进的能力。正如下面将详细解释的那样,仲裁逻辑180可以向发出请求的内核104授予优先权,以及/或者采取动作来对其他内核进行“核爆”。
相应地,每个处理器内核104的TLU 165a-165n连同每个内核的MLU 166以及仲裁器180可以一起形成一个协调活锁缩减器。该活锁缩减器因此可以包括用于每个内核104的活锁电路,其中该活锁电路可以包括用于该内核的TLU 165a-165n和MLU 166。正如下面将进一步详细描述的那样,该活锁缩减器可以从第一处理器内核104a接收关于一个线程的线程进展信息,并且可以响应于来自第一处理器内核104a的关于第一线程的该线程进展信息来调节第二处理器内核104n的线程的行为。
正如下面将进一步详细解释的那样,处理器104的至少一个实施例可以被设计成响应于由TLU 165检测到物理线程150不能使其当前指令流前进而调用MLU 166的动作逻辑。例如,如果TLU 165采取动作以减轻指令侧(I侧)饥饿,则可以调用MLU 166。(参见下面对图6的状态604的讨论)。
图3的方框图示出处理器104的至少一个实施例的其他细节,该处理器104能够执行所公开的技术,以便检测并减轻多个并发线程之间的活锁状况。处理器104可以包括前端320,该前端预取可能被执行的指令。
对于至少一个实施例,前端320包括获取/解码单元322,其包括用于一个或多个逻辑处理器150a-150n当中的每一个的逻辑上独立的定序器340a-340n.该获取解码单元322可以从指令高速缓存器(例如参见图4中的I高速缓存器444)获取适当的指令.该获取/解码单元322还可以包括解码逻辑,该解码逻辑把所述指令解码成最终格式或中间格式.
因此,所述物理获取/解码单元322包括多个逻辑上独立的定序器340a-340n,其中的每一个对应于一个物理线程150。对应于物理线程150的定序器140确定将要由物理线程150执行的相关软件指令流(这里也被称作“软件线程”)的下一个指令。定序器140a-140n可以利用来自分支预测器(见图4的432)的信息,以便确定接下来将执行哪一个指令。
图3示出处理器104的至少一个实施例包括执行内核330,该执行内核准备用于执行的指令、执行所述指令并且退休执行过的指令。执行内核330可以包括无序逻辑以便调度用于无序执行的指令。执行内核330可以包括一个或多个资源362,当所述指令流过执行流水线并且被调度来执行时,该执行内核利用所述资源来平滑所述指令流并且对其进行重新排序。这些资源362可以包括以下各项当中的一项或多项:用来维持未调度的指令的指令队列,存储器排序缓冲器,用来维持未完成的负载指令的条目的负载请求缓冲器,用来维持未完成的存储指令的条目的存储请求缓冲器,以及MLU(见图1的166)等等。
执行内核330可以包括退休逻辑,其把按照无序方式执行过的指令重新排序回到原始的程序顺序。这种退休逻辑可以包括至少一个退休队列364来维持关于所述执行流水线中的指令的信息,直到这种指令被退休为止。对于至少一个实施例,可以在各逻辑处理器150a-150n之间分割该退休队列364,从而把该退休队列的一部分分配给每个逻辑处理器150a-150n。或者,可以对于每个逻辑处理器150a-150n利用单独的退休队列364。
所述退休逻辑可以从各执行单元360接收执行过的指令的完成状态,并且可以处理所述结果,从而根据所述程序顺序来提交(或退休)适当的体系结构状态。该退休逻辑还可以包括线程活锁单元165a-165n。对于至少一个实施例,处理器104包括用于每个逻辑处理器150a-150n的单独的TLU 165a-165n。
当然,本领域技术人员将认识到,执行内核330可以按照程序顺序来处理指令,并且不必提供无序处理。在这种情况下,退休队列364不是重新排序缓冲器,而仅仅是按照程序顺序维持指令直到所述指令退休为止的缓冲器。类似地,用于这种有序处理器的执行资源362不包括其功能是对指令进行重新排序和跟踪以用于无序处理的结构。
图4的方框图示出多线程无序处理系统400的至少一个实施例,该系统能够实践所公开的技术。图4以及图1、2和/或3的相同元件具有相同的附图标记。图4示出所述处理系统可以包括存储器子系统490、处理器404和存储器控制器453。
图4示出处理器404可以包括沿着上面结合图3描述的前端320的线的前端420。前端420提供指令信息给执行内核430。对于至少一个实施例,前端420可以按照程序顺序提供该指令信息给执行内核430。
前端420可以包括获取/解码单元322,其具有多个独立的逻辑定序器340a-340n,其中的每一个用于多个逻辑处理器150a-150n当中的每一个。对于至少一个实施例,前端420预取有可能被执行的指令。分支预测单元432可以提供分支预测信息,以便帮助前端420确定有可能执行哪些指令。
执行内核430的至少一个实施例准备指令以用于无序执行、执行所述指令并且退休执行过的指令。执行内核430可以包括TLU 165。用于处理器404的执行资源462可以包括MLU 166、指令队列、负载请求缓冲器以及存储请求缓冲器。
MLU 166被设计成减轻与下列设计特征相关的活锁:逻辑处理器150a-150n可以共享存储器系统490的资源。相应地,来自一个逻辑处理器150的较早的(按照程序顺序)存储器指令可能被来自另一个逻辑处理器150的较近的存储器指令所阻断。MEU 166被设计成检测并校正这种情况。该MEU可以停滞一个逻辑处理器,从而使得另一个逻辑处理器可以完成一个或多个存储器操作。
执行内核430可以包括退休逻辑,其在退休队列464(称作重新排序缓冲器“ROB”)中把按照无序方式执行过的指令重新排序回到原始的程序顺序。该退休逻辑从各执行单元360接收执行过的指令的完成状态。执行内核430可以包括多于一个重新排序缓冲器464。也就是说,单个已分割的重新排序缓冲器464的一部分可以维持所有逻辑处理器150a-150n的未退休的指令信息。或者,可以对于每个逻辑处理器150维持单独的重新排序缓冲器464。
执行内核430还可以向处理器404的前端420处的分支预测器432报告分支历史信息,以便告知最后已知的良好分支历史信息。
这里使用的术语“指令信息”指的是可以由执行内核430理解并执行的最终格式下的基本工作单位。指令信息可以被存储在高速缓存器425中。高速缓存器425可以被实现为执行指令高速缓存器或者执行踪迹高速缓存器。对于利用执行指令高速缓存器的实施例,“指令信息”包括已经从指令高速缓存器444获取的指令。在这种所获取的指令被存储在执行指令高速缓存器中之前,它们可以或也可以不被解码成微操作。对于利用踪迹高速缓存器的实施例,术语“指令信息”可以包括已经从宏指令解码的微操作的踪迹。对于既不利用执行指令高速缓存器也不利用踪迹高速缓存器的实施例,“指令信息”还可以包括可以被存储在指令高速缓存器(例如I高速缓存器444)中的指令的原始字节。
处理系统400包括存储器子系统490,其可以包括一个或多个高速缓存器442、444以及存储器202。虽然在图4中没有同样示出,但是本领域技术人员可以意识到,高速缓存器442、444的其中之一或二者的全部或部分可以被物理地实现为处理器404本地的管芯上高速缓存器。存储器子系统490可以被实现为存储器分层结构,并且还可以包括互连453以便促进从存储器202向该分层结构的各层传输信息,比如数据240和/或指令241。本领域技术人员将意识到,对于存储器分层结构可以采用多种配置,其中包括非包含性的分层结构配置。
本领域技术人员将认识到,虽然在图4中只示出了无序处理系统400,但是这里讨论的实施例同样适用于有序处理系统。这种有序处理系统典型地不包括ROB 464。然而,这种有序处理系统仍然可以包括退休队列(见图3的364),以便跟踪未退休的指令。
图5、6和7一起表示一个状态图,该状态图示出用于确定在多个并发线程之间存在活锁状况并且用于采取动作以减轻该活锁状况的方法500的至少一个实施例。对于至少一个实施例,比如图1-4中示出的TLU 165的线程活锁单元可以执行方法500。该TLU 165可以是把方法500实施为状态机的硬件单元。
现在参照图3和4来讨论图5。作为图5的背景,有助于理解,对于SMT处理器(比如分别在图3和4中示出的处理器104和404)的至少一个实施例,每个逻辑处理器150维持一整套体系结构状态。此外,该处理器的某些特征(比如退休队列364或ROB 464以及执行资源362、462)可以维持每一个当前激活的软件线程的微体系结构状态信息.在特定条件下,可以停滞一个激活的线程,并且可以从SMT逻辑处理器150中冲刷(或者说“核爆”)掉该线程的微体系结构状态.通过停滞并且“核爆”未选择的逻辑处理器(其可能正在前进)的微体系结构状态,则所选择的逻辑处理器可以从当前节奏模式中解脱出来,并且其能够在不与未选择的逻辑处理器发生干扰的情况下前进.
图5示出所述方法500包括空闲状态502。图5还示出,当满足一个或多个复位条件501时,可以进入551该空闲状态502。为了简化图5和6,方框501和状态502之间的箭头551表示满足任何复位条件501。本领域技术人员将认识到,对于一个或多个复位条件,如图5和6所示,可以从其他状态504、506、508、602、604、606当中的一个发生到状态502的过渡。然而,为了简单起见,在图5和6中没有示出表示这种过渡的箭头。
转到图7,其中示出所述一个或多个复位条件501的至少一个实施例。图7是参照图4和5进行讨论的。对于至少一个实施例,可以在单内核处理系统或多内核处理系统中应用复位条件501。在下面的讨论中,术语“当前逻辑处理器”表示与执行方法500以确定复位条件501是否为真的TLU 165相关的逻辑处理器150。因此,虽然处理器104中的一个或多个其他TLU 165a-165n也可以并发地执行方法500,但是与处理器104的其他逻辑处理器150不同,“当前逻辑处理器”是感兴趣的那个逻辑处理器。
图7示出,当TLU 165是图5和6中所示的任何其他状态(包括状态502、504、506、508、602、606和604)时,一个或多个复位条件501可以变为真。如果一个或多个复位条件501变为真,则触发到状态502的过渡。如上所述,从任何其他状态到状态502的过渡由箭头551所包含,该箭头表示从任何其他状态到空闲状态502的过渡。
图7示出,复位条件501中的条件A表明,如果TLU 165已经被禁用,则该TLU 165应当保持在/返回到空闲状态502。该条件A反映了这样一个假设,即对于至少一个实施例,TLU 165可能被禁用。例如,对于至少一个实施例,TLU 165可能在执行异常处理例程期间被禁用。在可以由微代码或者其他固件执行的这种例程期间,可能会禁用活锁检测。可能导致TLU 165被禁用的异常的一个例子是声明(assertion)一个信号(比如停止时钟信号),该信号表明所述芯片组(例如见图2的255)已经请求处理器104过渡到低功率状态。
图7示出,复位条件501中的条件B表明,如果检测到复位触发则TLU 165应当保持在/返回到空闲状态502。在检测到这种复位触发之后,TLU 165通过保持在/返回到空闲状态502来有效地复位其活锁确定行为。对于至少一个实施例,复位触发可以由用户发起的事件激活,所述事件例如是激活初始化引脚或者断电复位。
图7示出,复位条件501中的条件C表明,如果TLU 165的相关逻辑处理器空闲并且因此当前不尝试执行软件线程,则该TLU 165应当保持在/返回到空闲状态502。对于至少一个实施例,该条件可以由TLU 165检测到,这是通过检查一个寄存器,该寄存器维持该TLU 165的“线程激活”指标。
图7示出,复位条件501中的条件D表明,如果处理器内核104的另一个逻辑处理器150处于排他性访问模式,则TLU 165应当保持在/返回到空闲状态502。在排他性访问模式期间,一个逻辑处理器可能正在采取所有其他逻辑处理器都需要知道的动作。例如,有些时候一个逻辑处理器可能正在执行一个影响对共享资源(例如ROB 464)的重新分割的指令.或者,例如一个逻辑处理器可能执行一个做出全局改变的指令,比如在控制寄存器中设置高速缓存器禁用比特.在这种情况下,所有其他逻辑处理器应当停滞执行,直到所述排他性访问操作完成为止.在这样的时间期间,停滞的TLU 165不应当预期其逻辑处理器前进,因此应当保持在/返回到空闲状态502。对于至少一个实施例,TLU 165可以确定是否满足条件D,这是通过检查一个共享信号(其例如可能在微体系结构寄存器中被反映)以便确定处理器104的另一个逻辑处理器150是否处于排他性访问模式。
图7示出,复位条件501中的条件E表明,如果TLU 165的逻辑处理器150已经过渡出I侧饥饿动作状态604(图6),则TLU 165应当保持在/返回到空闲状态502。这种过渡表明已经采取了成功的动作(下面结合状态604讨论)以便尝试减轻当前逻辑处理器150上的I侧饥饿,因此TLU 165应当返回到空闲状态502,以便开始新的活锁检测序列,从而为所述饥饿避免动作给出生效的时间。
图7还示出,复位条件501中的条件F表明,如果所述存储器活锁单元166当前激活,则TLU 165应当保持在/返回到空闲状态502。通过该条件F,TLU 165把优先权让给存储器活锁单元166。这种优先权排序方案可用于防止由TLU 165和MLU 166之间的争用而引发的活锁。也就是说,如上所述,MLU 166可以停滞一个逻辑处理器150的存储器操作,从而另一个逻辑处理器可以完成一个或多个存储器操作。如果没有复位条件F,被停滞的逻辑处理器可能会错误地确定其由于所不希望的活锁状况而不能前进。条件F确保在这种情况下TLU 165把优先权让给MLU 166。因此,复位条件F确保每个TLU 165和MLU 166知道彼此,并且彼此协作。
图7示出,复位条件501中的条件G表明,如果已经对于TLU 165的逻辑处理器声明了“核爆”动作,则该TLU 165应当保持在/返回到空闲状态502。对于逻辑处理器150的核爆动作具有如下结果:当前指令以及对于完全完成当前宏操作的执行所必需的任何其他指令都被完成。所有进一步的指令执行被停滞,并且该逻辑处理器150的所有流水线以及相关的微体系结构状态都被冲刷掉。按照这种方式,不仅该线程的处理被停滞,并且其微体系结构状态也被冲刷掉。
例如,如果已经由另一个逻辑处理器150a-150n发起了全部“核爆”动作,则条件G对于当前逻辑处理器可能为真。例如,如果作为状态606完成的结果已经由另一个逻辑处理器开始了全部“核爆”动作,则可能会满足该条件。在这种情况下,对于至少一个实施例,当前逻辑处理器将被停滞,并且其微体系结构状态将被冲刷掉;因此,当前逻辑处理器的TLU 165应当返回到空闲状态502。
或者,即使另一个逻辑处理器尚未完成状态606,对于一个特定的逻辑处理器也可能会满足条件G。相反地,对于当前逻辑处理器150的“核爆”动作可以由该处理器中的几个其他事件当中的任何一个发起,所述其他事件与方法500的各状态不相关。例如,该“核爆”事件可以作为当前逻辑处理器150上的中断的结果而被声明,以便为无序处理器104提供精确的异常处理。
图7还示出,复位条件501中的条件H表明,如果另一个逻辑处理器的TLU 165已经变为“激活”并且处于采取活锁破坏器动作的过程中,则TLU 165应当保持在/返回到空闲状态502。根据条件H,如果第一TLU 165已经从检测阶段(见502、504、506)过渡到第一TLU165在该第一TLU 165采取某种类型的校正动作以尝试减轻活锁状况的意义上“激活”的阶段(见508、602、606、604),则第二TLU 165被设计为让步于第一TLU 165。满足条件H使得以下情况成为必要:每个TLU 165知道该处理器上的其他TLU 165的状态(图3示出,对于至少一个实施例,所有的TLU 165a-165n彼此通信)。
可能会出现一种“平局”情况,其中多于一个TLU 165尝试在同一时钟周期期间过渡到激活状态。在这种情况下,只能把优先权授予其中一个发出请求的TLU 165。例如,可以把优先权指定给具有最低编号的TLU(也就是说,165a具有比165b更高的优先权,因此165b回到空闲状态502)。或者,可以利用许多其他优先权选择机制。对于至少一个实施例,由一个仲裁器(例如见图1的180)强加所述优先权机制。在这种情况下用来指定优先权的仲裁策略可以(但不必)是在下面结合图8描述的在方框806处利用的相同策略。
图7还示出,复位条件501中的条件I表明,如果TLU 165已经表现出贪婪行为并且因此很可能导致在另一个逻辑处理器150上的活锁状况,该TLU 165应当保持在/返回到空闲状态502。这种贪婪行为可以按照几种方式当中的任何一种来识别。也就是说,如果TLU 165的处理器150的ROB 364部分为空的原因不是I侧饥饿,例如处理器150的ROB 364部分为空的原因是它的其中一种执行资源已满,则该TLU 165不一定应当保持在非空闲状态中。
例如,逻辑处理器150可能表现出贪婪行为,这是由于其发出占用系统的存储器带宽的一系列存储指令,并且导致当前逻辑处理器150的存储缓冲器充满了存储指令。对于至少一个实施例,逻辑处理器150对于指令的处理可以被停滞,直到所述执行资源(例如存储缓冲器)不再满为止。在逻辑处理器150被如此停滞的时间内,当前逻辑处理器的ROB 364部分可能为空,但是另一种执行资源(即存储缓冲器)已满。因此,对于条件I,当当前逻辑处理器150的ROB 364的所分配部分为空但是其存储缓冲器(或者任何其他所指定的执行资源)充满了已退休存储指令(其数据尚未被提交给高速缓存器或存储器)时,可以识别出所述贪婪行为。在这种情况下,当前逻辑处理器150返回到空闲状态,并且在另一个逻辑处理器的TLU 165需要激活时隐含地让出优先权。
图7还示出,复位条件501中的条件J表明,如果TLU 165的逻辑处理器具有可用于执行的指令并且另一个逻辑处理器正在执行高优先权锁定序列,则该TLU 165应当保持在/返回到空闲状态502。例如,高优先权锁定序列可以是原子指令。对于原子指令,处理器的存储器逻辑仅在锁定的线程上工作,直到完成该锁定的操作,而不管其花费多长的时间。这种类型的高优先权锁定序列可以代表处理器中的最高优先权。因此,如果另一个逻辑处理器当前正在执行这种类型的高优先权锁定操作,则复位条件J通过保持在/返回到空闲状态502来强加该优先权。如果另一个处理器正在执行一系列高优先权锁定操作,从而当前逻辑处理器150在较长时间段内无法执行其自身的一个存储器指令,则MLU 166将可能被调用,以便允许当前逻辑处理器执行其存储器指令。因此,按照两个逻辑处理器之间的竞争的存储器指令,MLU166可以保护一个逻辑处理器,从而当在另一个逻辑处理器上有一系列高优先权锁定时,受保护的该逻辑处理器不会被停滞不可接受的长时间量。
然而,如果当前逻辑处理器没有要执行的指令(即当前逻辑处理器的ROB 464部分为空),则不满足复位条件J。也就是说,如果另一个逻辑处理器当前正在处理高优先权锁定操作,但是当前逻辑处理器的ROB 464部分为空,那么TLU 165不返回到空闲状态502。如果ROB部分464为空,则当前逻辑处理器没有要处理的指令。因此,不能依赖MLU 166来保护当前逻辑处理器以防止其遭受由另一个逻辑处理器执行的一系列高优先权锁定操作。在这种情况下,在面对这种一系列高优先权锁定操作时,TLU 165负责保护当前逻辑处理器以防止其被停滞太长时间.相应地,如果当前逻辑处理器150具有空的ROB 464并且在另一线程上正在进行高优先权锁定,则当前TLU 165应当在阶段506确定其是否应当执行I侧饥饿避免动作。
图7还示出,复位条件501中的条件K表明,如果当前逻辑处理器150已经接收到长等待时间数据,则TLU 165应当保持在/返回到空闲状态502。对于至少一个实施例,当作为高速缓存器错失的结果而一直在等待数据或指令的逻辑处理器最终接收到所述数据或指令时,满足条件K。此时,当前逻辑处理器应当返回到空闲状态502。这是由于如果当前逻辑处理器150不响应于满足条件K而返回到空闲状态502,那么该逻辑处理器150可能会错误地向仲裁器180(图1和2)发送与高速缓存器错失相关的优先权请求530(见下面对状态506的讨论)。
图7还示出,复位条件501中的条件L表明,如果当前逻辑处理器150在相关时间帧期间已经退休了至少一个最终格式指令,则TLU165应当保持在/返回到空闲状态502。对于至少一个实施例,该最终格式指令是微操作,并且该相关时间段是单个时钟周期。如果满足条件L,则可以说当前逻辑处理器150已经在其线程指令流的执行中前进。相应地,不存在活锁状况,并且TLU 165应当返回到或者保持在空闲状态502。
图7还示出,复位条件501中的条件M表明,如果逻辑处理器向仲裁器(图1和2的180)发送优先权请求530的能力(见下面对状态506的讨论)已经被禁用,则TLU 165应当保持在/返回到空闲状态502。当逻辑处理器150向仲裁器180(图1和2)发送优先权请求530的能力被禁用时,可以说“缺陷(defeature)”为真。当1)可能以其他方式导致从状态506发送优先权请求530的任何条件为真并且2)所述缺陷为真时,条件M可能得到满足。在这种情况下,即使用于从状态506发送优先权请求530的条件为真,逻辑处理器150也无法发送该请求。因此,逻辑处理器150应当保持在/返回到空闲状态502,而不是过渡到/保持在特殊情况状态506(如下讨论)。
对于至少一个实施例,如果逻辑处理器150正在经历内核上高速缓存器错失(数据或指令)并且正在等待来自内核外来源(例如内核外共享高速缓存器251或芯片外存储器202)的指令或数据,则条件M的第一部分(即“1)可能以其他方式导致从状态506发送优先权请求530的任何条件为真”)可能被满足。例如,如果出现以下情况则可能会发生所述错失:1)对于负载指令发生高速缓存器错失,并且该负载指令处于退休状态,但是由于所述负载数据在处理器内核104上不可用(即在任何内核上高速缓存器中不可用,并且在负载缓冲器(“LDRB’s”)中也不可用)而无法退休。例如,如果出现以下情况则也可能会发生所述错失:2)逻辑处理器150正在经历指令获取的内核上错失,并且正在等待来自内核外来源(例如内核外共享高速缓存器251或芯片外存储器202)的指令信息;或者3)逻辑处理器150正在经历STA微操作(其可以是与存储宏指令相关的最终格式存储地址微操作)的内核上错失,因此正在等待对由该存储地址微操作指示的存储器位置的内核外取回。
此外,如果所述STA微操作处于退休状态,但是由于与所述存储指令相关的数据所应被写入的存储器位置(存储地址)不在处理器内核104上(在高速缓存器或存储缓冲器(“STRB’s”)中)而无法退休,则满足所述第三条件。一般来说,所述三个条件当中的任何一个将导致TLU 165过渡到特殊情况状态506.然而,如果所述缺陷为真,则复位条件M表明这种过渡不应当发生,这是由于逻辑处理器150在这种条件下发送优先权请求530的能力已经被禁用.
回到图5,可以看出存在其他状态504、506,TLU 165可以进入所述状态以便确定是否存在活锁状况。这种状态504、506连同空闲状态502在这里被称作“检测”状态。当TLU 165处于这种检测状态502、504、506中时,其不被认为是“激活的”,这是由于其仅仅监视特定条件并且不采取任何肯定动作以尝试破坏活锁。这样,当处于其中一个检测状态502、504、506中时,逻辑处理器150将不触发结合图7讨论的复位条件501中的复位条件H,因此将不会使得其他逻辑处理器(见150a-150n)把优先权让给当前逻辑处理器150。
进入两个剩余检测状态504和506的区别在于导致逻辑处理器150过渡出空闲状态502的条件是下面的哪一种情况:1)可能最终获益于向仲裁器180(图1和2)发送优先权请求530的情况;或者2)逻辑处理器150可能正遭受I侧饥饿,但是由于另一个线程上的高优先权锁定而被阻断从而无法采取动作的情况(这些条件在这里被称作“特殊情况”)。如果是这样,则TLU 165从空闲状态502过渡552到特殊情况状态506。否则,TLU 165从空闲状态502过渡553到初始计数状态504。下面将分别进一步详细讨论这些状态504、506当中的每一个。
在出现以下情况时从空闲状态502进入552特殊情况状态506:1)没有一个复位条件501为真;并且2)
a.逻辑处理器150正在经历内核上高速缓存器错失;或者
b.逻辑处理器150具有空的ROB 464,但是在另一个逻辑处理器上有高优先权(“HP”)锁定正在进行。
在后一种情况下(条件2b),当前逻辑处理器150可能正在经历I侧饥饿。然而,当前逻辑处理器150还由于另一个线程正执行高优先权锁定操作而遭受停滞。相应地,直到该高优先权锁定操作被解除为止,当前逻辑处理器150才应当前进到任何“激活”状态。
在前一种情况下(2a),逻辑处理器150正在经历内核上高速缓存器错失。对于至少一个实施例,可以通过检查上面结合复位条件501中的条件M所讨论的三个条件来确定这种内核上高速缓存器错失:退休中的负载或STA指令,或者无法完成的指令获取。当然,本领域技术人员将意识到,这种实施例不应被视为限制性的,并且可以通过评估其他的或附加的条件而对于其他实施例确定检测到内核上高速缓存器错失。在任何情况下,当逻辑处理器150正在经历内核上高速缓存器错失(并且所述缺陷不为真)时,TLU 165过渡552到特殊情况状态506以便允许向仲裁器180发送优先权请求信号530(这对于其他逻辑处理器的破坏性最小),而不是直接过渡到更为严重的动作状态,例如停滞声明状态508,其明确地与其他逻辑处理器的处理发生干扰。
在特殊情况状态506期间,TLU 165可以利用一个计数器来对自从进入特殊情况状态506后所经过的时钟周期的数量进行计数。对于替换实施例,可以采用任何其它的用于测量所经过的时间的方法以作为对时钟周期进行计数的替换或补充。在预定数量的时钟周期(X)过期之后,TLU 165可以声明一个优先权请求530。在下面的情况下发出该优先权请求530:1)当前逻辑处理器150正在经历高速缓存器错失;并且2)自从TLU 165进入此次出现的特殊情况状态506后已经经过了预定时间量(X)。
所述优先权请求530到达仲裁器180(图1和2),并且其请求仲裁器180为当前逻辑处理器150的存储器请求给出高于来自其他逻辑处理器(见150a-150n)的存储器请求的优先权.或者,在多内核实施例中(见图2的104a-104n),所述优先权请求530可以请求仲裁器180为当前处理器内核104给出高于其他处理器内核的优先权.对于后一实施例,优先权请求530在单内核系统(见图1)中无用.因此,单内核实施例的特定于内核的优先权请求530的可选特性在图5中由点线表示.在发出优先权请求530之后,TLU 165可以保持在特殊情况状态506中,直到下面讨论的其中一个退出条件变为真。
只要ROB 464的与TLU 165的逻辑处理器150相关的该部分为空并且处理器内核104的任何其他逻辑处理器(见150a-150n)正在执行高优先权锁定操作,该逻辑处理器就保持555在特殊情况状态506中。然而,如果TLU 165在特殊情况状态506期间确定于另一个逻辑处理器的表明HP锁定正在进行中的指标从真过渡到假,则TLU 165退出特殊情况状态506并且进入554一个“激活”状态,即停滞声明状态508,在该状态期间当前逻辑处理器150可以向其他逻辑处理器声明停滞。因此,如果所述ROB 464部分为空,则绕过初始计数状态504。当ROB464部分为空时从状态506到状态508的过渡554实施高优先权处理,这是由于其不花时间来执行初始倒计数状态504。如果ROB 464为空,则所述倒计数花费的时间过长;所述逻辑处理器在这种情况下不具有任何指令,因此TLU 165被设计成尽可能快地往ROB 464中装入更多指令。
图5示出如果TLU 165确定其内核104的存储器活锁单元166已经被触发,则该TLU 165还可以过渡556出特殊情况状态506。在这种情况下,TLU 165从特殊情况状态506过渡556到初始计数状态504。在这种操作下,TLU 165把暂时的优先权让给MLU 166,以便允许MLU 166逻辑尝试破坏潜在的活锁,所述潜在的活锁作为逻辑处理器150可能正在经历的长等待时间内核上高速缓存器错失(例如参见上面对于进入特殊情况状态506所讨论的条件2a)的结果而正在形成。在MLU 166的处理期间,该MLU 166可以为特定线程指定优先权。通过在过渡556处把优先权让给MLU 166,TLU 165有效地避免在MLU 166已经把优先权指定给不同的逻辑处理器150的同时为当前逻辑处理器指定优先权。按照这种方式,TLU 165与MLU 166一起工作,以便每次只为一个线程指定优先权。因此,在确定MLU 166一直不能减轻存储器活锁并且当前逻辑处理器150在可接受的时间量之后仍然不能前进之前,TLU 165过渡556到初始计数状态504,以便允许MLU 166在整个预定时间段Y内运行(参见下面对状态504的进一步讨论)。
应当注意到,根据上面结合图7讨论的复位条件K,如果MLU 166能够成功地破坏存储器活锁从而最终接收到所错失的高速缓存器信息(数据或指令),则TLU 165从初始计数状态504过渡551回到空闲状态502。
应当注意到,根据复位条件K,如果作为正常处理器操作的一部分而最终接收到所请求的数据或所获取的指令,则没有MLU 166的帮助也可以发生从特殊情况状态506回到空闲状态502的过渡551。
如上所述,如果不存在任何特殊情况条件(内核上高速缓存器错失或者空ROB+HP锁定)并且没有复位条件501为真,则TLU 165从空闲状态502过渡553到初始计数状态504。在该初始计数状态期间,TLU165维持一个定时器,以便确定TLU 165是否已经在初始计数状态504中停留了预定时间量Y.该预定时间量Y可以被确定成反映这样的时间量:如果当前逻辑处理器150一直不能前进,那么在该时间量之后就假定当前逻辑处理器150正在经历活锁状况.
对于至少一个实施例,TLU 165在初始计数状态504期间维持一个倒计数定时器,其中该定时器被设置到所述预定时间量Y,随后每个时钟周期递减该计数器。如果该计数器到达0(或者某一其他预定最小值),则逻辑处理器150可能处在活锁状况下,并且可以准许过渡到一个“激活”状态。因此,对于至少一个实施例,所述定时器从预定定时器值Y到预定最小值的倒计数表示将容许不发生前进的时钟周期的预定数量。
应当注意到,如果在初始计数状态504期间任何复位条件501变为真,则TLU 165将过渡到空闲状态502,并且在初始计数状态504期间所利用的计数器可以被重新初始化。一个这样的复位条件(条件L)是最终格式指令的退休。如果所述退休不在初始计数状态504期间发生,则当前逻辑处理器没有在其指令的执行中前进。其他的复位条件A-K和M可以提供可能的前进的某种其他指示。如果在预定数量的时钟周期期间没有发生任何复位条件,则TLU 165从初始计数状态504过渡557到停滞声明状态508。
因此,图5示出可以从初始计数状态504(见过渡557)或者特殊情况状态506(见过渡554)进入停滞声明状态508。在停滞声明状态508期间,除了其自身的逻辑处理器(即当前逻辑处理器)之外,TLU 165向处理器104的每个逻辑处理器150a-150n声明一个停滞信号。这种动作在处理器104的所有逻辑处理器150a-150n之间强加一个优先权。对于至少一个实施例,在停滞声明状态508期间声明的该停滞信号使得在该停滞信号被声明时其他逻辑处理器(见150a-150n)不能向各执行单元360发出指令。TLU 165保持在该停滞声明状态中,并且继续向处理器104的每个其他逻辑处理器150声明该停滞信号,直到满足下面的各退出条件的其中之一为止。
图5示出,当可以被反映为一定数量(Z1)的时钟周期的预定时间段已经过期并且与当前逻辑处理器相关的ROB 464的所述部分不为空时,TLU 165的至少一个实施例可以退出558所述停滞声明状态508。在这种情况下,由于所述适当的ROB 464部分不为空,因此当前逻辑处理器150没有在经历指令饥饿。然而,当前逻辑处理器150已经在Z1个时钟周期的时间段内向所有其他逻辑处理器声明了停滞信号,并且仍然未能够经历前进。使得其他逻辑处理器停滞并没有允许当前逻辑处理器150前进,因此需要附加的动作来尝试减轻活锁状况。因此,当所述退出条件为真时,TLU 165过渡558到图6的状态602。
另一方面,如果当前逻辑处理器150的ROB 464的所指定的部分为空,则上面讨论的状态508的第一退出条件不为真。由于所述ROB 464部分为空,因此当前逻辑处理器150可能正在经历指令饥饿。因此,如果该ROB 464部分为空,则TLU 165在过渡559到图6的状态604之前等待预定的时间量Z2,其中该逻辑处理器150可以采取动作来减轻指令饥饿。
转到图6,这里参照图4对其进行讨论,从中可以看出,可以响应于其ROB 464部分在至少所述预定时间量Z2内为空而从停滞声明状态508进入I侧饥饿动作状态604。在所述I侧饥饿动作状态604期间,TLU 165采取一个或多个动作以便往当前逻辑处理器的ROB 464部分中装入更多的指令。这些动作在这里被称作饥饿避免动作。在状态604期间,TLU 165向其他逻辑处理器150a-150n撤消(de-assert)在状态508期间所声明的所述停滞信号。在这种声明期间,当前逻辑处理器150未能前进;所述停滞并没有起到帮助,并且当前逻辑处理器150仍然在经历指令匮乏(即其ROB 464仍然为空).实际上,在进入状态604时可能是这样的情况:在状态508期间声明的该停滞信号阻止了另一个逻辑处理器完成宏指令的执行,这可能阻止了释放当前逻辑处理器150所需要的资源.
在进入状态604时,假设当前逻辑处理器确实正遭受指令侧饥饿(也就是说其缺少可用于执行的指令)。这种饥饿可能是由于几种因素当中的任何一种而造成的。对于至少一个实施例,所述因素可以包括:其指令获取请求在存储器指令仲裁逻辑(未示出)处被阻断;一个或多个其他逻辑处理器一直在执行一系列高优先权锁定操作;或者当前逻辑处理器150的指令获取已重复地从被用来处理对存储器系统的请求的任何结构接收“未被确认”响应。
在I侧饥饿状态604期间,TLU 165可以采取以下动作:1)向处理器内核104的所有其他逻辑处理器150a-150n撤消所述停滞信号;以及2)请求把“线程优先权”给予当前逻辑处理器。该“线程优先权”请求可以对线程优先权逻辑(未示出)提出。如果当前逻辑处理器取得线程优先权,则可以调用MLU 166。
简要地参照图9,其中示出了可以在I侧饥饿动作状态604(图6)的至少一个实施例期间一起工作的TLU 165和MLU 166的某些特征。在此参照图3、5和6来讨论图9。图9示出每一个TLU 165a-165n可以包括活锁检测器920和活锁破坏器930。对于至少一个实施例,活锁检测器920监视复位条件501并且执行检测阶段502、504、506。对于至少一个实施例,活锁破坏器930负责执行所述“激活”状态508、602、604和606的动作。
图9示出MLU 166包括存储器活锁破坏器940。对于至少一个实施例,该存储器活锁破坏器940负责采取动作以便减轻存储器活锁状况,比如上面讨论的长时间的内核上高速缓存器错失状况。
图9示出MLU 166的存储器活锁破坏器940可以包括共享的活锁破坏器逻辑950。该共享的活锁破坏器逻辑950可以在I侧饥饿动作状态604期间响应于当前逻辑处理器获得“线程优先权”而被调用。该共享的活锁破坏器逻辑950可以由处理器内核104上的任何逻辑处理器150a-150n的TLU 165调用。
返回图6,可以看出,自从当前逻辑处理器最初被给予“线程优先权”后,当遭受I侧饥饿的该逻辑处理器150已经在连续的预定时间N(其可以反映时钟周期数)内具有被指定给它的线程优先权时,可以退出所述I侧饥饿动作状态604。在这种情况下,TLU 165过渡651到核爆状态606。
应当注意到,只有当I侧饥饿动作状态604期间所采取的动作不成功时才进行过渡651。例如,重复检测到由另一个逻辑处理器发起的自修改代码(SMC)可能迫使饥饿的线程持续丢弃及重新获取指令,从而使其ROB 464部分保持为空。然而,在状态604期间采取的I侧饥饿避免动作在减轻指令饥饿状况方面可能很成功。如果是这样,则将会获取指令,并且将指令发送到当前逻辑处理器150的ROB 464的所分配部分。在这种情况下,对于至少一个实施例,当前逻辑处理器150将已经过渡出指令饥饿状况。相应地,复位条件E(见图7的501)将为真,并且TLU 165将从I侧饥饿动作状态604过渡501到空闲状态502(见图5)。
图6示出可以从停滞声明状态508进入558核爆倒计数状态602。再次,在核爆倒计数状态602期间,TLU 165向其他逻辑处理器150a-150n撤消在状态508期间声明的停滞信号.在这种声明期间,当前逻辑处理器150未能前进;所述停滞没有帮助.实际上,在进入状态602时可能是这种情况:在状态508期间声明的停滞信号阻止了另一个逻辑处理器150完成宏指令的执行,这可能阻止了释放当前逻辑处理器150所需要的资源.然而,所述停滞可能干扰了其他逻辑处理器的定时,这可证明有益于帮助当前逻辑处理器150前进.
当进入核爆倒计数状态602时,当前逻辑处理器150可能处于最终将导致前进的状态。例如,当前逻辑处理器150可能正经历存储器活锁,其中MLU 166当前激活,但是需要更多的时间来完成其活锁破坏器处理。在核爆倒计数状态602期间,TLU 165等待预定的时间量(其例如可以被反映为M个周期的计数),以期望当前逻辑处理器150将达到其中一个复位条件501。对于至少一个实施例,在图6中所示的M和N的计数可以是相同的数字,但是并非所有实施例都要求这种等同性。
对于至少一个实施例,图6示出TLU 165在下面的条件下从核爆倒计数状态602过渡652到核爆状态606:当前逻辑处理器已经被指定了“线程优先权”,并且已经在连续时间帧M内保有线程优先权。在这段时间期间,尽管当前逻辑处理器150具有线程优先权,但是其未能在线程中前进。如上所述,如果当前逻辑处理器处于指令饥饿状况,则TLU 165也可以过渡651到核爆状态606;也就是说如果在状态604期间采取的I侧饥饿动作不成功的话。
在状态606期间,TLU 165向处理器104的每一个其他逻辑处理器(见150a-150n)发出一个内核内部“核爆”信号。作为该动作的结果,希望当前逻辑处理器150现在将能够前进。对于例如图1所示的单内核实施例,方法500的处理可以从状态606过渡654到空闲状态502(见连接符“C”)。
图6示出还可以响应于外部事件而不是作为上述状态过渡的其中之一的结果进入655核爆状态606。例如,所述外部事件可以是接收到由可选状态608下的另一个内核上的TLU 165产生的全线程核爆请求(如下讨论)。
如果在状态606期间发出的所述内核内部全线程“核爆”信号没有导致当前逻辑处理器150在预定时间量P内前进,则可以发生从状态606的可选状态过渡653。应当注意到,在图6中用点线表示状态608。出现这种情况是由于过渡653和状态608在它们仅适用于多内核实施例、比如图2中所示的实施例200的意义上是可选的。在状态608处,向仲裁器180(图1和2)发送全内核核爆请求。响应于在状态608处产生的该请求,仲裁器180的至少一个实施例启动下列动作:针对所有内核104a-104n上的所有线程150a-150n(当前逻辑处理器除外)排空由仲裁器180维持的所有队列。此外,阻断所有新的全内核核爆请求(见图8的方框806),从当前逻辑处理器150发出的除外。最后,对每个其他处理器内核104a-104n发出全线程核爆请求(见上面对状态508的讨论),并且对与当前逻辑处理器150相关的处理器内核104上的每个其他线程150a-150n(当前逻辑处理器除外)也发出全线程核爆请求。(如上所述,当其他处理器内核的逻辑处理器接收到该核爆请求时,该核爆请求可以导致所述逻辑处理器的TLU 165进入状态606,参见上面对方框620的讨论)。TLU 165从状态608返回到空闲状态(见连接符“D”)。
图8的流程图示出多内核实施例的用于处理全内核核爆请求的方法800,所述全内核核爆请求例如是在状态608期间发出的那些全内核核爆请求。对于至少一个实施例,方法800可以由仲裁器执行,例如图1和2中所示的仲裁器180。对于至少一个实施例,该仲裁器可以被包括作为在这里称作“非内核”的逻辑的内核外部分280(图2)的一部分。
图8示出方法800从方框802开始并且行进到方框804.如果已经产生了单个全内核核爆请求(即来自第一处理器内核104a上的TLU165),则处理行进到方框806.正如上面结合与状态608相关的处理所描述的那样,在方框806为发出请求的内核104a指定优先权,并且来自其余的内核104a-104n的所有后续的全内核核爆请求被无视.
所述处理从方框806行进到方框808。在方框808处,向所有其他内核104a-104n发起全线程核爆请求,所述原始全内核核爆请求所源自的该内核除外。所述请求可以由其他内核接收,并且使得它们过渡到核爆状态606(见图6的方框620)。所述处理随后在方框814结束。
然而,如果从多个内核接收到两个或多个同时的全内核核爆请求,则所述处理从方框804行进到方框810。在方框810处,方法800应用一个仲裁策略以便选择多个发出请求的内核的其中之一以作为优先权内核。对于至少一个实施例,该发出请求的内核可以把内核ID与所述核爆请求一起提供给仲裁器。仲裁器180随后可以应用简单的选择算法,例如把具有最高或最低ID的内核选择作为优先权内核。所述处理从方框810行进到方框808并且随后行进到方框814,正如在上一段中所描述的那样。
上面的讨论描述了方法、设备和系统的所选实施例,用来在多个线程之间协调线程优先权,以便允许在线程指令的执行中前进,同时在活锁破坏器逻辑、I侧饥饿避免逻辑和高优先权锁定处理之间维持优先权。这里描述的机制可以与单内核或多内核多线程系统一起被利用。在前面的描述中,描述了所述方法、设备和系统的各个方面。出于解释的目的,阐述了特定的数字、实例、系统和配置以便提供更全面的理解。然而,本领域技术人员可以明显看出,可以在没有所述具体细节的情况下实践所述方法和设备。在其他实例中,省略或者简化了公知的特征,以免模糊所述方法和设备。
这里描述的方法的实施例可以用硬件、硬件模拟软件或其他软件、固件或者所述实施方法的组合来实现。可以对于可编程系统实现本发明的实施例,该可编程系统包括至少一个处理器、数据存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备以及至少一个输出设备。为了本申请的目的,处理系统包括具有处理器的任何系统,所述处理器例如是数字信号处理器(DSP)、微控制器、专用集成电路(ASIC)或者微处理器。
程序可以被存储在存储介质或设备(例如硬盘驱动器、软盘驱动器、只读存储器(ROM)、CD-ROM设备、闪存设备、数字通用盘(DVD)或其他存储设备)上,其可以由通用或专用可编程处理系统读取。当所述存储介质或设备由处理系统读取以便执行这里描述的程序时,可以由该处理系统中的处理器访问的所述指令提供对于该处理系统的配置和操作。本发明的实施例也可以被认为被实现为机器可读存储介质,其可以被配置成与处理系统一起使用,其中,如此配置的所述存储介质使得该处理系统以特定的预定义方式操作,以便执行这里描述的功能。
在图4中示出了所述处理系统的一个例子的至少一个实施例。例如,样本系统400可以被用来检测活锁状况以及采取校正动作以尝试减轻这种状况。样本系统400代表基于可以从Intel公司获得的Pro、II、III、4以及和2微处理器的处理系统,但是也可以使用其他系统(包括具有其他微处理器的个人计算机(PC)、工程工作站、个人数字助理和其他手持式设备、机顶盒等等).对于一个实施例,样本系统可以执行能够从Microsoft公司获得的WindowsTM操作系统的一个版本,但是例如也可以使用其他操作系统和图形用户界面。
参考图4,样本处理系统400可以包括存储器系统490和处理器404。存储器系统490可以存储用于控制处理器404的操作的指令241和数据240。
存储器系统490意图作为存储器的一般化表示并且可以包括多种形式的存储器,比如硬盘驱动器、CD-ROM、随机存取存储器(RAM)、动态随机存取存储器(DRAM)、静态随机存取存储器(SRAM)、闪存以及相关电路。存储器系统490可以存储由数据信号代表的指令241和/或数据240,所述数据信号可以由处理器404执行。所述指令241和/或数据240可以包括用于执行这里讨论的任一或所有技术的代码。
虽然已经示出并说明了本发明的特定实施例,但是本领域技术人员显然可以看出,在不背离本发明的最广范围的情况下可以做出许多改变和修改。例如,上面讨论的计数器值X、Y、Z1、Z2、M、N、P可以被用作向上计数或倒计数的计数器值。每个所述计数器值可以(但不必)是不同的值。例如,对于至少一个实施例有P>>M、P>>N、Z1>Y、Z2>Y、P>Z1、P>Z2以及X>Z1。可以在硬件中设置这些计数器值的缺省值。对于某些实施例,所述缺省计数器值可以是可编程的,从而例如可以用微代码或者其他固件或软件代码对其进行修改。
因此,本领域技术人员将认识到,可以在不背离本发明的最广范围的情况下做出许多改变和修改。所附权利要求书意图在其范围内包含落在本发明的真实范围内的所有这种改变和修改。