背景技术
为了实现高性能计算,多个独立的处理器被互连,以形成能够进行并行处理的多处理器计算机系统。多个处理器可以被放置在单个芯片上,或被放置在在多处理器计算机系统中互连的若干个芯片上,每个芯片包含一个或多个处理器。
多处理器计算机系统中的处理器使用私有高速缓冲存储器,这是因为其短暂的访问时间(高速缓存处于处理器本地,并提供对数据的快速访问),并且以便减少到主存储器的存储器请求的数量。不过,管理多处理器系统中的高速缓存是复杂的。由于可以并发地存在于多处理器系统中的主存储器数据的多个拷贝的存在,多个私有的高速缓存引入了多高速缓存的一致性问题(或陈旧数据问题)。
小规模共享存储器多处理系统具有通过单个总线互连的处理器(或处理器组)。不过,随着处理器速度的增加,可以共享总线的处理器的可能数量有效降低。
维护多处理器之间的一致性的协议被称作高速缓存一致性协议。高速缓存一致性协议跟踪处理器之间的数据块的任意共享。取决于数据共享怎样被跟踪,高速缓存一致性协议可以被分组为两个类别:1)基于目录,以及2)监听。
在基于目录的方案中,物理存储器块的共享状态仅被保持在被称为一致性目录的一个位置中。一致性目录一般是大型存储器块,其跟踪多处理器计算机系统中的哪个处理器拥有哪些存储器行。不利的是,一致性目录典型地很大且很慢。它们可能严重降低整体系统性能,因为它们通过要求对存储器的每次访问均通过一个公共目录,而引入了对每次存储器访问请求的附加等待时间。
图1示出了使用针对高速缓存一致性的一致性目录方案的典型的现有技术多处理器系统10。多处理器系统10包括多个处理器15a,...,15d,其经由共享总线24并分别经由存储器控制器22a、22b互连到共享存储器20a、20b。每个处理器15a,...,15d分别具有其自身的私有高速缓存17a,...,17d,这些高速缓存是N路组关联(set associative)的。来自处理器的对存储器的每个请求被放置在处理器总线24上,并被指引到一致性目录26。在一致性控制器中常常包含下述模块,其跟踪特定子系统中保存的高速缓存行的位置,以消除将不需要的监听请求广播到所有高速缓存代理的需要。此单元常常被标记为“监听控制器”或“监听过滤器”。来自I/O子系统28的全部存储器访问请求也被指引到一致性控制器26。代替于主存储器,连接于主存储器的次级高速缓存可以被使用。处理器可以被分组为处理器聚类,其中每个聚类具有其自身的聚类总线,所述聚类总线接着连接到一致性控制器26。当每个存储器请求通过一致性目录时,向每个请求添加用于检查所请求的存储器块的状态的附加的循环。
在监听方案中,不保持任何集中化状态,而是每个高速缓存在本地保持数据块的共享状态。高速缓存通常位于共享存储器总线上,并且所有的高速缓存控制器监听(监视)该总线,以确定它们是否具有所请求的数据块的拷贝。通常使用的监听方法是“写无效(write-invalidate)”协议。在此协议中,处理器在它写入数据之前确保它具有对该数据的独占访问。在每次写入时,数据在所有其它高速缓存中的所有其它拷贝被无效。如果两个或更多个处理器试图同时写入同样的数据,则仅它们中之一赢得竞争,使得其它处理器的拷贝被无效。
为了在基于写无效协议的系统中实施写入,处理器获得共享总线,并在总线上广播将被无效的地址。所有处理器在总线上进行监听,并进行检查以看看该数据是否在其高速缓存中。如果是,则这些数据被无效。因此,共享总线的使用强制实施了写串行化。
不利的是,在监听方案中的每次总线事务必须检查高速缓存地址标志,其可以妨碍CPU高速缓存访问。在最近的体系结构中,这种情况典型地通过复制地址标志来减少,从而CPU和监听请求可以并行进行。可替换方案是以包括方式使用多级高速缓存,使得主要高速缓存中的每个条目被复制到较低级的高速缓存中。接着,监听活动在次级高速缓存上实施,并且不会妨碍CPU活动。
图2示出了使用针对高速缓存一致性的监听方案的典型的现有技术多处理器系统50。多处理器系统50包含多个处理器52a,...,52c,其经由共享总线56互连到主存储器58。每个处理器52a,...,52c具有其自身的私有高速缓存54a,...,54c,这些高速缓存是N路组关联的。来自处理器的对存储器的每个写请求被放置在处理器总线56上。所有处理器在总线上进行监听,并检查其高速缓存以看看被写入的地址是否也位于其高速缓存中。如果是,则对应于此地址的数据被无效。若干多处理器系统在本地将一个模块添加到每个处理器,以跟踪将被无效的高速缓存行是否被保存在特定高速缓存中,由此有效地减少本地监听活动。此单元通常被标记为“监听过滤器”。代替于主存储器,连接于主存储器的次级高速缓存可以被使用。
随着总线上的处理器数量的增加,监听活动也在增加。对高速缓存的不必要的监听请求可以降低处理器性能,并且访问高速缓存目录的每个监听请求耗能。此外,为每个处理器复制高速缓存目录以支持监听活动显著地增加了芯片大小。这对于具有有限功率分配的单个芯片上的系统来说是特别重要的。
以下是对现有技术参考的描述,其解决了在多处理器系统中发现的传统监听方案的多种问题。
具体而言,美国专利申请US2003/0135696A1和美国专利No.6,704,845B2均描述了替换策略方法,用于针对包括监听过滤器的基于一致性目录的方案替换监听过滤器中的条目。监听过滤器包含关于被高速缓存的存储器块(其中高速缓存行被高速缓存)及其状态的信息。美国专利申请US2004/0003184A1描述了包含子监听过滤器的监听过滤器,用于记录奇偶地址行,所述奇偶地址行记录由远程节点访问的本地高速缓存行(子过滤器使用相同的过滤方案)。这些公开中的每个并未讲授或建议一种用于在多处理器系统中在本地减少呈现给每个高速缓存的监听请求的数量的系统和方法。它们既没有讲授或建议将若干监听过滤器与多种过滤方法相耦合,也没有讲授或建议向高速缓存提供监听信息的点对点互连。
美国专利申请US2003/0070016A1和US2003/0065843A1描述了一种具有中央一致性目录包含监听过滤器的多处理器系统。在这些应用中描述的监听过滤器减少了处理监听请求的循环的数量,但是并未减少呈现给高速缓存的监听请求的数量。
美国专利No.5,966,729描述了一种使用针对高速缓存一致性的监听方案和在本地关联于每个处理器组的监听过滤器的共享总线的多处理器系统。为了减少监听活动,在特定高速缓存行中的远程处理器组(“感兴趣”和“不感兴趣”)的列表被保持。监听请求仅被转发到被标记为“感兴趣”的处理器组,由此减少被广播的监听请求的数量。其并未描述如何减少到本地处理器的监听请求的数量,而是描述了如何减少被发送到被标记为“不感兴趣”的其它处理器组的监听请求的数量。此方案需要保持具有关于针对处理器组的高速缓存中的每个行的感兴趣组的信息的列表,其在大小上可类似于将处理器组中的每个处理器的高速缓存目录进行复制,从而显著增加了芯片大小。
美国专利No.6,389,517B1描述了一种用于监听高速缓存一致性以允许从具有两个访问队列的监听访问和处理器二者对高速缓存的并行访问的方法。所公开的实施例涉及共享总线配置。其并未描述用于减少呈现给高速缓存的监听请求的数量的方法。
美国专利No.5,572,701描述了一种用于减少低速总线对高速总线和处理器的妨碍的基于总线的监听方法。监听总线控制单元将来自低速总线的地址和数据进行缓冲,直到处理器释放高速总线为止。接着其传输数据并使高速缓存中的对应行无效。此公开并未描述其中所有组件经由高速总线通信的多处理器系统。
A.Moshovos、G.Memik、B.Falsafi和A.Choudhary的题为“JETTY:filtering snoops for reduced energy consumption in SMP servers”(“Jetty”)的参考中描述了用于使用硬件过滤器来减少监听请求的若干提议。其描述了其中监听请求经由共享系统总线分布的多处理器系统。为了减少呈现给处理器的监听请求的数量,使用一个或若干个各种监听过滤器。
不过,在Jetty中描述的系统关于性能、所支持的系统、以及更具体的互连体系结构有明显限制,并且缺少对多端口的支持。更具体地,在Jetty中描述的方案基于共享系统总线,其建立了在整个系统中排序的公共事件。尽管这种全局时间排序对于简化过滤器体系结构来说是理想的,但是它把可能的系统配置限制为具有单个共享总线的那些系统配置。而且,由于对单个全局资源的争用,共享总线系统众所周知在规模上受限。此外,由于附接于全局总线的多组件的高负载,全局总线倾向于很慢,并且在放置于芯片多处理器中时是低效的。
因此,在高度优化的高带宽系统中,提供可替换的系统体系结构(诸如星形或点对点实现)是理想的。这些体系结构具有优势,因为它们仅具有单个发送者和传输者,从而减少了负载,允许高速协议的使用,以及简化了芯片多处理器中的平面规划。使用点对点协议还允许具有同时进行中的若干传输,从而增加了数据传输的并行性以及整体数据吞吐量。
Jetty的其它限制包括:无法同时实施对若干请求的监听过滤,因为在Jetty中,同时来自若干处理器的监听请求必须由系统总线进行串行化。允许对若干监听请求进行并行处理将提供可以在任一时间进行处理的请求数量的显著增加,以及由此增加了整体系统性能。
在阐述了现有技术的限制之后,显而易见,所需要的是一种系统,其结合了监听过滤器以增加整体性能和功率效率,而不会限制系统设计选项,并且更具体地,所需要的是在不需要公共总线的系统中支持监听过滤的方法和装置。
此外,需要一种支持使用点对点连接的系统以允许使用监听过滤的高性能系统的实现的监听过滤体系结构。
还需要用于并行地过滤来自多个存储器写入器的请求以增加系统性能的多个监听过滤器的同时操作。
还需要提供新颖的高性能监听过滤器,其可以用管道化方式实现,以使能在利用这种监听过滤器的系统中的高系统时钟速度。
还需要超越现有技术的限制的、具有高过滤效率的监听过滤器。
具体实施方式
现在参考附图,并具体参考图3,示出了具有对针对高速缓存一致性的监听方案的使用的多处理器系统的整体基本体系结构。在优选实施例中,多处理器系统包括N个处理器100a,...,100n(或被标记为DCU1至DCUN的CPU),其具有其本地L1数据和指令高速缓存以及相关联的L2高速缓存120a,...,120n。主存储器130被共享并可以在片内或片外实现。在可替换实施例中,代替于主存储器,具有对主存储器的访问的共享L3可以被使用。在优选实施例中,处理器核心100a,...,100n是PowerPC核心,诸如PPC440或PPC405,但是任意其它处理器核心也可以被使用,或者在单个多处理器系统中的多种处理器的某种组合可以被使用,而不会脱离本发明的范围。处理器核心100a,...,100n通过系统局部总线150互连。
为了减少呈现给处理器的监听请求的数量,以及由此减少对处理器的监听和系统性能的影响,以及减少不必要的监听请求的耗能,为多处理器系统10中的每个相应的处理器核心100a,...,100n提供监听过滤器140a,...,140n。对于传输监听请求,优选实施例不使用典型在现有技术系统中出现的系统总线150,而是实现了点对点互连160,由此每个处理器的相关联的监听过滤器被直接与关联于系统中的每个其它处理器的每个监听过滤器相连接。因此,监听请求从经由系统局部总线传输的所有其它存储器请求中分离,这减少了通常是系统瓶颈的总线拥塞。所有到单个处理器的监听请求被转发给监听过滤器140a,...,140n,其包括具有相同过滤方法或具有若干不同过滤方法或二者的任意组合的若干子过滤器,如在此将更详细描述的。监听过滤器处理每个监听请求,并仅将可能在处理器的高速缓存中的所有请求的一部分呈现给处理器。
对于每个处理器,监听请求使用点对点互连160直接连接到所有其它处理器的监听过滤器。因此,来自不同处理器的若干监听请求(通过写和无效尝试而得出)可以同时出现。这些请求不再被串行化,如同使用系统总线的典型监听方案中那样,其中由总线实施这种串行化。即,多个监听请求可以在监听过滤器中并行处理,如在此将更详细描述的。因为处理器仅具有一个监听端口,所以未被监听过滤器过滤掉的监听请求将在要呈现给处理器的队列中进行串行化。不过,通过处理器的请求的数量比已预先过滤的所有监听请求的数量少得多,这减少了高速缓存一致性实现对系统性能的影响。
为了防止包含在监听过滤器块中的队列的队列溢出状况,对于每个点对点链路实现基于权标的流控制系统,以限制同时未完成的请求的数量。根据基于权标的流控制,每个存储器写入器仅在它具有下述权标的情况下可以发送下一个写请求(其还启动对所有其它处理器单元和伴随的监听过滤器块的监听请求),所述权标可用于写入器具有直接点对点连接的监听过滤器块的所有端口。如果不存在可从写入器所连接的至少一个远程端口得到的权标,则不可从该存储器写入器发送出任何监听请求,直到来自所述监听过滤器端口的至少一个权标再次成为可用为止。
图4示出了本发明的可替换实施例,其具有使用针对高速缓存一致性的监听方案的使用用于监听请求的点对点互连的基本多处理器系统,其中监听过滤器被放置在L2高速缓存和主存储器230之间。由此,根据此实施例的多处理器系统包括N个处理器200a,...,200n(或被标记为DCU1至DCUN的CPU),其具有其本地L1数据和指令高速缓存以及相关联的L2高速缓存220a,...,220n。主存储器130被共享并可以在片内或片外实现。在可替换实施例中,代替于主存储器,具有对主存储器的访问的共享L3可以被使用。来自处理器200a,...,200n的所有存储器访问请求经由系统局部总线250被传输。在图4所描述的实施例中,多处理器系统中的每个处理器与相应的监听过滤器240a,...,240n成对。在优选实施例中点对点互连260被用于传输监听请求,以便减少系统总线拥塞。在这种点对点连接方案260中,每个处理器的相关联的监听过滤器被直接与关联于系统中的每个其它处理器的每个监听过滤器相连接。所有到单个处理器的监听请求被转发给其监听过滤器,该监听过滤器处理每个监听请求,并仅将所有请求的适当一部分转发给处理器。在此实施例中,监听请求在L2高速缓存级(不在L1,如图3所示的前一实施例中那样)被过滤,但是本发明适用于任何高速缓存级,并且可被用于高速缓存层级结构的其它级,而不会脱离本发明的范围。
现在参考图5,描述了根据本发明的监听过滤器设备的高级框图。来自多处理器系统中的所有其它处理器1至N的监听请求经由专用点对点互连输入300a,...,300n被转发给监听块310。监听块310过滤进入的监听,并经由处理器监听接口340将适当的子集转发给处理器320。此外,监听块310监视从处理器和L1数据高速缓存块320到L2高速缓存330的所有存储器访问请求。这些仅是在L1高速缓存中缺失(miss)的请求。监听块监视所有读地址和控制信号360和362,以相应地更新其过滤器。
图6描述了在图5中描述的监听块310的高级示图。如图6所示,监听块310包括并行地工作的多个(“N个”)端口监听过滤器400a,...,400n,其中每个监听过滤器仅专用于N个存储器写入器(处理器或DMA引擎子系统等)的一个源。每个端口监听过滤器400a,...,400n在其专用输入410a,...,410n上接收来自直接点对点连接的单个源的监听请求。如此处将描述的,单个端口监听过滤器可包括多个多种监听过滤方法。此外,监听块310包括流寄存器块430以及监听权标控制块426。此外,每个端口监听过滤器400a,...,400n监视在处理器的L1级高速缓存中缺失的来自其相关联的处理器的所有存储器读访问请求412。此信息也被提供给流寄存器块430,用于在此将更详细描述的使用。
在操作中,端口监听过滤器400a,...,400n处理进入的监听请求,并将所有监听请求的子集转发给相应的监听队列420a,...,420n,其具有关联于每个监听端口的一个队列。提供了队列判优块422,其在所有监听队列420之间进行判优,并公平地将来自监听队列420的所有监听请求串行化。提供了逻辑来检测监听队列溢出状况,并且每个队列的状态是到监听权标控制块426的输入,监听权标控制块426控制来自远程存储器写入器的监听请求流。存储器写入器(作为处理器或DMA引擎)可以将写入提交到存储器,以及仅在具有可从所有监听过滤器得到的权标时将监听请求提交到所有监听过滤器。仅有下述监听过滤器是其自身的本地监听过滤器,其中,处理器不需要来自所述监听过滤器的可用于提交写入的权标。此机制确保监听队列不会溢出。通过由判优器422选择的监听队列,监听请求经由处理器监听接口408被转发到处理器。
图7示出了单个监听端口过滤器400的高级示图。监听端口过滤器块400包括实现多种过滤算法的多个过滤器单元。在优选实施例中,三个监听过滤器块440、444和448并行工作,每个监听过滤器块实现不同的监听过滤算法。监听过滤器块被标记为监听高速缓存440、流寄存器检查单元444、以及范围过滤器448。在一实施例中,并行监听过滤器块的每个在其输入端同时从单个源接收同样的监听请求410。此外,监听高速缓存440监视在L1级高速缓存中缺失的来自处理器的所有存储器读访问请求412,并且流寄存器检查单元444从图6中描述的流寄存器单元430接收状态输入432。
根据优选实施例,监听高速缓存块440使用基于监听请求的时间局部性属性的算法来过滤监听请求410,这意味着,如果做出了针对特定位置的单个监听请求,则很可能不久将会做出对同一位置的另一请求。监听高速缓存监视对于本地高速缓存进行的每次加载,并在需要时更新其状态。流寄存器检查块444使用确定当前的本地高速缓存内容的超集的算法来过滤监听请求410。高速缓存内容的近似值被包括在流寄存器块430(图6)中,并且流寄存器状态432被转发到每个监听端口过滤器400。基于此状态,对于每个新的监听请求410,做出监听地址是否可能被包含在本地高速缓存中的决定。监听端口过滤器中的第三过滤单元是范围过滤器448。对于此过滤方案,指定了两个范围地址:最小范围地址和最大范围地址。实施对监听请求的过滤是通过:首先确定监听请求是否在由这两个范围地址确定的地址范围之内。如果满足该条件,则监听请求被丢弃;否则,监听请求被转发到决定逻辑块450。相反地,当请求落在地址范围内时可以被转发,否则就被丢弃,这不会脱离本发明的范围。具体地,决定逻辑块450接收所有三个过滤单元440、444和448的结果456连同控制信号454,所述控制信号454使能或禁用每个单独的监听过滤器单元。在每个过滤决定中仅考虑相应控制信号被使能的监听过滤器单元的结果。如果过滤单元440、444或448中的任一个决定监听请求410应该被丢弃,则监听请求被丢弃。此单元所得到的输出或者是将监听请求添加到相应的监听队列452,或者是丢弃监听请求并将监听权标458返回启动了该被丢弃的监听请求的远程处理器或DMA单元。
在优选实施例中,在端口监听过滤器中仅包括了实现上述算法的三个过滤单元,但是本领域技术人员将理解,可以在单个端口监听过滤器中包括任意其它数量的监听过滤器单元,或者可以在端口监听过滤器中实现某种其它监听过滤算法,或者可以实现监听算法的组合,而不会脱离本发明的范围。
图8(a)和8(b)描述了图6的监听过滤器块310的两个可替换实施例的高级示图。如此处关于图6所述的,监听块可以包括可使用多种过滤方案、相同过滤方案、或二者的组合的多个监听过滤器。如图8(a)所示,N个端口监听过滤器460a,...,460n并行地工作,其中每个端口监听过滤器针对N个远程存储器写入器中的每个。端口监听过滤器块460a,...,460n的每个在其各自输入462a,...,462n从点对点连接的单个专用源接收监听请求。此外,每个监听过滤器460a,...,460n监视所有的在L1级高速缓存中缺失的本地处理器的存储器加载请求464。如果所实现的过滤算法需要的话,也可需要将来自监听块的其它单元的其它信号供应给端口监听过滤器。所需要的确切信号由在单个端口监听过滤器460中实现的一个或多个监听过滤算法来确定。此外,应该理解,所有的端口监听过滤器不用必须实现同一组过滤算法。
端口监听过滤器460a,...,460n过滤进入的监听,并将适当的未过滤的监听请求子集转发到相应的队列466a,...,466n以及队列判优块468中。在此,监听请求被串行化并被呈现给下一个监听过滤器470,其处理来自所有远程存储器写入器的输入。此共享监听过滤器470处理所呈现的所有监听请求并将所有请求的子集转发到监听队列472。从监听队列472中,监听请求经由处理器监听接口474被转发处理器。应该理解,代替于图8(a)中所示的配置,可以具有多个共享监听过滤器470,或者没有共享监听过滤器470。在多个共享过滤器的情形中,过滤器可以被并行或串联(在此情形中,例如,一个过滤器的输出是下一个过滤器的输入)安置。如果过滤器具有来自多于一个源的输入(即,其在多个源之间共享),则它必须具有其自身的输入队列以及用于将监听请求串行化的判优器。所有监听请求的最终的已排序子集被放置在监听队列472中,并且监听请求经由处理器监听接口474被转发到处理器。可选地,提供了监听队列已满指示信号476,其指示出监听队列何时已满,以便阻止某些或全部远程存储器写入器发出另外的监听请求,直到监听队列中的监听数量降到预定级别之下为止。
类似地,图8(b)示出具有监听块310中的监听过滤器的可替换组织的另一实施例。N个端口监听过滤器480a,...,480n并行地工作,其中每个端口监听过滤器仅从N个远程存储器写入器中之一(即,排除监听过滤器所附接于的处理器)接收监听请求。每个端口监听过滤器480a,...,480n在其各自输入仅从单个源分别接收监听请求482a,...,482n。共享监听过滤器484并行地连接于端口监听过滤器设备480a,...,480n。在可替换实施例中,可以并行附接多于一个共享监听过滤器。共享监听过滤器484处理来自所有N个远程存储器写入器的输入。在具有多于一个输入之后,共享过滤器484具有其自身的输入队列486以及用于将监听请求串行化的队列判优器488。此外,在图8(b)所描述的实施例中,所有端口监听过滤器480a,...,480n以及共享监听过滤器484监视在L1级高速缓存中缺失的来自本地处理器的所有存储器读访问请求490。监听过滤器480a,...,480n和484过滤进入的监听请求,并将适当的未过滤子集转发到下一共享监听过滤器492a,...,492n的输入队列。在此,未过滤的监听请求被队列判优器494串行化,并经由处理器监听接口496被转发到处理器。如果监听队列设备492a,...,492n或486中之一已满,则监听队列已满指示498被激活,以阻止全部(或某些)远程存储器写入器发出另外的监听请求,直到监听队列中的监听数量降到预定级别之下为止。
现在参考图9,描述了监听过滤器块310的另一实施例。该块包含N个端口监听过滤器500a,...,500n,对应于端口监听过滤器400、460a,...,460n和480a,...,480n(在图8(a)和8(b)中)。每个端口监听过滤器500a,...,500n包括监听高速缓存设备502a,...,502n,以及监听检查逻辑504a,...,504n。监听高速缓存设备502a,...,502n实现了监听过滤算法,其跟踪来自一个源的最近的监听请求,其中监听请求的源可以是另一处理器、DMA引擎或某种其它单元。对于来自单个源的每个新的监听请求,针对监听检查逻辑块504中的监听高速缓存,检查监听请求的地址。如果此比较的结果匹配,即,在监听高速缓存中发现监听请求,则确保所监听的数据不在处理器的本地L1级高速缓存中。因此,不会将任何监听请求转发到监听队列506和监听队列判优器508。如果在监听高速缓存502a,...,502n中没有发现针对当前监听请求的匹配,则使用信号514a,...,514n将监听请求的地址添加到监听高速缓存。并行地,监听请求被转发到监听队列506。
所有的监听高速缓存设备502a,...,502n还从本地处理器接收读地址和请求512,并且比较存储器读访问地址和监听高速缓存502a,...,502n中的条目。如果请求匹配于监听高速缓存中的条目之一,则将此条目从监听高速缓存中移除,因为现在高速缓存行将被会位于处理器的一级高速缓存中。在优选实施例中,并行工作的多个监听高速缓存被使用,其中每个监听高速缓存跟踪来自单个远程存储器写入器的监听请求。在过滤后,取决于实施例,一部分的未过滤监听请求可以被转发到下一端口监听过滤器,或者它们可以进行排队,用于一个或多个共享监听过滤器,或者它们被放置在处理器接口的监听队列中。
应该理解,单个监听高速缓存设备502包括M个高速缓存行(条目)的内部组织,每个条目具有两个字段:地址标志字段和有效行向量。监听高速缓存的地址标志字段典型地与本地处理器的L1高速缓存的地址标志不同,而是它被缩短了在有效行向量中表示的位数量。具体地,有效行向量对若干连续高速缓存行的组进行编码,所述高速缓存行全部共享由相应的地址标志字段表示的相同高位。因此,来自一个地址的n个最低有效位被用于编码2n个连续的L1高速缓存行。在极端情形中,当n为零时,监听高速缓存中的整个条目仅表示一个L1高速缓存行。在此情形中,有效行向量仅具有对应于“有效”位的一个位。
监听高速缓存中的地址标志字段的大小由L1高速缓存行的大小以及被用于编码有效行向量的位数量所确定。在示例性实施例中,对于32位(31:0)的地址长度,L1高速缓存行是32字节长,以及有效行向量为32位,地址位(31:10)被用作地址标志字段(位31为最高有效),地址位(9:5)被编码于有效行向量中,并且地址位(4:0)被忽略,因为它们编码了高速缓存行偏置字节。作为说明,以下列出针对三个不同的存储器写入器(N=3)的三个监听高速缓存,每个监听高速缓存具有M=4个条目,其中地址标志字段从左开始,以及从地址开始的5位被用于编码有效行向量以跟踪32个连续高速缓存行:
·监听请求源1
条目1:01c019e 00000000000000000001000000000000
条目2:01c01a0 00000000000000000000000100000000
条目3:01c01a2 00000000000000000000000000010000
条目4:01407ff 00000000000000000000000110000000
·监听请求源2
条目1:01c01e3 00010000000000000000000000000000
条目2:01c01e5 00000001000000000000000000000000
条目3:01c01e7 00000000000100000000000000000000
条目4:0140bff 00000000000000000000000110000000
·监听请求源3
条目1:01c0227 00000000000000000001000000000000
条目2:01c0229 00000000000000000000000100000000
条目3:01c022b 00000000000000000000000000010000
条目4:0140fff 00000000000000000000000110000000
在此示例中,源1监听高速缓存的条目1已经记录了:十六进制的地址01c019ec最近已被无效,并且可能无法处于L1高速缓存中。因此,到同一高速缓存行的下一监听请求将被过滤掉(丢弃)。类似地,源1监听高速缓存的条目4将使得针对高速缓存行地址01407ff7和01407ff8的监听请求被过滤掉。
现在参考图10,示出了用于实现针对单个监听源的监听高速缓存设备的监听过滤器的控制流。在操作的开始,监听高速缓存中的所有M行都被复位,如步骤600所指示的。当接收到来自监听源i的新的监听请求时,监听请求的地址被解析到“地址标志”字段526和用于访问有效行向量524的位中。监听请求的有效行向量仅具有对应于具有匹配地址标志字段的地址位的每个L1高速缓存的一个位。这在步骤602实施。在步骤604,针对与监听源i相关联的监听高速缓存中的所有标志字段,检查监听请求的“标志”字段。如果监听请求地址标志与存储于监听高速缓存中的地址标志之一相同,则地址标志字段在监听高速缓存中具有命中(hit)。在此之后,将检测到命中的监听高速缓存条目的有效行向量与监听请求的有效行向量进行比较。如果对应于监听请求的有效行向量中的位组的监听高速缓存行中的有效行向量的位被设置,则有效行向量也具有命中。在一优选实施例中,通过实施对位操作数的逻辑操作来实现有效行向量检查。因此,例如,有效行向量检查可以通过对监听请求的有效行向量与监听高速缓存行的有效行向量进行与操作、并检查结果是否为零来实施。可以理解,此外可以使用其它实现方式而不会脱离本发明的范围。可以进一步理解,对有效行向量命中的检查可以与对地址标志位的检查并行地实现。
在步骤606,确定是否“标志”字段匹配且有效行向量中的相应位被设置。如果“标志”字段匹配且有效行向量中的相应位被设置,则监听请求被确保不会处于高速缓存中,如步骤606所指示的。因此,此监听请求不会被转发到高速缓存;它被过滤掉,如步骤608所指示的。
否则,如果地址“标志”字段在监听高速缓存中命中,但是有效行向量中的位未被设置,或者可替换地,如果标志在监听高速缓存中未命中,则这指示出该行可能位于高速缓存中。因此,通过将监听请求放置在监听队列中而将监听请求转发到高速缓存,如步骤612所指示的。此监听请求也被作为新的条目添加到监听高速缓存,如步骤610所指示的。
现在参考图11,示出了描述将新信息添加到监听高速缓存中的过程的步骤610(图10)的细节。这通过若干任务来实现,如现在将描述的。在步骤614,首先确定地址标志是否被存储在监听高速缓存中(即,该地址标志命中)。对于此步骤,可以使用在步骤602(图10)中计算的信息。如果地址标志检查给出命中,则过程进行到步骤624,其中对应于监听请求的所选择的监听高速缓存条目的有效行向量中的位被设置。如果地址标志检查在步骤614给出缺失,则必须将新的监听高速缓存条目分配给新的地址标志,并且过程进行到616,其中确定在监听高速缓存中是否存在可用的空条目。如果确定空条目可用,则选择首个可用的空条目,如步骤620所指示的。否则,如果确定在监听高速缓存中不存在空条目,则监听高速缓存中的活动条目之一被选择用于替换,如步骤618所指示的。替换策略可以是循环法(round-robin)、最近未使用、随机或者对于本领域技术人员已知的任意其它替换策略,而不会脱离本发明的范围。继续到步骤622,新的地址标志接着被写入所选择的监听高速缓存行,并且相应的有效行向量被清空。接着,如步骤624所指示的,对应于监听请求的有效行向量中的位组的所选择的监听高速缓存条目的有效行向量中的位被设置。
在另一实施例中,仅基于监听请求在监听高速缓存中的命中或缺失,不会将新信息添加到监听高速缓存中,而是,新值的添加(成为整个监听高速缓存行或者仅设置有效行向量中的单个位)是基于决定逻辑块450(图7)的决定。在此实施例中,仅在决定逻辑块不会过滤掉监听请求时才将新信息添加到监听高速缓存中。如果在监听端口过滤器块400(图7)中的任意其它过滤器过滤掉监听请求(即,确定数据未处于本地L1高速缓存中),则不会将任何新信息添加到监听高速缓存,但是操作步骤与监听高速缓存命中的情形相同。此实施例的优点在于,监听高速缓存更好地进行工作,因为存储了更少的冗余信息。
现在参考图12,描述了用于从监听高速缓存中移除条目的控制流。对于在本地L1级高速缓存中缺失的每个本地处理器存储器读请求,针对与所有监听请求源相关联的所有监听高速缓存中的所有条目,检查存储器请求的地址。在步骤630,存储器读请求的地址被解析到地址标志字段和用于编码有效行向量的位中。这是在步骤630实施的。在步骤632,确定是否存在一个或多个标志命中。这是通过针对与所有监听源相关联的所有监听高速缓存中的所有标志字段检查存储器请求的“标志”字段来实现的。如果标志检查缺失,则此地址不会被过滤掉,并且不用做任何事。因此,控制流循环回到步骤630,等待来自处理器的下一高速缓存缺失。
返回步骤632,如果确定地址标志与所有监听高速缓存的比较导致了一个或多个命中,则信息必须从其具有命中的所有监听高速缓存中移除。因此,在步骤634,适当的存储器读地址的低位被解码到有效行向量中,并且针对具有命中的监听高速缓存条目的有效行向量进行匹配,如步骤635所指示的。现在进行到步骤636,确定读地址向量中的唯一位组是否也在监听高速缓存的有效行向量中进行设置。如果不存在这样的有效行向量命中(与地址标志字段命中无关),则此存储器地址不会被过滤掉,并且在特定监听高速缓存中不用进行任何改变。因此,控制流进行到步骤640,以检查所有地址标志命中是否已经被处理,并且如果否,则过程返回到步骤635。
不过,如果在步骤636确定读地址向量在有效行向量中命中,则读地址被过滤掉。相应的有效行向量位必须被清空,因为存储器读地址将要被加载到一级高速缓存中。这种对相应的有效行向量中的位的清空在步骤638实施。如果在从有效行向量移除相应位之后,有效行向量的位组数量变成零,则进一步从监听高速缓存中地址标志字段,使得该条目为空。如接下来在步骤640所指示的,针对下述所有监听高速缓存重复检查有效行向量位、将其清空、以及将地址标志清空(如果必要的话)的相同过程,其中所述监听高速缓存命中在本地L1高速缓存中缺失的存储器读请求。在步骤640检查所有命中地址标志行已经被处理的状况。一旦所有的高速缓存行已经被检查,则过程返回步骤630。
在另一实施例中,将本地存储器请求与所有监听高速缓存中的所有地址标志同时进行比较。并行地,可以将本地存储器请求的有效行向量编码与其中同时存在命中的所有监听高速缓存中的所有有效行向量进行比较。接着,这两个结果(地址标志命中和有效行向量命中)可以被结合,以确定必须从中移除相应的有效行向量命中的所有监听高速缓存行,并且所有这些位可以从所有监听高速缓存中的命中高速缓存行中同时移除。
现在参考图13,描述了实现流寄存器的监听过滤器设备的框图。在一优选实施例中,监听过滤器单元包括以下组件:两个流寄存器和屏蔽(mask)组700、监听检查逻辑块702、高速缓存返转(wrap)检测逻辑块706、流寄存器选择逻辑块704、过滤器队列703、处理器判优和多路复用逻辑710。如在此将更详细描述的,与跟踪什么不在高速缓存中的监听高速缓存过滤器不同,流寄存器和屏蔽组700跟踪被加载到处理器的高速缓存中的最近数据。更精确地,流寄存器至少跟踪位于高速缓存中的行,但是可以假定,某些实际未处于高速缓存中的行被高速缓存。不过,将某些不必要的监听请求转发到高速缓存不会影响到正确性。
流寄存器过滤器的中心是流寄存器700自身。每当高速缓存加载新的行时,这些寄存器中之一被更新,所述新行通过适当的控制信号716被呈现给流寄存器。图13中的逻辑块704负责基于当前流寄存器状态和在信号716中被加载到高速缓存中的新行的地址来选择要更新的特定寄存器。
在操作中,从N个远程处理器之一接收的监听请求作为信号714到达,如图13的右手边所示。监听检查逻辑702包括一组端口过滤器,其比较到达的监听请求714的地址与流寄存器700的状态,以确定监听请求是否可能处于高速缓存中。如果是,则请求被转发到队列703,其中它们等待被转发到高速缓存作为实际的高速缓存监听。在图13的排队结构中,N个远程处理器中的每个具有专用的监听请求队列703,图13的排队结构被设计为允许最大的监听请求速率,因为大量的监听请求将被过滤掉,并将不再需要进入队列。可替换的排队结构是可能的,而不会脱离本发明的一般范围。
判优和多路复用逻辑块710仅以公平方式共享N个监听请求队列703之间的高速缓存的监听接口,这确保了针对所有请求的转发进度。
现在提供对于如何更新单个流寄存器的描述。流寄存器实际上包括一对寄存器:“基本”和“屏蔽”,以及一个有效位。基本寄存器跟踪对于由流寄存器表示的所有高速缓存行共用的地址位,而相应的屏蔽寄存器跟踪这些位是哪些。有效位仅指示出流寄存器正在使用中,且当决定是否过滤远程监听请求714时不应被监听检查逻辑702咨询。为了理解以下描述中的示例,考虑具有高速缓存行大小为32字节的232字节的地址空间。在此情形中,高速缓存行加载地址的长度是27位,而流寄存器的基本和屏蔽寄存器的长度也是27位。
首先,有效位被设为零,这指示出流寄存器未在使用中,并且基本和屏蔽寄存器的内容是不相关的。当第一高速缓存行加载地址被添加到此流寄存器时,有效位被设为一,基本寄存器被设为行地址,而屏蔽寄存器的所有位被设为一,这指示出基本寄存器中的所有位是有效的。即,与存储在基本寄存器中的地址确切匹配的地址被认为是处于高速缓存中,而与任何位都不同的地址被认为是未处于高速缓存中。例如,给定第一高速缓存行加载地址是0x1708fb1(0x前缀指示十六进制)。则在加载之后流寄存器的内容是:
基本=0x1708fb1 屏蔽=0x7ffffff 有效=1
随后,当第二高速缓存行加载地址被添加到此流寄存器时,将第二地址与基本寄存器比较,以确定哪些位不同。接着屏蔽寄存器被更新,使得在屏蔽中不同位的位置成为零。这些零由此指示出基本寄存器的相应位是“无关的”,或者可以被假定为采取任意值(零或一)。因此,针对与流寄存器的比较,这些位不再有效。例如,假设第二高速缓存行加载地址是0x1708fb2。则在此第二加载之后流寄存器的内容是:
基本=0x1708fb1 屏蔽=0x7fffffc 有效=1
换句话说,第二地址与基本寄存器在两个最低有效位上不同,这使得这些位在屏蔽寄存器中被清空。此时,流寄存器指示出:地址0x1708fb0、0x1708fb1、0x1708fb2和0x1708fb3均可以处于高速缓存中,因为它不再区分这两个最低有效位。不过,重要的是要注意,实际上已被加载的两个地址被认为是处于高速缓存中。因此,此机制确保了被呈现给流寄存器的所有地址将被包括在其中。在极限情况下,屏蔽寄存器全部变成零,并且每个可能的地址被包括在寄存器中且被认为是处于高速缓存中。显而易见,所述机制可被用于继续将地址添加到流寄存器。
每个高速缓存行加载地址被确切添加到多个流寄存器之一。因此,流寄存器的集合表示了完整的高速缓存状态。由图13中的更新选择逻辑块704做出要更新哪个寄存器的决定。一种可能的选择标准是,选择具有距离行加载地址的最小汉明距离(Hamming distance)的流寄存器(即,将导致最小数量的屏蔽寄存器位变为零的流寄存器)。另一选择标准是,选择其中基本寄存器的最高位匹配行加载地址的最高位的流寄存器。其它选择标准也是可能的并可被实现,而不会脱离本发明的范围。
在选择要更新的流地址寄存器时,将行加载地址与结合其相应的屏蔽寄存器的所有基本寄存器并行地比较。接着将行加载地址添加到所选择的流寄存器,如这里所描述的。
监听检查逻辑块702通过按照以下步骤比较监听地址714与所有流寄存器而确定监听地址714是否可能位于高速缓存中:通过在高速缓存行中移除对应于偏置的低位将监听地址714转换为行地址。通过在基本寄存器和监听行地址之间实施逐位的逻辑异或操作、然后对该结果与屏蔽寄存器进行逐位的逻辑与操作,而将此行地址与单个流寄存器比较。如果这两次逻辑操作的最终结果具有任意非零位,则监听地址在流寄存器中“缺失”,且被认为是不在高速缓存中,直到该流寄存器被涉及到为止。对所有的流寄存器并行地实施同样的比较,并且如果监听行地址在所有流寄存器中缺失,则监听地址被认为是不在高速缓存中且可以被过滤掉(即,不被转发到高速缓存)。相反地,如果监听地址在任意一个流寄存器中命中,则它必须被转发到高速缓存。
对于N个远程监听请求端口中的每个,复制监听检查逻辑702,但它们均共享同一组流寄存器700。
随着时间的过去,当高速缓存行加载地址被添加到流寄存器时,它们对于其关于高速缓存中实际有什么的知识变得越来越不准确。如上述示例所说明的,每个变为零的屏蔽位增加了高速缓存行的数量,其数量是由相应流寄存器指定为在高速缓存中的数量的两倍。一般而言,随着成为零的屏蔽位的数量的增加,将没用的监听请求转发到处理器(即,没有过滤它们)的问题变得更糟。因此,向流寄存器监听过滤器提供了一种用于将寄存器回收成为初始状况的机制。此机制基于下述观察,即,一般而言,被加载到高速缓存中的行替换了已经在高速缓存中的行。无论何时当一行被替换时,可以将它从流寄存器中移除,因为流寄存器仅跟踪哪些行在高速缓存中。与移除单独的行不同,无论何时当高速缓存已经被完全替换时,流寄存器监听过滤器有效地批量进行移除并清空寄存器。不过,正在进行此替换的新的高速缓存行也被添加到流寄存器中,所以这些寄存器的内容不会被简单地丢弃。
为了解决此困境,流寄存器监听过滤器实施以下步骤:从初始高速缓存状态开始,就出现流寄存器更新,如在前文所述的。向高速缓存返转检测逻辑块706提供了下述功能,其用于监视由高速缓存更新信号717表示的高速缓存更新以及确定当前为初始状态的所有高速缓存行何时已经被新行所盖写,即,该高速缓存已“返转”。在此时,所有流寄存器(将其称为“活动”组)的内容被拷贝到流寄存器的第二“历史”组,并且活动组中的流寄存器全部返回到无效状态,以重新开始积累高速缓存行加载地址。此外,出于检测下一高速缓存返转的目的,在返转时的高速缓存状态变成新的初始状态。历史组中的流寄存器不再被更新。不过,当决定监听地址是否可以位于高速缓存中时,它们被监听检查逻辑702认为与活动组相同。通过此机制,当高速缓存被盖写时,流寄存器被定期地回收。
取决于高速缓存更新策略以及高速缓存更新信号717,存在可以检测到高速缓存返转的多种方式。例如,如果高速缓存指定了被盖写的行,则简单的记分板可被用于确定任何特定行被盖写的第一次,并且计数器可被用于确定每个行何时已经被盖写至少一次。可以使用用于检测高速缓存返转的任意机制,而不会脱离本发明的范围。
图14示出了流寄存器监听过滤器的可替换实施例,其中过滤器被N个远程处理器整体共享。即,单独的监听请求端口714不具有其自身的监听检查逻辑702,如关于图13所描述的实施例中所示的那样。在此实施例中,监听请求在被输入到共享监听检查逻辑块701之前在队列结构708中进入队列。所排队的请求以公平的方式经由判优和多路复用逻辑705被转发到监听检查逻辑块701。另外,监听检查逻辑块701的功能与在此关于图13所描述的之前的流寄存器监听过滤器检查逻辑相同。显而易见,可替换的排队结构708是可能的,且不会脱离本发明的一般范围。
在优选实施例中,使用了两组流寄存器,但也可以使用多于两组流寄存器,而不会脱离本发明的范围。例如,在实现了四组流寄存器的实施例中,实现了两组活动寄存器A和B、以及两组相应的历史寄存器。在此实施例中,A组流寄存器可以包含关于高速缓存的一个子集的信息,而B组流寄存器可以包含关于高速缓存的不同子集的信息。可以通过将高速缓存划分为两个相等部分而实施将高速缓存分区为被分配给每组流寄存器(A和B)的部分,但是也可以使用其它分区方式。此外,流寄存器组的数量可以多于两组。例如,可以存在被分配给组关联的高速缓存的每个高速缓存组的一组流寄存器。
在另一实施例中,可以存在多于一个的流寄存器历史组,这允许活动组更频繁地被回收。不过,必须注意管理与高速缓存返转检测相关的历史寄存器,使得当由一个寄存器所涉及的高速缓存行仍处于高速缓存中时不会清空该寄存器。确保寄存器不会被清空的一种方式是,将历史寄存器添加到流寄存器活动组,并且接着当高速缓存返转时将所有那些历史寄存器(以及活动寄存器)拷贝到第二组历史寄存器。这样基本上将历史的第二“维”添加到流寄存器监听过滤器的优选实施例,如此处所描述的。
现在参考图15,描述了用于使用成对的基本寄存器和屏蔽寄存器组的监听过滤器的控制流的详细过程流程图。在操作的开始,所有流寄存器和屏蔽以及监听队列被复位,如步骤730所指示的,并且系统等待来自任意监听源的下一监听请求,如步骤732所指示的。当接收到新的监听请求时,针对所有地址流寄存器和屏蔽(流寄存器的两组)检查监听请求的地址,如步骤734所描述的。针对结合伴随的屏蔽的所有流寄存器(即,所有地址流寄存器和屏蔽(流寄存器的两组))检查监听请求的地址。如果对当前监听请求的比较匹配于结合了成对的屏蔽寄存器的流寄存器,如步骤736所指示的,则所监听的高速缓存行可能处于高速缓存中,并且在步骤740通过将监听请求放置到监听队列中而将监听请求转发到高速缓存。过程返回步骤732,以等待下一监听请求。不过,如果监听请求不匹配在流寄存器的两组中结合了成对的屏蔽寄存器的任意流寄存器,则所监听的高速缓存行被确保不在高速缓存中。因此,在步骤738将此监听请求过滤掉,并且过程返回步骤732。
现在参考图16,描述了用于更新两个流寄存器组和针对所替换的高速缓存行的高速缓存返转检测逻辑的控制流。在操作的开始,所有流寄存器和屏蔽被复位,以及高速缓存返转检测逻辑被清空,如步骤750所指示的,并且第一组寄存器被激活。对于在L1高速缓存中缺失的每个处理器存储器请求(包括加载或存储操作),将存储器请求的地址添加到第一组流寄存器,被称为活动地址流寄存器组。来自第一组寄存器的所有地址流寄存器被检查,以选择最佳匹配,如所实现的寄存器选择标准所规定的;可替换地,可以选择第一个空的流寄存器。存储器请求的地址被存储在活动寄存器组中所选择的流地址寄存器中,如步骤752所指示的,并且成对的屏蔽被更新,以反映哪些地址位是相关的,哪些不相关。接着,在步骤754,高速缓存返转检测逻辑被更新,以反映被加载到高速缓存中的新数据。高速缓存返转检测逻辑跟踪:自从活动寄存器的初次使用被启动以来高速缓存中的所有行是否已经被替换。因此,在步骤756,确定是否存在高速缓存返转状况。如果在步骤756未检测到高速缓存返转状况,则控制流循环回到步骤752,其中系统等待下一处理器存储器请求。否则,如果检测到高速缓存返转状况,则控制继续到步骤758,其中高速缓存返转检测逻辑块被清空,并且在步骤758第二流寄存器和屏蔽组被清空。接下来进行到步骤760,系统等待下一处理器存储器请求。对于新的存储器请求,来自第二组寄存器的所有地址流寄存器被检查,以选择最佳匹配,例如如所实现的寄存器选择标准所规定的,或者例如选择第一个空的流寄存器。存储器请求的地址被存储在第二寄存器组中所选择的流地址寄存器中,如步骤760所指示的,并且成对的屏蔽被更新,以反映哪些地址位是相关的。进行到步骤762,高速缓存返转检测逻辑被更新,以反映被加载到高速缓存中的新数据。由于高速缓存返转检测逻辑跟踪:自从第二组寄存器的初次使用被启动以来高速缓存中的已经被替换的所有行,因此,接着在步骤764确定是否存在高速缓存返转状况。如果在步骤764未检测到高速缓存返转事件,则返回步骤760,系统等待下一处理器存储器请求。不过,如果检测到高速缓存返转事件,则第一组寄存器和屏蔽将被再次使用。因此,在步骤766,来自第一组寄存器的所有寄存器和成对的屏蔽被复位,并且高速缓存返转检测逻辑块被清空。第一组寄存器将被再次用作为估计高速缓存内容的活动寄存器,并且控制流循环回步骤752。
如在此关于流寄存器监听过滤器的使用所描述的,随着被设为零的屏蔽位组的数量的增加,每个监听寄存器过滤器阻挡监听请求的能力会降低。例如,如果所有屏蔽位为零,则所有监听请求必须被发送通过。不过,假定这些屏蔽位以每次一位地被设为零(即,每次加载与流寄存器的不同之处仅一位),则在这种情形中,对具有确切两位与流寄存器不同的地址的监听请求将被允许通过,即便此地址不可处于高速缓存中。因而,通过实现签名过滤器提供了附加的过滤能力,所述签名过滤器使能了对于更复杂或精细差异(诸如不同位的数量)的检测。一般思路在于,仅当屏蔽过滤器和签名过滤器指示出地址可能位于高速缓存中之时才将监听从流寄存器进行转发。
参考图17,存在签名功能900,其作为输入获得地址901和流寄存器902,以及计算与流寄存器有关的地址签名903。存在许多可能的签名功能,诸如:
1.在地址中与流寄存器地址不同的位的数量。用s表示此数量。可以使用截断来节约空间,例如,对于某个常数M,将签名设置为min(M,s)。
2.如果地址长度为N位,则签名是长度B=(N+1)位的向量,其中除了在s=i时位i中的一之外每个位中为零。为了节约空间,这可以被截断为长度B+1(B+1<N)的向量,其中在min(s,B)=i时位i中为一。
3.将地址划分为k(k>1)个位组。组i的长度为L(i)位,并且令M(i)=L(i)+1。令s(i)为组i中不同于组i中流寄存器位的地址位的数量。则签名通过(s(1),s(2)...,s(k))给出,其仅是每个组中的不同位的数量。这些组可以包括不相交的位组或者部分地重叠的位组(即,地址中的某个位处于多于一个组中)。签名的长度为B(1)+...+B(k)位,其中B(i)是表示s(i)的所有可能值所需的位的数量。
4.上述(2)和(3)的组合,其中签名包括对应于每个组的k位向量。如果s(j)=i则组j中的位i被设为一。如果组i的长度为L(i)位则它需要M(i)=(L(i)+1)位来编码s(i)的所有可能值。签名长度为M(1)十...十M(k)位。可以使用截断来节约空间,例如,如果对于某个常数M,min(M,s(j))=i则组j中的位i被设为一。
5.如上述(3)那样,但是存在对于s(1),...,s(k)的M(1)*...*M(k)个不同的唯一组合。将整数q分配给每个组合,并将签名设置为除了位q中的一之外的所有零的向量。如上述(4)那样的截断可以减少空间。
6.将地址划分为k(k>1)个位组,并且令p(i)为组i中的地址位的奇偶校验。则签名通过(p(1),p(2)...,p(k))给出。
7.如上述(6)那样,但是将奇偶校验的2k个组合中的每个与整数q进行编码,并且返回长度为除了位q中的一之外的2k个零的位向量。
应该理解,许多其它的签名是可能的。
如果地址901被加载到高速缓存,则签名903被馈送到签名寄存器更新器904。更新器还作为输入获得签名寄存器905的之前值,并用新值906来替换它。更新签名寄存器的适当方式取决于签名类型。令S_old指示签名寄存器的旧值,S_new指示签名寄存器的新值,并且V表示签名903的值。对应于上述签名功能,签名更新器904计算:
1.S_new=max(S_old,V)。这跟踪不同于流寄存器的位的最大数量。
2.S_new=S_old与V的逐位或操作。这保持不同位的数量的记分板。
3.S_new=max(S_old,V)。这跟踪每个组中不同于流寄存器的位的最大数量。
4.S_new=S_old与V的逐位或操作。这保持每个组中的不同位的数量的记分板。
5.S_new=S_old与V的逐位或操作。这保持每个组中同时出现的不同位的数量的记分板。
6.S_new=S_old与V的逐位或操作。这保持每个组中的奇偶校验的记分板。
7.S_new=S_old与V的逐位或操作。这保持每个组中同时出现的奇偶校验的记分板。
当监听请求进入时,其签名被计算,并与签名寄存器比较。如果在此未出现匹配,则地址无法处于高速缓存中,于是即便正常的流寄存器和屏蔽过滤器指示出请求可能处于高速缓存中也将请求过滤掉。仅当签名寄存器和屏蔽寄存器均指示出地址可能处于高速缓存中时,监听才被转发。
在图18中示出了签名过滤机制。到高速缓存的加载地址1001被发送到屏蔽更新逻辑1002,其如前所述进行操作,采用之前的屏蔽寄存器1003、流寄存器1004,以及更新屏蔽寄存器1003。此地址1001还被馈送到签名功能1005,其也作为输入获得流寄存器1004并产生签名1006。签名1006和之前的签名寄存器1008被馈送到签名更新逻辑1007,其创建用于签名寄存器1008的新值。
当监听地址1009a的请求进入时,请求被产生屏蔽监听请求1011的屏蔽过滤器1010接收并处理。此外,该相同的监听地址(如1009b所示)以及流寄存器1004被馈送到产生签名1013的签名功能1012。注意,签名功能1005和1012必须是相同的逻辑,这意味着,如果它们具有相同输入,则它们将产生相同输出。监听请求的签名1013和签名寄存器被馈送到签名过滤器1014。
此过滤器必须确定具有此签名的请求是否可能处于高速缓存中,并且其确切操作取决于签名类型。在“记分板”类型的签名更新器的情形中,监听签名与签名寄存器进行逐位的与操作。如果此操作结果是非零,则产生签名监听请求1015(即,如果请求将被产生则该信号被设为1,否则为0)。在“最大数量的改变位”类型的签名更新器的情形中,进行检查以看看监听签名是否小于或等于签名寄存器(对每个组进行一次比较)。如果所有这样的比较均为真,则地址可能处于高速缓存中,并且产生签名监听请求1015。屏蔽监听请求1011和签名监听请求1015一起在逻辑组件1016中进行与操作,以生成监听请求信号1017。如果此信号为1,则监听请求将被生成,除非它被监听向量列表或者所应用的范围过滤器(见图7)排除在外。不过,特别地,这种监听请求不会被来自另一流寄存器的签名屏蔽过滤器的结果排除在外。
在流寄存器被首先设置或复位的同时,签名寄存器被适当设置。对于记分板类型和最大类型的签名,签名寄存器被设置为全零(指示出不存在与流寄存器不同的位)。
流寄存器过滤器依赖于:与特定的开始状态(如此处所引用的高速缓存返转状况)有关,知道高速缓存的全部内容何时已经被替换。当组关联高速缓存内的全部组已经被替换时,认为该高速缓存已经返转。通常,某些组将早于其它组被替换,并在所有组已经被替换和高速缓存已经返转之前将继续被更新。因此,高速缓存返转检测的开始点是在之前的高速缓存返转的时候的高速缓存组的状态。
在一实施例中,高速缓存是组关联的,并且使用循环法替换算法,不过其它替换实现方式也是可能的。例如,当高速缓存实现了判优替换策略(包括最近未使用和随机)时,可以实现高速缓存返转检测。如在下文的描述中所引用的,组关联(SA)高速缓存包括某个数量的组,其中每个组可以存储多个行(每行具有相同的组索引)。组内的行被称为“路”。因此,2路组关联高速缓存中的每个组具有两(2)行。组内的所有路在查找期间被同时搜索,并且在更新期间它们中仅一个被替换。此外,组可以被分区,使得这些路的子集被分配到每个分区。例如,4路SA高速缓存可以被分区为两个2路SA高速缓存。虚拟存储器页表(和翻译后备缓冲器(TLB))可以提供分区标识符,其指定了特定的存储器引用的目标位于哪个高速缓存分区(用于查找和更新)。存储要针对高速缓存返转进行更新的路的寄存器需要足够大以存储路数量。例如,2位用于4路SA高速缓存,或者5位用于32路SA高速缓存。每个组存在一个这样的寄存器,因为每个组可以在不同时间返转。
在本发明的一实施例中,高速缓存是可被分区为三个分区的,其中每个分区包括高速缓存路的连续子集,并且该子集在每个高速缓存组中相同。存储器引用由处理器的存储器管理单元所指定被高速缓存于三个分区之一中。对分区的更新独立于其它分区进行,于是一个分区可能在整个高速缓存返转之前很久就返转。不过,当被更新的分区已知时,检测分区的返转与检测整个高速缓存的返转相同。因此,如下文中所引用的,高速缓存返转包括分区返转或者整个高速缓存返转。
为了使外部逻辑检测高速缓存更新,高速缓存必须提供更新正在出现以及哪一行正被盖写的指示。优选实施例的逻辑假定此信息通过组规范、路规范以及更新指示器来提供。
图19(a)和19(b)描述了N路组关联高速缓存的优选实施例的高速缓存返转检测逻辑。在此实施例中,假定对组的更新总是以循环法顺序来实施。即,被选择进行盖写的“牺牲”路总是在前一个被盖写的路之后的一路。
图19(a)具体描述了实现用于在逻辑块920内检测单个组(在所述实施例中为组“i”)的单个分区的返转的逻辑的一实施例。当此逻辑已检测到组i中的返转时,其断言(assert)set_wrap(i)信号910。图19(b)示出了来自高速缓存的所有N组的独立的set_wrap(i)910信号是如何与逻辑或功能相结合,以产生cache_wrap 912信号,所述信号在整个高速缓存(即所有组)已返转时进行断言。应该理解,图19(a)和19(b)中描述的逻辑和电路仅是一种示例实现方式,而本领域技术人员将认识到,可以在其中进行许多变更和修改,而不会脱离本发明的范围。
在图19(a)的左手边,描述了分区检测逻辑块922,其确定高速缓存更新何时落入下述分区中,在所述分区中正对返转进行监视。此逻辑假定分区从由“低位”916指定的路延伸到由“高位”918指定的路。因此,检测组返转分区的逻辑其余部分仅当存在更新并且该更新落入感兴趣的分区之时才改变状态。注意,分区检测逻辑922对于组返转检测逻辑的所有N个拷贝是共用的。
在组返转检测逻辑中,共用的分区更新指示符被进一步限定,以便仅当对关联于该逻辑的特定组i进行更新时才起作用。这是通过将分区说明符924与组返转检测逻辑926的索引进行匹配来实现的。
逻辑电路的其余部分按照如下进行工作:假定,首先驱动set_wrap(i)的触发器930是清空的,这指示出该组尚未返转,并且寄存器928包括必须被更新以完成组返转的路。在此状态下,寄存器保持其值。当高速缓存更新出现时,其中路914匹配寄存器928的内容,如由比较器设备919所确定的,则驱动set_wrap(i)的触发器930以逻辑1进行加载,这使得set_wrap(i)910被断言。此后,高速缓存更新使得被更新的路914存储在寄存器928中,于是寄存器928有效地跟踪这些更新。当所有高速缓存组已经返转时,已组合的cache_wrap 912信号被断言,如图19(b)中所示,这使得触发器930被清空(假定复位比加载优先)。这将电路返回到初始状态,其中寄存器928存储了必须被更新以指示下一组返转的路。
因此,应该理解,每个组存在存储路的数量的一个寄存器,并且当该路被盖写时,该组已经返转。不过,这些组在不同时间进行返转(取决于访问模式),并且在所有组已经返转之前不会认为整个高速缓存已经返转。在此时,牺牲路的指针(即指向被盖写的最后一路的指针;每组一个)的状态变成用于检测下一高速缓存返转的新的初始状况。第一实施例适应此要求是通过:使上述寄存器跟踪在其已经返转之时和整个高速缓存已经返转之时之间被盖写的路。接着,当整个高速缓存返转时,其停止跟踪被盖写的路,并变成用于确定何时组再次返转的比较的基础。
在高速缓存返转检测逻辑的第二实施例中,实现了计数器,于是当整个高速缓存返转时,所有的组计数器被复位为在分区中的路的数量。当路被盖写时,计数器递减计数;并且当计数器到达零时,则相应的组已经返转。当所有计数器到达零时,则高速缓存已经返转,并且所述过程再次开始。
根据此第二实施例,在图19(a)中描述的块920中提供的组返转检测逻辑由此是基于可加载计数器的,而不是寄存器和比较器。在图20中示出了此逻辑。在此逻辑中,递减计数器设备932在set_wrap(i)910被断言之时以分区中的路的数量936进行加载(假定加载比递减优先)。当所有组已经返转而且cache_wrap 912被断言时,驱动set_wrap(i)的触发器930被清空,并且计数器932不再被加载。此后,由该逻辑跟踪的对分区914和组934的每次更新使得计数器932递减一。一旦它到达零,则触发器930以逻辑1进行加载,这使得set_wrap(i)910被断言,并将所述逻辑返回初始状态。
如图21所示的高速缓存返转检测逻辑的第三实施例将工作于实现任意替换策略(包括最近未使用和随机)的高速缓存。在此情形中,记分板940被用于跟踪被盖写的精确高速缓存路914。特别地,它被用于检测对任意路的第一次写入。此外,计数器942跟踪记分板位首次被设置(即从0到1)的次数。它这样做仅通过对被盖写位(old_bit)为零的记分板写入进行计数。计数器942被预加载了分区大小936(即分区中的路的数量),于是一旦此计数器到达零,则整个高速缓存分区已经返转。这是由被断言的cache_wrap 912信号所指示的,使得计数器942被重新加载(假定加载比递减优先)并且记分板940被清空(即复位)。
尽管结合写通过高速缓存实施了本发明的优选实施例,其中仅对写请求进行监听,并且监听动作的结果是本地数据拷贝的无效化。但是本发明并不限于此。例如,本发明还可以结合写回高速缓存组织来实施。根据写回高速缓存,一致性协议将包括附加的事务,例如包括但不限于:根据公知的MESI协议或者其它一致性协议的事务。根据用于写回高速缓存的一致性协议,对远程处理器的读事务使得监听动作确定远程高速缓存是否具有与主存储器有关的最近数据拷贝。如果是这样,则使用若干方式之一来实施数据传输,所述方式包括但不限于:使得具有最近数据的处理器将数据写到主存储器,将数据从最近拷贝的拥有者直接传输到请求者,或者根据特定协议的监听干预来传输数据的任意其它方法。根据本发明,监听过滤动作可被用于确定加速监听响应。
尽管已经按照固定互连拓扑以及固定监听过滤操作描述了优选实施例,但是在本发明的一个方面中,监听过滤子系统具有处于监听过滤层级结构的一级或多级的可编程方面。根据本发明的可编程特征的一实施例,选择互连拓扑。根据一种可编程拓扑,在拓扑中的不同过滤器之间的一对一或一对多关系是可选择的。根据可编程实施例的另一方面,访问第一监听过滤器接着访问第二监听过滤器、或者可替换地并行地访问第一或第二监听过滤器的顺序是在程序控制下可配置的。
根据本发明的可编程特征的另一实施例的另一方面,过滤器子单元的操作是编程的。这可以采用监听过滤器的可配置方面的形式,例如通过配置可编程方面,诸如被监听的高速缓存的结合性、被实现的一致性体系结构等等。在可编程过滤器子单元的另一方面中,过滤器子单元用可编程微代码实现,从而可编程引擎执行指令序列来实现此处描述的一个或多个优选实施例的各方面。在一方面中,这是通用微代码引擎。在另一方面中,这是优化的可编程微代码引擎,可编程微代码引擎具有专用支持逻辑来检测监听过滤器专有状况,以及可选地具有专用操作(诸如“对于高速缓存返转条件的分支”)、专用通知事件(例如以被传送给微代码引擎的微代码引擎专有异常的形式,诸如“对于高速缓存返转状况的中断”)等等。
在本发明的可编程特征的另一方面中,通过引入可编程交换机阵列或者可编程门阵列结构来实现监听过滤的部分或全部方面。在这些方面之一中,通过配置可编程交换机阵列来实施在监听子单元之间的路由。在此可编程实施例的另一方面中,通过配置可编程门阵列逻辑块来实现监听过滤器单元的动作。在本发明的另一方面中,通过配置至少一个现场可编程门阵列单元来实现整个监听过滤器块。
根据本实施例的可编程特征的另一实施例,多个监听过滤器子系统中之一可以被禁用,某些监听过滤步骤可以被绕过,或者监听过滤可以完全被禁用。在一实施例中,这通过将监听过滤器的配置写入配置寄存器来实现。在另一实施例中,此配置可由输入信号来选择。
尽管已经示出和描述了所认为的本发明的优选实施例,但是,当然将会理解,可以方便地进行在形式上或细节上的多种修改和改变,而不会脱离本发明的精神。因此,意图是不将本发明限于所描述和说明的确切形式,但是应该将本发明构造为覆盖可能落在权利要求的范围内的所有修改。