最小化未调度d缓存缺失流水线停顿的方法和装置的制作方法

文档序号:6571309阅读:387来源:国知局
专利名称:最小化未调度d缓存缺失流水线停顿的方法和装置的制作方法
技术领域
本发明大体涉及在处理器中执行指令。尤其是,本申请涉及最小化处理器中由于缓存缺失(cache miss)而引起的流水线停顿(stall)。
背景技术
现代计算机系统通常包含多个集成电路(IC),包括可被使用以在计算机系统中处理信息的处理器。由处理器处理的数据包括由处理器执行的计算机指令和由处理器使用所述计算机指令而操作的数据。所述计算机指令和数据通常被存储在计算机系统的主存储器中。
处理器通常通过以一系列小步骤执行指令的方式来处理指令。在一些情况下,为了提高被处理器处理的指令的数量(并因此提高处理器的速度),处理器可被流水线化。流水线化是指在处理器中提供分立的阶段,其中每个阶段执行一个或多个对执行一条指令来说是必要的小步骤。在一些情况下,(除了其它电路之外)流水线可被放置在处理器被称为处理器内核的部分。一些处理器可能具有多个处理器内核,并且在一些情况下,每个处理器内核可能具有多条流水线。当一处理器内核具有多条流水线时,多组指令(被称为发送组(issue group))可以并行地被发送到多条流水线并且并行地被这些流水线的每一条所执行。
作为在一流水线中执行指令的一个例子,当接收到第一指令时,第一流水线阶段可执行该指令的一小部分。当第一流水线阶段已经结束了处理该指令的这一小部分后,第二流水线阶段可开始处理第一指令的另一小部分,同时第一流水线阶段接收并开始处理第二指令的一小部分。因此,该处理器可以同时(并行地)处理两个或更多指令。
为了提供对数据和指令的更快的访问以及更好地利用处理器,处理器可具有多个缓存。缓存是一般小于主存储器的存储器并且一般在与处理器相同的管芯(即芯片)上制造。现代处理器通常具有多个级别的缓存。位置离处理器的内核最近的最快的缓存被称为一级缓存(L1缓存)。除了L1缓存之外,处理器通常具有第二个较大的缓存,被称为二级缓存(L2缓存)。在一些情况下,处理器可以具有其他的、额外的缓存级别(例如,L3缓存和L4缓存)。
为了给处理器提供足够的指令以填满处理器流水线的每个阶段,处理器可以从L2缓存以包含多条指令的被称为指令线(I线)的组的形式取回指令。取回的I线可被放置在L1指令缓存(I缓存)中,在此处理器的内核可以访问I线中的指令。将由处理器处理的数据块(D线)可类似地从L2缓存中取回并放置在L1缓存数据缓存(D缓存)中。
从较高缓存级别取回信息并将该信息放置在较低缓存级别中的过程可被称为读取(fetch),并通常需要一定量的时间(等待时间)。例如,如果处理器内核请求信息而该信息并不在L1缓存中(被称为缓存缺失),该信息可以从L2缓存读取。每次缓存缺失都导致额外的等待时间,因为下一个缓存/存储器级别被搜索以获得所请求的信息。例如,如果所请求的信息没有在L2缓存中,那么处理器可在L3缓存或在主存储器中查找该信息。
在一些情况下,处理器处理指令和数据要快于从缓存和/或存储器取回指令和数据。例如,当正在流水线中被执行的指令尝试访问不在D缓存中的数据时,在处理器从较高级别缓存或存储器中读取包含该数据的D线的同时,流水线阶段可能结束了处理先前的指令。当流水线在等待合适的D线被读取的同时结束了处理先前的指令时,流水线会没有剩余的指令可处理(被称为流水线停顿)。当流水线停顿时,处理器没有被充分利用并且失去了流水线化处理器内核所提供的好处。
因为直到指令被执行时会不知道所需数据的地址,所以直到该指令被执行时处理器会不能搜索所需的D线。然而,一些处理器尝试通过读取包含接近(邻接)当前被访问的数据地址的数据地址的D线块来防止这种缓存缺失。读取附近的D线依赖于以下假设,即当D线中的数据地址被访问时,附近的数据地址也很可能被访问(这个概念一般被称为访问局部性(locality of reference))。然而,在一些情况下,这种假设可能证明是不正确的,所以位置并不接近当前ID线的D线中的数据被指令访问,因此导致了缓存缺失和处理器效率低。
因此,需要改进的方法和装置,用于在利用缓存的存储器的处理器中执行指令并取回数据。

发明内容
本发明大体提供改进的方法和装置,用于在利用缓存的存储器的处理器中执行指令并取回数据。在一个实施例中,提供了一种在处理器中调度指令的执行的方法。该处理器可具有至少一个级联的、延迟的处理流水线单元,该单元具有两个或更多个以相对于彼此为延迟的方式执行在公共发送组中的指令的执行流水线。该方法包括接收指令的发送组,确定该发送组中的第一指令是否是加载指令,并且如果是的话,调度该第一指令将在一流水线中执行,其中该流水线中的执行相对于该级联的、延迟的执行流水线单元中的另一个流水线是不被延迟的。
本发明的另一个实施例提供了一种集成电路设备,其包括级联的、延迟的执行流水线单元,该执行流水线单元具有两个或更多个以相对于彼此为延迟的方式执行公共发送组中的指令的执行流水线。该集成电路设备还包括这样的电路,其被配置为接收指令的发送组,确定该发送组中的第一指令是否为加载指令,并且如果是的话,调度该第一指令将在一流水线中执行,其中该流水线中的执行相对于该级联的、延迟的执行流水线单元中的另一个流水线是不被延迟的。
本发明的另一个实施例提供了一种处理器,其包括二级缓存,一级缓存和级联的、延迟的执行流水线单元,该单元具有两个或更多个以相对于彼此为延迟的方式执行公共发送组中的指令的执行流水线。该处理器还包括预解码电路,其被配置为从二级缓存接收将被作为发送组发送的指令组,确定该指令组中的第一指令是否是加载指令,如果是,那么调度该第一指令将在一流水线中被执行,其中该流水线中的执行相对于该级联的、延迟的执行流水线单元中的另一个流水线是不被延迟的,并发送该指令组到一级缓存。


为了能详细理解实现本发明上述特点、优势和目的的方式,可通过参考在附图中所示的本发明的实施例而得到对上述简要概括的本发明的更具体的描述。
然而应注意到,附图所示的仅仅是本发明典型的实施例,因此不能认为是对其范围的限定,因为本发明可以允许其他同样有效的实施例。
图1是示出根据本发明一个实施例的系统的框图。
图2是示出根据本发明一个实施例的计算机处理器的框图。
图3是示出根据本发明一个实施例的处理器的内核之一的框图。
图4A-B示出了根据本发明一个实施例在延迟的执行流水线中执行指令的过程。
图5A-B示出了根据本发明一个实施例使用D缓存缺失预测来调度加载指令的执行的过程。
图6是示出根据本发明一个实施例具有早期地址生成阶段的示意性延迟的执行处理器流水线的框图。
图7A是示出根据本发明一个实施例用于存储用于I线中加载指令的D缓存缺失信息和/或目标地址的示意性I线。
图7B是示出根据本发明一个实施例的示意性重新编码的加载指令的框图。
图8A-C示出了根据本发明一个实施例使用D缓存缺失信息来确定对加载指令的调度的过程。
图9是示出根据本发明一个实施例使用D缓存缺失信息来确定对加载指令到最小延迟的执行流水线的调度的过程的流程图。
图10是示出根据本发明一个实施例具有转发路径的级联的、延迟的执行流水线的框图。
具体实施例方式
本发明大体提供了一种最小化未调度D缓存缺失流水线停顿的机制。在一个实施例中,提供了一种调度处理器中指令的执行的方法。该处理器可具有至少一个级联的延迟的执行流水线单元,该单元具有两个或更多个以相对于彼此为延迟的方式执行公共发送组中的指令的执行流水线。该方法包括接收指令的发送组,确定该发送组中的第一指令是否是加载指令,以及如果是,那么调度该第一指令将在流水线中被执行,该流水线中的执行相对于级联的延迟的执行流水线单元中的另一个流水线不被延迟。通过在执行不被延迟的流水线中执行该指令,可以快速确定执行该指令是否导致缓存缺失。如果该指令导致缓存缺失,那么可以更快地发起从较高级别的缓存和/或存储器获取数据的请求(例如,比指令在具有更大的执行延迟的流水线中被执行要快)。
下面,将参考本发明的实施例。然而,应当理解本发明并不局限于特定的示出的实施例。相反,以下特征和要素的任何组合,无论是否涉及不同的实施例,都被认为实施和实践本发明。此外,在各个实施例中,本发明提供了相对于现有技术的很多优势。然而,尽管本发明的实施例可以实现相对于其他可能解决方案和/或相对于现有技术的优势,但是特定优势是否由给定实施例来实现并不对本发明构成限定。因此,以下方面、特征、实施例和优势仅仅是示意性的,并且不应认为是所附权利要求的要素或限定,除非在权利要求中明确陈述。同样,对“本发明”的提及不应被认为是对在此公开的任何创发明主题的概括,也不应被认为是所附权利要求的要素或限定,除非在权利要求中明确陈述。
以下是对在附图中示出的本发明的实施例的详细描述。这些实施例是例子,并且其详细到能清楚地表达本发明。然而,提供的细节量并不意在限定实施例的所预见的变化;而是相反,本发明是要覆盖落在如所附权利要求所定义的本发明的精神和范围之内的所有修改、等同物和替换。
可与一系统例如计算机系统一起利用本发明的实施例,并且在下面相对于该系统描述了本发明的实施例。如在此所使用的,系统可包括任何利用处理器和缓冲存储器的系统,包括个人计算机、互联网电器(internetappliance)、数字媒体设备、便携数字助理(PDA)、便携音乐/视频播放器和视频游戏控制台。虽然缓冲存储器可位于与利用该缓冲存储器的处理器相同的管芯上,但是在一些情况下,该处理器和缓冲存储器可位于不同的管芯(例如,分立的管芯内部的分立的芯片或单个模块内部的分立的芯片)上。
尽管下面相对于具有多个处理器内核和多个L1缓存的处理器进行了描述,其中每个处理器内核使用多条流水线来执行指令,但是本发明的实施例也可与使用缓存的任何处理器一起被利用,所述处理器包括具有单个处理内核的处理器。一般而言,本发明的实施例可以与任何处理器一起被利用,并且不局限于任何特定的配置。此外,虽然下面相对于具有划分成L1指令缓存(L1 I缓存,或I缓存)和L1数据缓存(L1 D缓存,或D缓存224)的L1缓存的处理器进行了描述,但是本发明的实施例也可以在使用统一的L1缓存的配置中被利用。
示意性系统的概述图1是示出根据本发明一个实施例的系统100的框图。该系统100可包含用于存储指令和数据的系统存储器102,用于图形处理的图形处理单元104,用于与外部设备进行通信的I/O接口,用于长期保存指令和数据的存储设备108,以及用于处理指令和数据的处理器110。
根据本发明一个实施例,处理器110可具有L2缓存112和多个L1缓存116,每个L1缓存116都被多个处理器内核114之一所利用。根据一个实施例,每个处理器内核114可被流水线化,其中每个指令通过一系列的小步骤被执行,其中每个步骤由不同的流水线阶段执行。
图2是示出根据本发明一个实施例的处理器110的框图。为了简洁,图2示出了处理器110的单个内核114,并且相对于该单个内核描述了图2。在一个实施例中,每个内核114可以是相同的(例如,包含具有相同流水线阶段的相同的流水线)。在另一实施例中,每个内核114可以是不同的(例如,包含具有不同阶段的不同流水线)。
在本发明一个实施例中,L2缓存可包含由处理器110正在使用的指令和数据的一部分。在一些情况下,处理器110可请求不包含在L2缓存112中的指令和数据。当所请求的指令和数据不包含在L2缓存112中时,所请求的指令和数据可以(从较高级别缓存或系统存储器102)取回并放置在L2缓存中。当处理器内核从L2缓存112请求指令时,所述指令可首先由预解码器和调度器220处理(后面将详细描述)。
在本发明一个实施例中,指令可以从L2缓存112以被称为I线的组的形式被读取。类似地,数据可以从L2缓存112以被称为D线的组的形式被读取。图1中示出的L1缓存116可以被划分成两个部分,即用于存储I线的L1指令缓存222(I缓存222)和用于存储D线的L1数据缓存224(D缓存224)。可以使用L2访问电路210从L2缓存112读取I线和D线。
在本发明的一个实施例中,从L2缓存112取回的I线可由预解码器和调度器220处理,并且所述I线可被放置在I缓存222中。为了进一步提高处理器性能,指令经常被预解码,例如,I线从L2(或更高的)缓存被取回。这种预解码可包括多种功能,比如地址生成,分支预测,以及调度(确定指令应该被发送的顺序),其被捕获为控制指令执行的分派信息(一组标志)。在一些情况下,预解码器和调度器220可在多个内核114和L1缓存之间共享。类似地,从L2缓存112取回的D线可被放置在D缓存224中。每个I线和D线中的一个位可被用来跟踪L2缓存112中的信息线是I线还是D线。可选地,作为以I线和/或D线从L2缓存112取回数据的替代,数据可以以其他方式从L2缓存112取回,例如,通过取回更小、更大或可变的数据量。
在一个实施例中,I缓存222和D缓存224可分别具有I缓存目录223和D缓存目录225,以跟踪哪些I线和D线当前在I缓存222和D缓存224中。当一I线或D线被添加到I缓存222或D缓存224中时,对应的条目可被放置在I缓存目录223或D缓存目录225中。当I线或D线被从I缓存222或D缓存224中移除时,在I缓存目录223或D缓存目录225中的对应条目可被移除。虽然下面是相对于利用D缓存目录225的D缓存224描述的,但是本发明的实施例也可以在不使用D缓存目录225的情况下被利用。在这种情况下,存储在D缓存224中的数据本身可指示当前在D缓存224中的是什么D线。
在一个实施例中,指令读取电路236可被用来读取用于内核114的指令。例如,指令读取电路236可包含程序计数器,其跟踪在内核中当前被执行的指令。内核中的分支单元可被用来在遇到分支指令的时候改变程序计数器。I线缓冲器232可被用来存储从L1 I缓存222读取的指令。发送和分派电路234可被用来将从I线缓冲器232取回的指令分组成指令组,这些指令组然后可被并行发送到内核114,如下面所描述的那样。在一些情况下,发送和分派电路可使用预解码器和调度器220提供的信息来形成合适的指令组。
除了从发送和分派电路234接收指令之外,内核114可从多个位置接收数据。当内核114需要来自数据寄存器的数据时,寄存器文件240可被用来获取数据。当内核114需要来自存储器单元的数据时,缓存加载和存储电路250可被用来从D缓存224加载数据。当这种加载被执行时,用于所需要数据的请求可被发送给D缓存224。同时,可检查D缓存目录225以确定所需的数据是否位于D缓存224中。当D缓存224包含所需的数据时,D缓存目录225可指示D缓存224包含所需的数据并且D缓存访问可以在以后的某个时间被完成。当D缓存224不包含所需的数据时,D缓存目录225可指示D缓存224不包含所需的数据。因为D缓存目录225可以比D缓存224更快地被访问,所以对于所需的数据的请求可在D缓存目录225被访问之后但在D缓存访问完成之前被发送给L2缓存112(例如,使用L2访问电路210)。
在一些情况下,数据在内核114中可以被修改。修改的数据可被写到寄存器文件中,或存储在存储器中。写回电路238可被用来将数据写回到寄存器文件240。在一些情况下,写回电路238可利用缓存加载和存储电路250来将数据写回到D缓存224。可选地,内核114可直接访问缓存加载和存储电路250来执行存储。在一些情况下,如下面所述,写回电路238也可被用来将指令写回到I缓存222。
如上所述,发送和分派电路234可被用来形成指令组并发送形成的指令组到内核114。发送和分派电路234还可包括循环移动(rotate)和合并在I线中的指令并以此来形成合适的指令组的电路。发送组的形成可考虑多种因素,比如发送组中指令之间的依赖性,以及可通过指令的排序而实现的优化,如在下面将详细描述的。一旦发送组被形成,发送组就被并行分派到处理器内核114。在一些情况下,指令组包含用于内核114中的每个流水线的一个指令。可选的,指令组可以是更小数量的指令。
根据本发明的一个实施例,一个或多个处理器内核114可利用级联的、延迟的执行流水线配置。在图3示出的例子中,内核114包含级联配置中的四条流水线。可选的,在这种配置中可使用更小数量(两个或更多流水线)或更大数量(四条流水线以上)。此外,图3中示出的流水线的物理布局是示例性的,而不一定提示级联的、延迟的执行流水线单元的实际物理布局。
在一个实施例中,在级联的、延迟的执行流水线配置中的每个流水线(P0、P1、P2、P3)可包含一执行单元310。执行单元310可包含执行用于给定流水线的一个或多个功能的多个流水线阶段。例如,执行单元310可执行读取和解码一个指令的全部或部分。由执行单元所执行的解码可与预解码器和调度器220共享,而后者在多个内核114之间共享,或可选地被单个内核114利用。执行单元还可从寄存器文件读数据,计算地址,执行整数算术功能(例如,使用算术逻辑单元或ALU),执行浮点算术功能,执行指令分支,执行数据访问功能(例如从存储器加载和存储),以及将数据存储回寄存器(例如,在寄存器文件240中)。在一些情况下,内核114可利用指令读取电路236、寄存器文件240、缓存加载和存储电路250、写回电路、以及任何其他电路来执行这些功能。
在一个实施例中,每个执行单元310可执行相同的功能。可选地,每个执行单元310(或不同的执行单元组)可执行不同功能集。而且,在一些情况下,每个内核114中的执行单元310可与在其他内核中提供的执行单元310相同或不同。例如,在一个内核中,执行单元3100和3102可执行加载/存储和算术功能,而执行单元3101和3102仅执行算术功能。
在一个实施例中,如所示出的那样,执行单元310中的执行可以相对于其他执行单元310为延迟的方式被执行。所示出的安排还可被称为级联的、延迟的配置,但是所示出的布局不一定指示执行单元的实际物理布局。在这种配置中,当一指令组中的指令(为了简便被称为I0、I1、I2、I3)被并行地发送到流水线P0、P1、P2、P3时,每个指令可以相对于每个其他指令为延迟的方式被执行。例如,指令I0可在用于流水线P0的执行单元3100中首先被执行,指令I1可在用于流水线P1的执行单元3101中第二个被执行,依此类推。
在一个实施例中,当将发送组发送到处理器内核114时,I0可在执行单元3100中立即被执行。此后,在指令I0已经结束在指令单元3100中被执行后,执行单元3101可开始执行指令I1,依此类推,因此被并行发送到内核114的指令以相对于彼此为延迟的方式被执行。
在一个实施例中,一些执行单元310可相对于彼此被延迟,而其他延迟单元310相对于彼此不被延迟。当第二指令的执行依赖于第一指令的执行时,转发路径312可被用来将结果从第一指令转发到第二指令。所示出的转发路径312仅仅是示例性的,且内核114可包含更多的从执行单元310中的不同点到其他执行单元310或到相同的执行单元310的转发路径。
在一个实施例中,没有被执行单元310执行的指令(例如,被延迟的指令)可被保持在延迟队列320或目标延迟队列330中。延迟队列320可被用来保持指令组中还没有被执行单元310执行的指令。例如,当指令I0在执行单元3100中被执行时,指令I1、I2和I3可被保持在延迟队列330中。一旦指令经过了延迟队列330,指令可被发送到合适的执行单元310并被执行。目标延迟队列330可被用来保持已经被执行单元310执行的指令的结果。在一些情况下,目标延迟队列330中的结果可被转发到执行单元310以便在合适的时候处理或使其无效。类似地,在一些情况下,延迟队列320中的指令可被无效,如下面描述的那样。
在一个实施例中,在指令组中的每个指令都已经过了延迟队列320、执行单元310和目标延迟队列330之后,结果(例如,数据以及如下所述的指令)可被写回寄存器文件或L1 I缓存222和/或D缓存224。在一些情况下,写回电路238可被用来写回寄存器的最近修改的值(从目标延迟队列330之一接收的)和丢弃的无效结果。
调度加载指令根据本发明的一个实施例,由于缓存缺失导致的流水线停顿可以通过在最小延迟的流水线(例如,在上述例子中,在流水线P0中)中执行加载指令而被减少。当加载指令导致D缓存缺失时,在加载指令之后发送的指令可被无效,并且对于数据的请求可被发送到L2缓存112。当所需的数据被从L2缓存112读取时,加载指令可以被重新发送到具有最大执行延迟的流水线(例如,流水线P3),并且被无效的指令可被发送,或者是在与该重新发送的指令相同的发送组中或是在随后的发送组中。
如上述那样执行加载指令可至少在三个方面是有利的。首先,通过最初在具有最小执行延迟的流水线中执行加载指令,可以快速确定加载结果是否导致D缓存缺失。通过及早确定是否产生D缓存缺失,可无效和重新发送较少的发送到流水线的指令(例如,在随后发送组中的指令)。第二,通过快速确定发送的指令是否导致了L1缓存缺失,L2缓存访问可被更快地发起,因而减少了在L2缓存访问被执行的同时流水线中任何导致的停顿。第三,通过重新发送加载指令到具有最大延迟的流水线,可以提供更多的时间(例如,当加载指令被移动经过延迟队列320时以及在该指令被执行单元310重新执行之前),用于完成所需数据的L2缓存访问,因而防止了处理器内核114的停顿。
图4A-B示出了根据本发明的一个实施例用于在延迟的执行流水线中执行指令的过程400。该过程400可开始于步骤402并继续到步骤404,在此接收发送组中将被执行的指令。
在步骤406,可确定接收的指令是否包含加载指令。如果接收的指令不包含加载指令,那么这些指令可被放置到默认发送组中,被发送到处理器内核114以及在步骤412被执行。然而,如果接收的指令包含加载指令,那么在步骤408可确定加载指令是否可在指令组内被发送到最小延迟的流水线。例如,当最小延迟的流水线是在处理器内核114中执行另一条指令所需要的功能的唯一流水线时(例如,如果最小延迟的流水线是能够执行分支指令的唯一流水线),那么加载指令可被发送到具有更多延迟的另一个流水线。另外,在一些情况下,加载指令的执行可能依赖于其他执行的指令的结果。例如,加载指令的目标数据的存储器地址可依赖于另一条指令所执行的计算。当加载指令依赖于同一个发送组中的另一条指令时,该另一条指令可在该加载指令之前被执行,例如,通过使用具有更少延迟的流水线。可选地,在一些情况下,可调度发送组中的指令(例如,在多个发送组中分布指令)以避免这种在单个发送组中的依赖性。
如果确定加载指令可以在发送组中被发送到最小延迟的流水线,那么在步骤410加载指令可被调度以被发送到最小延迟的流水线(例如,流水线P0)。在步骤420,发送组可被发送到处理器内核114,并且在步骤422,加载指令可在最小延迟的流水线中被执行。
在步骤424,可从D缓存224请求用于加载指令的数据,并且可检查D缓存目录225以确定包含所请求数据的D线是否位于D缓存225中。因为加载指令在最小延迟的流水线中被执行,缓存访问可以比加载指令在具有更多延迟的流水线中(例如流水线P1、P2或P3)被执行的情况下更快地被发起。
可在步骤426确定D缓存224是否包含所请求的数据。例如可基于D缓存目录225所提供的信息而做出该确定。如果D缓存224包含所请求的数据,那么可在步骤428从D缓存224接收所请求的数据,并且在步骤442该过程400可继续执行指令。
然而,如果D缓存224不包含所请求的数据,那么在加载指令之后被发送到处理器内核114的指令(例如,在随后指令组中的指令)可在步骤430被无效。可执行将随后的发送无效,例如以阻止后面的指令的不合适的执行,这些后面的指令可能依赖于加载指令的结果。在一个实施例中,指令的无效可以通过在处理器内核114中设置用于每个随后发送的指令(例如,用于在执行单元310或延迟队列320中的随后发送的指令)的位而被执行。该位可指示指令所产生的结果是无效的。当该位被例如写回电路238检测到时,无效的指令所产生的结果可被丢弃。可选地,可通过盖写这些指令来将这些指令从处理器内核移除。在一个实施例中,在指令(包括加载指令)被无效之后,可记录缓存缺失以便以后在调度中使用(下面将详细描述)并且无效的指令可被返回到I缓存222以便指令可被重新发送到处理器内核114。
在步骤432,请求被可发送到L2缓存以获取所请求的数据。例如,可使用L2访问电路210发送该请求。在一些情况下,可在D缓存目录225指示所请求的数据不在D缓存224中之后自动发送该请求。
在步骤434,可形成具有被发送到最大延迟的流水线(例如,流水线P3)的该加载指令的发送组。在步骤436,该发送组可被发送到处理器内核114,并且在步骤438,在延迟队列(例如,延迟队列3203)中被延迟之后,加载指令可在延迟的执行流水线P3中被执行。如上所述,通过到最大延迟的流水线执行指令,L2缓存访问可以在该指令被执行之前被完成(例如,当该指令移动经过延迟队列3203的同时L2缓存访问可以继续)并且用于该加载指令的数据可以“正好准时”到达以执行该加载指令。
在步骤440,可从D缓存224请求用于加载指令的数据。假设L2缓存112包含所请求的数据,那么在步骤428将从D缓存224接收所请求的数据,处理器内核114可在步骤442继续执行指令,并且过程400可在步骤450结束。
在一些情况下,在访问请求被发送到L2缓存112并且加载指令被重新发送以在最大延迟的流水线中被执行之后,L2缓存112可不包含所请求的数据。当L2缓存112不包含所请求的数据时,处理器内核114可在访问请求向缓冲存储器的更高级别(例如,L3或L4缓存)和/或系统存储器102做出的同时停顿。当从D缓存接收到所请求的数据时,处理器内核114可恢复执行加载指令和任何随后接收的加载指令。
在一些情况下,最小延迟的流水线(或者需要时,最大延迟的流水线)可能无法如所需的那样可用来执行加载指令。在一个实施例中,当具有所需延迟量的流水线不可用时,加载指令可被调度以在流水线的“下一个最好”选择中被执行。例如,当具有最小量延迟的流水线P0不可用于执行指令时,指令可被调度以在下一个可用的具有最小量延迟的流水线(例如,按照优选的顺序,流水线P1、P2或P3)中被执行。
如上所述,通过在具有最小量延迟的流水线中执行加载指令,如果加载指令导致了缓存缺失的话,可无效减少数量的指令。此外,通过将导致缓存缺失的加载指令重新发送到最大延迟的流水线,该指令的执行可被推迟,直到已完成到更高级别的缓冲存储器的缓存访问。如下面所述,当预测和历史信息被用于预测一指令可能引起缓存缺失时,也可执行指令调度和执行中的其他优化。
使用D缓存缺失预测来调度加载指令在一些情况下,缓存缺失预测和历史信息可被用于改变指令被调度到在其中执行的流水线(在级联的、延迟的执行流水线内核中)。例如,在一个实施例中,可接收将被发送的一组指令。如果该组中的一指令在先前该指令的执行期间导致了缓存缺失,那么该指令可被调度在这样一个流水线中执行,该流水线中的执行相对于延迟的执行流水线单元中的另一条流水线被延迟。通过调度指令在延迟的流水线中执行,可在执行到更高级别缓存的访问(例如,产生于D缓存缺失,如果有的话)的同时推迟加载指令的执行。
图5A-B示出了根据本发明的一个实施例使用D缓存缺失预测来调度加载指令的执行的过程500。该过程500可开始于步骤502并继续到步骤504,在此接收发送组中将被执行的指令。在步骤506,可确定接收的指令是否包含加载指令,如果不包含,那么接收的指令可被放置在默认发送组中,被发送到处理器内核114,以及在步骤514被执行。
如果接收的指令包含加载指令,可在步骤508确定加载指令先前是否引起缓存缺失。在一个实施例中,可使用D缓存缺失信息(例如,记录先前D缓存缺失历史的位)来确定加载指令先前是否引起D缓存缺失。如下面所述,D缓存缺失信息可被存储并维护在指令本身之中、在具有该指令的指令线的一部分之中、在用于存储这种信息的特别存储器之中、和/或任何其他合适的位置。
如果接收的加载指令先前引起过D缓存缺失,那么可在步骤510确定该加载指令是否能被调度在最大延迟的执行流水线中被执行。如上所述,关于指令时否能在给定流水线中执行的确定可取决于该流水线的处理能力、被执行的指令的处理需求、和被放置在发送组中的指令的指令间依赖性。另外,如上所述,在一些情况下,为了允许指令被发送到最大延迟的流水线(或最小延迟的流水线,如果需要的话),可通过在分立的发送组中发送不相容的指令或通过修改哪个发送组执行哪些指令而修改发送组。
如果加载指令可能被调度在延迟的执行流水线中被执行,那么可在步骤512以被调度为被发送到延迟的执行流水线(例如,流水线P3)中的加载指令来形成发送组。可选地,如果可能的话,该指令可被调度为在提供最大量可用延迟的可用流水线中被执行。
在步骤520,可将请求发送到L2缓存112来获得加载指令的目标数据。例如可使用L2缓存访问电路210来发送该请求。如下面所述,在一些情况中,可在加载指令已经被执行之前发起该L2缓存访问。可选地,在一些情况下,可执行加载指令的一部分(例如,可计算用于该加载指令的加载有效地址),然后可在从L2缓存112读取加载数据的同时延迟该加载指令的执行。
在步骤522,可将发送组发送到处理器内核114,并且在步骤524可在最大延迟的执行流水线中执行该加载指令。当执行该加载指令时,在步骤526,可从D缓存224请求该加载指令的目标数据。如果在步骤520发送到L2缓存的请求是成功的,那么可在步骤528接收来自D缓存224的被请求数据。可选地,如上所述,如果L2缓存112不包含所请求的数据,那么处理器内核114可在所请求的数据被从更高级别的缓存和/或存储器读取的同时停顿。然而,因为加载指令的执行被延迟,所以停顿的长度可被减小。在接收到所请求的数据之后,可继续在步骤530执行指令,并且过程500可在步骤550结束。
如上所述,当确定了加载指令先前引起过缓存缺失时,加载指令可被发送到最大延迟的可用流水线,并且请求可被发送到L2缓存112来获得加载数据。当加载指令被延迟(例如,在延迟队列320中)时,可执行L2访问,因而加载数据及时地到达D缓存224而被加载指令访问。
为了执行L2缓存访问,可及早确定加载指令的有效地址(例如,在加载指令被延迟之前,例如,通过放置加载指令在延迟队列320中)。这样,在一个实施例中,可在该指令被发送到处理器内核114或被执行之前发起L2访问。例如,当加载指令从L2缓存112中被取回时,预解码器和调度器220可确定该加载指令是否先前导致了D缓存缺失,且如果是这样的话,发起L2缓存访问。当执行指令之前发起L2访问时,L2访问可被称为预取(因为目标数据在指令的执行之前被读取)。
在本发明的一个实施例中,可在预解码器和调度器220解码该加载指令的同时确定加载指令所请求的数据的目标地址。例如,该目标地址可作为该指令的一部分而直接被提供。可选地,该目标地址可以是可预解决的,例如,通过使用可用于预解码器和调度器220或用来发起L2缓存访问的其他电路的信息。在另一个实施例中,加载指令所请求的数据的目标地址可在指令的第一次执行期间被计算。然后所计算的地址可被存储以便以后在发起L2缓存访问时使用。
在一个实施例中,当存储目标地址时,可存储所请求数据的整个目标地址。可选地,在一个实施例中,当存储目标地址时,可只存储目标地址的一部分(例如,识别包含所请求数据的D线的目标地址的足够的地址位)。例如,如果可通过仅使用有效地址的高32位来定位所缓存的包含加载指令的所请求数据的D线,那么可仅存储这32位作为用于预取D线目的的目标地址。
在本发明的一个实施例中,可在加载指令已经被发送到处理器内核之后但在加载指令被放置在延迟队列320中或被执行单元310完全执行之前计算加载目标地址。例如,如在图6中示出的,每个流水线可利用用于地址生成(AGEN)6020、6023的阶段。对于未延迟的或较少延迟的流水线,AGEN阶段6020可作为执行单元3100的第一阶段被执行。然而,在最大延迟的流水线P3(或具有较大延迟的其他流水线)中,AGEN阶段6023可在流水线的开始在指令被延迟(例如,在延迟队列3203中)之前和在指令被执行(例如,在执行单元3103中)之前被执行。通过在延迟的流水线开始时执行地址生成,可很快确定加载有效地址并且可在加载指令在延迟队列320中被延迟的同时发起和执行L2缓存访问。然后,来自L2缓存112的数据可及时地到达以完成加载指令在执行单元3103中的执行。
如上所述,在一个实施例中,可使用D缓存缺失信息来确定加载指令先前是否引起过D缓存缺失。当D缓存缺失信息指示指令先前引起过D缓存缺失时,可调度该指令在延迟的流水线中执行,如上面所述的那样。
在一个实施例中,D缓存缺失信息可包括这样的单个位(MIS位),当加载指令导致D缓存缺失时,为该加载指令设置该位。最初,在指令被执行之前,可清除MIS位,从而指示该指令先前没有导致D缓存缺失。之后,当该指令被执行时,可确定该指令是否导致D缓存缺失。如果该指令导致了D缓存缺失,那么可设置MIS位,从而指示该指令先前导致了D缓存缺失。当随后取回加载指令(例如,从L2缓存112)以便执行时,可检查存储的MIS位,例如通过使用预解码器和调度器220。如果MIS位被设置,那么预解码器和调度器220可预测加载指令将导致另一次D缓存缺失。因此,如以上对于图5A-B所描述的,可使用加载指令的目标地址发起L2缓存访问,并且可调度加载指令在最大延迟的可用流水线中执行。
在一些情况中,如果加载指令随后被执行并且没有导致D缓存缺失,那么可将MIS清除为0,以指示该加载指令随后不会导致D缓存缺失。可选地,MIS可保持设置为1(例如,作为粘着位(sticky bit)),以此指示该加载指令先前导致过D缓存缺失并且可能导致另一次D缓存缺失。
在一些情况下,当MIS位被设置并且所请求数据被成功地从D缓存取回的时候,确定该数据是如何被放置在D缓存中是有用的。例如,在一些情况下,可因为使用了MIS位来预取数据而避免D缓存缺失。可选地,在一些情况下,不需要预取数据就可避免D缓存缺失(例如,该数据可能已经在D缓存中,并且L2访问可能是不必要的)。在一个实施例中,可存储一位以指示数据(例如,在D线中)是否由于基于设置的MIS位的预取而被放置在D缓存224中。该位可被处理器110用来确定在防止D缓存缺失时预取的有效性。
可选地,预解码器和调度器220(或可选地,预取电路)也可确定预取是没有必要的并相应地改变I线中的MIS位。当预取是不必要的时,例如因为预取的数据已经在D缓存224中,那么可清除MIS位,如上所述的那样。预解码器和调度器可确定所请求的数据是否在D缓存224中,例如,通过检查D缓存目录225或通过维护读取的数据和/或D线的列表。
在本发明的一个实施例中,可使用多个历史位(HIS)来预测加载指令是否将导致D缓存缺失并且确定应该如何调度加载指令来执行。例如,如果HIS是两个二进制位,那么00可对应于没有D缓存缺失的预测,而01、10和11可分别对应于D缓存缺失的徵弱、强烈和非常强烈的预测。每次加载指令导致了D缓存缺失,HIS可被增加,从而提高对D缓存缺失的预测级别。当HIS为11并且随后的D缓存缺失被检测到时,HIS可保持为11(例如,计数器可在11处饱和而不是循环回到00)。每次当加载指令没有导致D缓存缺失时,HIS可被减少。在一些情况下,当利用多个历史位时,这些多个历史位可既被用来确定哪些数据地址应当被存储,也被用来确定如何调度加载指令。
如上所述,可使用D缓存缺失信息和目标地址来确定是否发起L2缓存访问。在一些情况下,可执行L2缓存访问而不需要首先检查D缓存224和/或D缓存目录225以确定加载指令的目标数据是否实际存在于D缓存中。例如,在一些情况下,可在向D缓存目录225发起请求之前发起L2缓存访问。在发起L2缓存访问之后,可向D缓存目录225发起请求(例如,通过使用L2缓存访问电路210)。如果D缓存目录指示D缓存224不包含所请求的数据,那么L2访问可以继续。当首先发起L2缓存访问并且随后将请求发送到D缓存目录225时,可以较少量的时间完成L2访问,因为不需要等待到D缓存目录225的请求的结果发起了该L2访问。如果D缓存目录225指示所请求的数据包含在D缓存224中,那么可在经由D缓存224访问所请求的数据的同时丢弃L2缓存访问的结果。
可选地,在一些情况下,在预解码器和调度器220尝试从L2缓存112预取I线或D线之前,预解码器和调度器220(或可选地,其他预取电路)可确定包含所请求的数据的D线是否已经包含在D缓存224中,或是否已经发送对所请求的I线或D线的预取请求。例如,可使用包含最近读取或预取的I线或D线地址的历史的小缓存或缓冲器来确定是否已经发送了对于I线或D线的预取请求或者所请求的I线或D线是否已经存在于I缓存222或D缓存224中。
如果所请求的I现货D线已经位于I缓存222或D缓存224中,那么L2缓存预取可能是没有必要的,并因此可不执行。如上所述,当先前的预读取请求使得第二预取请求为不必要的时,可修改所存储的D缓存缺失信息。例如,可修改D缓存缺失信息以指示L2缓存预取和加载指令的修改的调度是不必要的。
可以多种方式存储D缓存缺失信息和目标地址,这些方式可包括使用指令位、I线位和/或特殊缓存。在本发明的一个实施例中,可为每个加载指令存储D缓存缺失信息和目标地址(如果必要的话)。可选地,在一些情况下,可仅存储来自某些指令(例如,导致D缓存缺失的指令或I线中的、比相同I线中的其他指令更频繁地导致D缓存缺失的指令)的D缓存缺失信息和/或目标地址。
在一个实施例中,可在包含该加载指令的I线中存储D缓存缺失信息和/或目标地址。图7A是示出根据本发明的一个实施例用来存储I线702中的加载指令的D缓存缺失信息和/或目标地址的示意性I线702的框图。
如图所示,该I线可包含多条指令(指令1、指令2等等)、用来存储地址(例如,有效地址,即EA)的位、和用来存储控制信息(CTL)的位。在本发明的一个实施例中,图7A中示出的控制位CTL可被用来存储用于该加载指令的D缓存缺失信息(例如,MIS和/或HIS位),而EA位可用来存储加载指令所请求的数据的目标地址。
作为在I线702中存储D缓存缺失信息的一个例子,当I线702中的指令被执行时,处理器内核114可确定I线中的加载指令是否已引起了D缓存缺失。如果检测到D缓存缺失,那么可将用于该指令的目标地址(或其一部分)存储在EA中,并且可将其他缺失信息(例如,MIS或HIS位)存储在CTL位中。在一些情况下,也可将I线702中的加载指令的位置存储在CTL位中。例如,如果每个I线都包含32个指令,那么可使用存储在CTL位中的5位二进制数(包含足够的位来识别指令位置)来识别对应于存储的D缓存缺失信息和目标地址的加载指令。
在本发明的一个实施例中,当在I线中存储目标地址和/或D缓存缺失信息时,用在系统100中的每个级别的缓存和/或存储器都可包含I线中包含的信息的副本。在本发明的另一个实施例中,只有指定级别的缓存和/或存储器可包含指令和/或I线中包含的信息。可使用本领据技术人员所知道的缓存一致性原理来更新每个级别的缓存和/或存储器中I线的副本。
应注意到在利用指令缓存的传统系统中,指令通常不被处理器110修改。因此,在传统系统中,I线在过了一些时间后通常被老化出(age out)I缓存222,而不是被写回到L2缓存112。然而,如在此描述的,在一些实施例中,修改的I线和/或指令可被写回到L2缓存112,从而允许预取数据被维护在更高缓存和/或存储器级别中。
作为例子,当I线中的指令已经被处理器内核处理时(可能引起目标地址和/或D缓存缺失信息被更新),可将I线写到I缓存222中(例如,通过使用写回电路238),从而可能盖写存储在I缓存222中的I线的较旧版本。在一个实施例中,可仅当已对存储在I线中的信息做出改变时,才将I线放置在I缓存222中。可选地,在一个实施例中,可总是将I线写回到I缓存222。
根据本发明的一个实施例,当将修改的I线写回到I缓存222中时,可将I线标记为已改变。当I线被写回到I缓存222并被标记为已改变时,该I线可保留在I缓存中不同的时间量。例如,如果I线被处理器内核114频繁地使用,那么该I线可被多次读取并返回到I缓存222,并可能每次被更新。然而,如果I线不被频繁使用(被称为老化),那么可从I缓存222中清除该I线。当从I缓存222中清楚I线时,可确定该I线是否被标记为已改变。当该I线被标记为已改变时,可将该I线写回到L2缓存112。可选地,可总是将该I线写回到L2缓存112。在一个实施例中,可以可选地将I线一次写回到多个缓存级别(例如,到L2缓存112和I缓存222)或写回到除了I缓存222之外的级别(例如,直接到L2缓存112)。
在一个实施例中,可将加载指令所请求的数据的目标地址直接存储在(附加在)如图7A所示出的I线中。存储的目标地址EA可以是有效地址或有效地址的一部分(例如,该有效地址的高32位)。目标地址EA可以标识加载指令所请求的数据,或可选地,标识包含目标数据的地址的D线。根据一个实施例,I线可存储多个地址,每个地址对应于I线中的一加载指令。
在一些情况下,可将EA和/或CTL位存储在I线中为该目的分配的位中。可选地,在本发明的一个实施例中,可将在此描述的有效地址位EA和控制位CTL存储在I线的否则未使用位中。例如,L2缓存112中的每个信息线可具有额外的数据位,其可被用于在不同缓存级别间传送的数据的错误纠正(例如,用于确保被传送的数据不是损坏的并且修复任何发生的损坏的错误纠正码,即ECC)。在一些情况下,每个级别的缓存(例如,L2缓存112和I缓存222)可包含每个I线的相同副本。当每个级别的缓存包含给定I线的副本时,可以不利用ECC。相反,例如,可使用一奇偶位来确定I线是否在缓存间被正确地传送。如果该奇偶位指示I线在缓存间被不正确地传送,那么可从传送缓存重新读取该I线(因为该传送缓存包含该线)而不是执行错误检验。
作为将地址和控制信息存储在I线的否则未使用位的一个例子,考虑一错误纠正协议,该协议使用十一个位来用于存储的每两个字的错误纠正。在I线中,可使用这十一个位之一来存储用于每两个指令的奇偶位(其中一个字存储一个指令)。每个指令的剩余五个位可被用来存储用于每个指令和/或地址位的控制位。例如,五个位中的四个可被用来存储用于该指令的D缓存缺失信息(比如MIS和/或HIS位)。如果I线包括32个指令,那么剩余的32位(每个位用于一个指令)可被用来存储例如加载指令的目标地址的全部或一部分。如上所述,在一些情况下,用于每个加载指令的目标地址可被读取并存储在I线中。可选地,用于最频繁执行的加载指令的目标地址被读取并存储在I线中。
在本发明的一个实施例中,一I线可包括多个加载指令,并且可为每个加载指令存储D缓存缺失信息。在一个实施例中,可跟踪多个D缓存缺失历史,但是可只将一个目标地址即对应于指令中最频繁预测的D缓存缺失的目标地址存储在EA中。可选地,可将用于导致D缓存缺失的每个加载指令的目标地址存储在单个I线中。如下面所述,当不存储用于加载指令的有效地址(例如,因为该加载指令引起的D缓存缺失是不可预测的或超出了用于预测的阈值)时,那么可将该加载指令发送到最小延迟的流水线以便执行(例如,如对于上面图4A-B所描述的),从而快速解决该加载指令的目标地址并确定该加载指令是否导致D缓存缺失。
在一些情况下,可在加载指令被解码和/或被执行之后将D缓存缺失信息存储在该指令中(被称为重新编码)。图7B是示出根据一个实施例的示例性重新编码的加载指令704的框图。加载指令704可包含用于村识指令类型的操作码(Op-Code)、一个或多个寄存器操作数(Reg.1,Reg.1)、和/或数据。如所示出的,加载指令704还可包含用来存储MIS和/或HIS位的位。
当加载指令704被执行时,可确定该加载指令是否导致D缓存缺失。作为该确定的结果,可如上所述的那样修改MIS/或HIS位。然后可将MIS和/或HIS位重新编码到指令704中,从而当随后解码该指令时,可例如由预解码器和调度器220检查所述MIS和/或HIS位。预解码器和调度器然后可在适当的情况下发起L2缓存访问和调度加载指令704以便执行。如上所述,在一些情况下,当加载指令被重新编码时,可将包含该指令的I线标记为已改变并写回到I缓存222中。
在一个实施例中,也可使用指令704中的其他位来重新编码该指令。例如,可使用指令704中的位来记录该加载指令是否是独立的和/或可解决的。此外,可使用指令704中的位来记录该指令是否被分派给给定流水线,例如最大延迟的流水线。
在一个实施例中,如上所述,可在指令704已经被执行之后重新编码该指令中的位。在一些情况下,也可当从较高级别源代码编译该指令时,将D缓存缺失信息重新编码到该指令中。例如,在一个实施例中,可将用来编译源代码的编译器设计为识别可导致D缓存缺失的加载指令并相应地在该加载指令中设置MIS和/或HIS位。
可选地,一旦已经创建了程序的源代码,那么可将源代码编译成指令,并且然后在测试执行期间执行这些指令。可监视测试执行和测试执行的结果来确定哪些加载指令导致D缓存缺失。然后可重新编译源代码以使得根据测试执行将用于加载指令的MIS和/或HIS位设置成合适的值。在一些情况下,可在处理器110上进行测试执行。在一些情况下,可使用处理器110中的控制位或控制引脚来将处理器110置于用于测试执行的特殊测试模式中。可选地,可利用被设计用来进行测试执行和监视结果的特殊处理器。
在本发明的一个实施例中,可在被称为影子缓存(shadow cache)的特殊缓存中存储D缓存缺失信息(MIS和/或HIS位)。例如,当加载指令导致D缓存缺失时,可将一条目放置在影子缓存中。加载指令的地址(或者可选地,包含该加载指令的I线的地址)可被用作到该影子缓存中的索引。也可在该影子缓存中维护用来确定加载指令的目标地址的信息(例如,在加载指令的预解码期间或先前执行期间所计算的有效地址)。如上所述,可使用该目标地址信息在包含该加载指令的发送组被发送到处理器内核114时(或在任何其他合适的时间)发起L2缓存访问。
在一个实施例中,当接收到包含加载指令的I线时(例如,由预解码器和调度器220接收),可搜索影子缓存(例如,该影子缓存可以是可内容寻址的)来获得对应于所读取的I线的条目(或多个条目)(例如,具有与所读取的I线相同的有效地址的条目)。如果找到了对应的条目,那么与该条目相关联的D缓存缺失历史信息和/或目标地址可被预解码器和调度器220或其他电路使用来调度该加载指令并发起L2缓存,如果需要的话。
在本发明的一个实施例中,影子缓存可如上所述存储控制位(例如,D缓存缺失信息)和目标地址两者。可选地,可将控制位存储在I线中和/或个别指令中,而将其他信息存储在该影子缓存中。无论在哪种情况下,在一个实施例中,可根据以上相对于确定将在I线中存储哪些条目所列举的原则中的任何一个来管理影子缓存中的条目。作为例子,可将用于导致被强烈预测的D缓存缺失的加载指令的目标地址存储在影子缓存中,而存储在影子缓存中对应于被弱预测的D缓存缺失的目标地址可被盖写。
除了使用所述技术来确定将哪些条目存储在影子缓存中之外,在一个实施例中,可使用传统的缓存管理技术(或者单独地或者包括上述技术),来管理影子缓存。例如,影子缓存中的条目可具有老化位,其指示该影子缓存中的条目被访问的频率。如果给定条目被频繁访问,那么老化值可保持为较小(例如,年轻的)。然而,如果该条目不是频繁地被访问,那么老化值将增加,并且该条目在一些情况下将被从影子缓存中丢弃。
在本发明一个实施例中,可在指令被执行的同时连续地跟踪和更新目标地址和D缓存缺失信息以使得D缓存缺失信息和其他存储的值可在给定的一组指令被执行时随着时间改变。因此,可例如在程序被执行时动态修改目标地址和D缓存缺失信息。
在本发明的另一个实施例中,可在一组指令的初始执行期间(例如,在其中程序被执行的初始“训练”时期)存储目标地址和D缓存缺失信息。该初始执行阶段也可被称为初始化阶段或训练阶段。在训练阶段期间,可跟踪D缓存缺失信息,并且可根据上面描述的标准存储一个或多个目标地址(例如,在包含该指令的I线中或在影子缓存中)。当训练阶段完成时,可继续使用被存储的目标地址和D缓存缺失信息来执行加载指令的数据预取和调度执行。
在一个实施例中,可使用一个或多个位(例如,存储在包含加载指令的I线中或特定缓存或寄存器中)来指示指令是否是在训练阶段中被执行或处理器110是否在训练阶段模式中。例如,处理器110中的一模式位可在训练阶段期间被清除。虽然该位被清除,但是可如上所述跟踪D缓存缺失信息并且更新目标地址。当训练阶段完成后,可设置该位。在该位被设置后,目标地址可不再被更新并且训练阶段可完成。
在一个实施例中,训练阶段可继续一段指定的时间(例如,直到经过了若干时钟周期,或直到给定指令已被执行了若干次)。在一个实施例中,当经过了指定时间段并且退出训练阶段后,最近存储的目标地址和/或D缓存缺失信息可保持存储。
在本发明的另一个实施例中,训练阶段可继续直到一个或多个退出标准被满足。例如,当存储了D缓存缺失历史时,初始执行阶段可继续直到D缓存缺失变成可预测的(或强烈可预测的)。当加载指令的结果变成可预测的时,可在I线中设置一锁定位(lock bit)以指示初始训练阶段完成并且用于该强烈可预测的加载指令的目标地址可被用于当从L2缓存112读取该指令时所执行的随后预取和调度。
在本发明的另一个实施例中,可在间歇训练阶段中修改目标地址和缓存缺失信息。例如,可存储用于每个训练阶段的频率和持续时间值。每次经过了对应于该频率的时钟周期数时,训练阶段可被发起并且可持续指定的持续时间值。在另一个实施例中,每次过了对应于该频率的时钟周期数时,训练阶段可被发起并且持续直到满足了指定阈值条件(例如,如上所述,直到达到了用于指令的指定级别的D缓存缺失可预测性)。
在一些情况下,仅可为可被发送到最大延迟的执行流水线的加载来设置MIS位和/或HIS位。可选地,指示该指令是否是独立的和/或可预解决的指令的第二位可被重新编码到指令中并与MIS位和/或HIS位一同被用于确定对该指令的合适的调度。
进一步的实施例在本发明的一个实施例中,当MIS和/或HIS位没有被设置时,当MIS和/或HIS位预测加载指令将不会导致D缓存缺失时,和/或当用于加载指令的目标地址没有被计算和/或存储时,可调度该加载指令在最小延迟的流水线(例如,P0)中执行,从而可快速解决该指令的结果(例如,该指令是否导致D缓存缺失和/或该指令的目标地址),并且可最小化任何导致的、处理器内核114中的停顿或指令无效(如果有的话)。否则,当预测到D缓存缺失并且有效的目标地址可用时,可如上所述将指令发送到最大延迟的流水线并且可发起L2缓存访问。
图8A-C是示出根据本发明的一个实施例用于使用D缓存缺失信息来确定对加载指令的调度的过程800的流程图。如图所示,过程800可开始于步骤802,并继续到步骤804,在此接收发送的组中将被执行的指令。如果接收的指令包含加载指令,那么可在步骤808确定该加载指令先前是否引起过缓存缺失。例如可以通过检查MIS位来确定该加载指令先前是否引起过缓存缺失。如果MIS位被设置,那么它可指示该加载指令先前引起过缓存缺失。
如果该加载指令先前导致过缓存缺失,那么可在步骤810确定是否可调度该加载指令在最大延迟的执行流水线中执行。如上所述,当最大延迟的流水线不提供加载指令所要求的功能时,当另一条指令被要求发送到该最大延迟的流水线时,当用于该指令的目标地址还没有被计算时,或由于任何其他原因,该指令会不能在该最大延迟的流水线中被执行。可选地,如果该指令不能被发送到该最大延迟的流水线,那么可尝试发送该指令到下一个可用的具有最大延迟的流水线。
如果可调度该加载指令在最大延迟的流水线中执行,那么在步骤832,可以用发送到该最大延迟的流水线的该加载指令形成发送组。在步骤834,可将对于该加载指令的目标数据的请求发送到L2缓存112,并且在步骤836,可发送发送组。在步骤838,可在该最大延迟的流水线(P3)中执行加载指令。然后,在步骤840,可从D缓存224请求加载指令的目标数据。
在步骤842,假定所请求的数据已从L2缓存112取回并且放置在D缓存224中,可从D缓存224接收所请求的数据。然后在步骤844,处理器内核114可继续执行指令并且过程800可在步骤850结束。
回到步骤808和810,如果加载指令先前没有导致过D缓存缺失,或者如果不能调度加载指令在最大延迟的流水线中执行,那么过程800可尝试调度该加载指令在最小延迟的流水线以确定该加载指令是否会导致D缓存缺失和/或确定该加载指令的目标地址。因此,在步骤812,可确定是否能调度该加载指令在最小延迟的执行流水线中执行。如果该加载指令不能在最小延迟的流水线中被执行,那么可在步骤814将所接收的指令放置在默认发送组中,发送,并执行。
如果能调度该加载指令在最小延迟的执行流水线中执行,那么可在步骤820形成具有被发送到最小延迟的流水线(P0)的加载指令的发送组并且可在步骤822将该发送组发送。
在步骤824,可在最小延迟的流水线中执行该加载指令。在步骤825,可从D缓存224请求用于该加载指令的数据,并且可检查D缓存目录225以确定所请求的数据是否在D缓存224中。然后,在步骤828,可确定D缓存目录225是否指示所请求的数据在D缓存224中。如果所请求的数据在D缓存224中,那么可在步骤842接收所请求的数据,并且过程800可在步骤844继续执行指令。
然而,如果D缓存224不包含所请求的数据,那么可在步骤830无效随后发送到处理器内核114的指令,并且可在步骤832形成具有被发送到最大延迟的执行流水线(如果可能的话)的加载指令的发送组。然后,如上所述,可将对所请求数据的请求发送到L2缓存112。可选地,一旦D缓存目录225指示所请求的数据不在D缓存224中,那么可将对加载指令的目标数据的请求自动转发给L2缓存112。然后过程800如所述的那样继续,发送发送组(步骤836),执行加载指令(步骤838),从D缓存224请求(步骤840)和接收(步骤842)数据,继续指令的执行(步骤844)以及在步骤850结束。
这样,如上所述,通过发送被预测为会导致D缓存缺失的加载指令到最大延迟的执行流水线,处理器停顿可通过在从更高级别的缓存和/或存储器读取加载指令所请求的数据的同时延迟对该加载指令的执行而被防止或减少。然而,当加载指令先前没有被执行时,当加载指令不可被预测会不会引起D缓存缺失时,或当加载指令的目标数据不能被确定时,该指令可被发送到最小延迟的执行流水线,从而允许该指令的结果被快速解决并最小化任何所导致的处理器内核114的停顿。
在一些情况下,可调度具有设置的D缓存缺失标志的加载指令在最小延迟的或较小延迟的流水线中执行,并且可将该加载指令的结果转发给另一个流水线(例如,其中执行被延迟的流水线)。例如,图9是示出根据本发明的一个实施例使用D缓存缺失信息来确定加载指令的调度的过程900的流程图。如图所示,过程900开始于步骤902,在此从存储器接收将被执行的加载指令。在步骤904,可执行该加载指令,并且在步骤906,如果加载指令导致了缓存缺失,那么可设置指示D缓存缺失的标志。
在步骤908,在随后的预解码期间,可检测到设置的D缓存缺失标志,并且可调度加载指令在可能的最小延迟的执行流水线(例如,流水线P0)中执行。例如,如果最小延迟的流水线不可用,那么可调度该加载指令在相对于处理器内核114中的其他流水线(例如,流水线P1、P2等)来说较小延迟的流水线中执行。在一些情况下,这种调度(例如,到最小延迟的或较小延迟的流水线)仅在加载指令可被发送到该流水线而不需要使指令的执行停顿(例如,以便允许被调度在第一流水线中执行的其他指令被执行)的情况下才被执行。可选地,可调度该加载指令在最小延迟的或较小延迟的执行流水线中执行,即使该调度导致了停顿。
在一些情况下,可记录确认记数。如下面更详细描述的,确认记数可被用来确定D缓存缺失标志是否准确地标识了会导致D缓存缺失的加载指令。如果D缓存缺失标志没有准确地标识会导致D缓存缺失的加载指令,那么在一些情况下,可为调度目的忽略该标志或者修改在其下加载指令被调度的条件。
相应地,在步骤910,在加载指令的随后执行过程中,可执行L2缓存访问以获取加载数据,但是可检查D缓存目录225以确定加载数据是否已经在D缓存224中。如果数据已经在D缓存224中(如由D缓存目录225所指示的),那么在步骤912可减少确认记数(当该数达到零时停止),从而指示考虑中的数据已经在D缓存224中并且没有缓存缺失发生。否则,如果数据不在D缓存224中,那么可增加该记数(直到计数器饱和),从而指示D缓存缺失发生了。
在步骤914,当从L2缓存112接收了加载数据时,可将该加载数据转发到具有更大执行延迟的流水线(例如,大于执行该加载指令的流水线的延迟),如果这种转发对于执行接收所转发的加载数据的流水线中的指令是必要的话。在一些情况下,流水线的延迟的差别量可大于或等于L2缓存访问等待时间,从而允许用于加载指令的L2缓存访问在转发被执行之前结束。因此,通过在最小延迟的执行流水线中执行加载指令,加载数据可被及时接收以被转发和由其他指令利用,例如,在具有更大执行延迟的流水线中被执行。
图10是示出根据本发明的一个实施例其中可转发加载数据的处理器内核1014的框图。如图所示,该处理器内核可包含多个延迟的执行流水线(P0,P1,...P5)。在一些情况下,可提供从一个执行单元310到其他执行单元的转发路径312。在一些情况下,可提供从较小延迟的处理流水线到较大延迟的流水线的转发3100-2,并且这种转发3100-2可被用来转发加载指令的结果到利用所述结果的另一个指令。在一些情况下,可执行从一个执行单元到另一个执行单元的转发3100-2。可选地,在一些情况下,可执行从延迟目标队列330到处理单元310的转发3100-2。
如上所述,在一些情况下,可调度加载指令在多个流水线之一中被执行,这些流水线相对于处理器内核1014中的其他流水线来说延迟较小。例如,针对图10,调度加载指令到流水线P0中可允许执行从流水线P0到具有较大延迟的多个流水线(例如,流水线P3、P4或P5)的转发。然而,如果另一个指令被调度在流水线P0中执行(例如,因为该指令在加载指令被执行之前被执行),那么可将加载指令放置在相对于内核1014中的其他流水线具有较小延迟的另一个流水线中(例如,流水线P1或P2)。通过放置加载指令在较小延迟的流水线中,可提供到具有较大延迟的流水线之一转发。例如,流水线P1可提供到流水线P4或P5的转发,而流水线P2可提供到流水线P5的转发。通过提供可从其转发加载数据的多个较小延迟的流水线,可为调度可导致D缓存缺失的加载指令的执行提供更大的灵活性。
如上所述,可使用确认记数例如来确定如何执行加载指令。例如,如果确认记数在某个阈值之上(例如,如果确认记数是2或3),则可如上面所述将加载指令发送到最小延迟的或较小延迟的流水线,而不论该加载指令在发送期间是否被停顿。例如,在一些情况下,程序可能执行一串依赖的加载,其中每个加载都利用先前加载指令的结果来执行随后加载。这种依赖加载串可在程序利用一系列指针来访问数据时发生。当依赖加载串被处理器110接收以便执行时,并且当依赖加载串中的指令(例如,依赖加载串中的第一个指令)导致缓存缺失时,指令中的每一个可被停顿直到第一个指令所加载的数据被读取。在一些情况下这种停顿可能是有利的,因为在指令执行被停顿并且指令未被处理时处理器110可消耗较少的功率。
如果确认记数在另一个范围内,在上阈值和下阈值之间(例如,如果确认记数是1),那么预解码器和调度器电路220可尝试调度该加载指令到最小延迟的或较少延迟的执行流水线中,但是如果该加载指令不能无需停顿地被调度到最小延迟的或较少延迟的执行流水线中,那么处理器相反可发送该加载指令到处理器流水线之一(例如,流水线P3、P4或更大的)并放弃在较少延迟的流水线之一中执行该加载指令。
此外,如果确认记数低于给定阈值(例如,低于低阈值,比如如果确认记数是零),那么预解码器和调度器220可预测该加载指令将不会导致缓存缺失,并可将该加载指令放置在默认发送组中以便执行(例如,该加载指令被正常调度)。此外,在一些情况下,如果确认记数达到了零,那么可清除用于该加载指令的D缓存缺失标志,即使该缺失标志是所谓的“粘着位”。
在一些情况下,处理器110可检测加载串,并响应于检测到依赖的加载串而修改D缓存缺失信息的存储。例如,当试图访问同一个数据线的多个加载指令的每一个都导致缓存缺失时,对处理器来说只将加载指令组中第一个加载指令标记为缓存缺失就足够了,因为在该数据线被该第一个加载指令加载之后,随后的加载指令可利用同一数据线以便立即执行。这种确定可包括检测多个导致缓存缺失的加载指令,比较用于多个所检测的加载指令的加载地址,并确定哪些所检测的加载指令具有相同的加载地址。当处理器110已确定了哪些加载指令具有相同的加载地址之后,该处理器可确定哪个加载指令被最早执行(例如,第一个加载指令)并仅设置用于所检测的匹配加载指令的组中第一个加载指令的D缓存缺失标志。
在一个实施例中,当发送组包含多个加载指令时,其中每个都具有相关联的预测级别,可根据用于每个指令的预测级别给予调度的优先权。例如,当一加载指令被强烈预测为会导致D缓存缺失时,可在相同发送组中被微弱地预测为会导致D缓存缺失的指令之前调度该指令在最大延迟的流水线中执行。可选的,发送组可被分割为两个发送组,从而允许每个指令被发送到最大延迟的执行流水线中。
在一些情况下,可以选择在最大延迟的执行流水线中的延迟量以使得延迟大于或等于完成L2缓存访问所需要的时间量,从而隐藏L2缓存访问等待时间。例如,L2缓存访问时间可被测量为从确定L1缓存不包含所请求的数据的时间开始到所请求的数据可以从L2缓存112获得的时间(假定该数据不需要从较高级别的缓存和/或存储器中读取)。换句话说,如果在L1 D缓存目录225指示所请求的数据不在D缓存224中之后,需要7个周期来完成L2缓存访问,那么可将最大延迟流水线中的延迟总量设置为7个周期,从而允许指令被重新发送到最大延迟的流水线,被保持在延迟队列3103中,并在所请求的数据从L2缓存112到达时被执行。在最大延迟的执行流水线中插入这种延迟可以例如通过在延迟队列320中插入阶段延迟来执行。
在一些情况下,在发起L2缓存访问(例如,对于被预测为会导致D缓存缺失的加载指令)之前,L2缓存访问电路210从该L2缓存预取D线,L2缓存访问电路210可首先使用D缓存目录225来确定包含该加载指令的目标数据的D线是否已经位于D缓存中。当L1目录225指示D线已经位于该D缓存中时,L2预取会是不必要的并且L2预取电路可不发送预取请求到L2缓存112。当D缓存目录225指示D线还没有位于D缓存224中时,L2缓存访问电路210可从L2缓存112请求合适的D线。
在一些情况下,当MIS位已经被设置并且预测一指令很可能导致D缓存缺失时,该预测可能变得不可靠,例如,执行该指令可能不会导致D缓存缺失。在这种情况下,该MIS位可被以后清除,如果对该指令的重复执行没有导致D缓存缺失的话。例如,一计数器可记录该加载指令先前没有导致D缓存缺失的次数。每次该指令导致了D缓存缺失,那么可重置该计数器为0。每次该指令没有导致D缓存缺失,那么可增加该计数器。当该计数器达到给定阈值(例如,4次连续没有缺失),那么可清除预测位MIS。可选的,作为对每次该指令导致缺失都重置记数器的替代,可减小计数器。
通过提供用于清除MIS预测位的机制,处理器可以避免不必要地将给定加载指令调度到最大延迟的执行流水线中。此外,当预测位被清除时,另一个位或多个位可被设置来指示该指令是否导致D缓存缺失是不可预测的。如上所述,当加载指令的结果是不可预测时,该加载指令被发送到最小延迟的流水线中以及早解决该加载指令的结果,并因此最小化任何所导致的处理器停顿。
虽然前述说明针对的是本发明的实施例,但是可以在不脱离本发明基本范围的情况下设计出本发明其他的和进一步的实施例,并且本发明的范围是由后面的权利要求确定的。
权利要求
1.一种调度处理器中指令的执行的方法,该处理器具有至少一个级联的、延迟的执行流水线单元,该单元具有两个或更多个以相对于彼此为延迟的方式执行公共发送组中的指令的执行流水线,该方法包括接收指令的发送组;确定该发送组中的第一指令是否是加载指令;以及如果是,那么调度该第一指令将在一流水线中执行,其中该流水线中的执行相对于该级联的、延迟的执行流水线单元中的另一个流水线是不被延迟的。
2.如权利要求1所述的方法,进一步包括发送所述发送组到所述至少一个级联的、延迟的执行流水线;确定在该发送的发送组中的所述第一指令是否导致了缓存缺失;如果该发送的发送组中的该第一指令在一级缓存中导致了缓存缺失,那么从二级缓存请求用于该第一指令的目标数据;以及调度该第一指令将在一流水线中执行,其中该流水线中的执行相对于该级联的、延迟的执行流水线单元中的另一个流水线是被延迟的。
3.如权利要求2所述的方法,其中,如果所述发送的发送组中的所述第一指令导致了缓存缺失,那么该第一指令被编码为具有指示发生了缓存缺失的至少一个位。
4.如权利要求3所述的方法,其中所述编码的第一指令被写回到一级缓存。
5.如权利要求3所述的方法,其中如果在训练阶段期间发生缓存缺失,那么所述第一指令被编码为具有至少一个位,并且其中在训练阶段终止之后该第一指令不被编码为具有该至少一个位。
6.如权利要求1所述的方法,其中在所述第一指令的随后执行期间,如果该第一指令先前没有导致一个或多个缓存缺失,那么调度该第一指令将在一流水线中执行,其中该流水线中的执行相对于所述级联的、延迟的执行流水线单元中的另一个流水线是不被延迟的。
7.如权利要求1所述的方法,其中如果所述发送的发送组中的所述第一指令导致了缓存缺失,那么将该第一指令所请求的数据的目标地址的至少一部分附加到包含该第一指令的指令线。
8.如权利要求1所述的方法,其中如果所述发送的发送组中的所述第一指令导致了缓存缺失,那么将在该第一指令之后发送的一个或多个指令无效。
9.一种集成电路设备,包括级联的、延迟的执行流水线单元,其具有两个或更多个以相对于彼此为延迟的方式执行公共发送组中的指令的执行流水线;被配置为执行以下操作的电路接收指令的发送组;确定该发送组中的第一指令是否是加载指令;以及如果是,那么调度该第一指令将在一流水线中被执行,其中该流水线中的执行相对于该级联的、延迟的执行流水线单元中的另一个流水线是不被延迟的。
10.如权利要求9所述的集成电路设备,其中所述电路被进一步配置为发送所述发送组到所述至少一个级联的、延迟的执行流水线;确定该发送的发送组中的所述第一指令是否导致了缓存缺失;如果该发送的发送组中的该第一指令在一级缓存中导致了缓存缺失,那么从二级缓存请求用于该第一指令的目标数据;以及调度该第一指令将在一流水线中执行,其中该流水线中的执行相对于该级联的、延迟的执行流水线单元中的另一个流水线是被延迟的。
11.如权利要求10所述的集成电路设备,其中如果所述发送的发送组中的所述第一指令导致了缓存缺失,那么该第一指令被编码为具有指示发生了缓存缺失的至少一个位。
12.如权利要求11所述的集成电路设备,其中所述编码的第一指令被写回到一级缓存。
13.如权利要求11所述的集成电路设备,其中如果在训练阶段期间发生缓存缺失,那么所述第一指令被编码具有所述至少一个位,并且其中在该训练阶段终止之后,该第一指令不被编码为具有该至少一个位。
14.如权利要求9所述的集成电路设备,其中在所述第一指令接的随后执行期间,如果该第一指令先前没有导致一个或多个缓存缺失,那么调度该第一指令将在一流水线中执行,其中该流水线中的执行相对于所述级联的、延迟的执行流水线单元中的另一个流水线是不被延迟的。
15.如权利要求9所述的集成电路设备,其中如果所述发送的发送组中的所述第一指令导致了缓存缺失,那么将该第一指令所请求的数据的目标地址的至少一部分附加到包含该第一指令的指令线。
16.如权利要求9所述的集成电路设备,其中如果所述发送的发送组中的所述第一指令导致了缓存缺失,那么将在该第一指令之后发送的一个或多个指令无效。
17.一种处理器,包括二级缓存;一级缓存;级联的、延迟的执行流水线单元,其具有两个或更多个以相对于彼此为延迟的方式执行公共发送组中的指令的执行流水线;预解码器电路,其被配置为从该二级缓存接收将被作为发送的组发送的指令组;确定该指令组中的第一指令是否是加载指令;如果是,那么调度该第一指令将在一流水线中执行,其中该流水线中的执行相对于该级联的、延迟的执行流水线单元中的另一个流水线是不被延迟的;以及发送该指令组到该一级缓存。
18.如权利要求17所述的处理器,进一步包括分派电路,其被配置为从所述一级缓存接收指令组;将该指令组组织为发送组;以及分派该发送组到所述级联的、延迟的执行流水线单元。
19.如权利要求17所述的处理器,其中如果所述发送的发送组中的第一指令导致了缓存缺失,那么从所述二级缓存请求用于该第一指令的目标数据;以及形成第二发送组,其中调度该第一指令将在一流水线中执行,其中该流水线中的执行相对于所述级联的、延迟的执行流水线单元中的另一个流水线是被延迟的。
20.如权利要求19所述的处理器,其中执行被延迟的所述流水线包括延迟队列和执行单元,其中在所述第二发送组中的第二指令在所述另一个流水线中被执行时,将所述第一指令保持在该延迟队列中,并且其中在该第二指令已经被执行之后,在该执行单元中执行该第一指令。
全文摘要
提供了一种用于最小化未调度的D缓存缺失流水线停顿的方法和装置。在一个实施例中,调度处理器中指令的执行。该处理器可具有至少一个级联的、延迟的执行流水线单元,该单元具有两个或更多个以相对于彼此为延迟的方式执行公共发送组中的指令的执行流水线。该方法包括接收指令的发送组,确定该发送组中的第一指令是否是加载指令,并且如果是的话,调度该第一指令将在一流水线中执行,其中该流水线中的执行相对于级联的、延迟的执行流水线单元中的另一个流水线是不被延迟的。
文档编号G06F12/08GK101025681SQ20071000703
公开日2007年8月29日 申请日期2007年2月7日 优先权日2006年2月9日
发明者D·A·卢伊克 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1