用于先行执行期间的存储器通信的装置 【技术领域】
本发明涉及处理器体系结构,并且特别地,涉及具有类似于高速缓冲存储器结构的处理器体系结构,使得可以在先行执行期间进行存储器通信。
背景技术
当今的高性能处理器通过实施乱序指令执行来容忍等待时间较长的操作。乱序执行机通过使等待时间较长的操作“不阻碍”在指令流中顺序靠后并且与其无关的操作来容忍较长的等待时间。为了实现这一点,处理器将操作缓冲到指令窗口中,该指令窗口的大小决定乱序机可以容忍的等待时间量。
不幸的是,由于处理器和存储器速度之间的不断增长的差距,当今的处理器正面临不断增加的更长的等待时间。例如,引起高速缓冲存储器未命中(miss)于主存储器内的操作可能需要花费数百个处理器周期来完成执行。仅通过乱序执行来容忍这些等待时间已经变得很困难,因为它要求更大的指令窗口,而这会增加设计复杂度和功率消耗。为此,计算机体系结构设计师开发了软件和硬件的预取方法来容忍较长的存储器等待时间,下面讨论了其中的几种。
存储器访问是研究人员长期关注的一种非常重要的等待时间较长的操作。高速缓冲存储器可以通过利用应用程序地时间和空间参考点来容忍存储器的等待时间。这种高速缓冲存储器等待时间的容忍已经得到了改善,这是通过允许它们处理多个未完成的未命中、并且在存在挂起的未命中时为高速缓冲存储器的命中(hit)进行服务而实现的。
对于其中编译器可以静态地预测哪些存储器参考会引起高速缓冲存储器未命中的应用程序来说,软件预取技术是有效的。对于许多应用程序来说,这并不是一个琐碎的任务。这些技术还向应用程序中插入预取指令,增加了指令带宽需求。
硬件预取技术使用动态信息来预测预取什么和何时预取。它们不需要任何指令带宽。不同的预取算法覆盖不同类型的访问模式。硬件预取的主要问题是可以覆盖不同类型访问模式的预取器的硬件费用和复杂性。另外,如果硬件预取器的准确度比较低的话,则高速缓冲存储器污染和不必要的带宽消耗会使性能降低。
基于线程的预取技术使用多线程处理器上的空闲的线程环境来运行辅助主线程的线程。这些辅助的线程执行为主线程预取的代码。这些技术的主要缺点在于:它们需要空闲的线程环境并分享资源(例如,取用和执行带宽),这些在处理器得到良好使用的时候通常是不可得的。
先行执行首先是作为用于改善五阶段流水线的按顺序执行机的数据高速缓冲存储器性能的方法而被提出和评价的。它在容忍第一级数据高速缓冲存储器和指令高速缓冲存储器未命中上表现得很有效。按顺序执行不能容忍任何的高速缓冲存储器未命中,而乱序执行可以通过执行与该未命中无关的指令而容忍某个高速缓冲存储器的未命中的等待时间。相似地,乱序执行在没有大的、昂贵的指令窗口的情况下不能够容忍等待时间较长的存储器操作。
已经提出了一种在等待时间较长的指令阻塞退出的时候执行将来指令的机制,该机制用于动态地将寄存器文卷的一部分分配给一个将在“主线程”停止的时候开始执行“将来线程”。这种机制要求部分硬件支持两种不同的环境。不幸的是,当资源被分给两个线程的时候,两个线程中的任何一个线程都不能利用机器的全部资源,这将减少将来线程的益处,并增多主线程的停止。在先行执行中,正常模式和先行模式都可以利用机器的全部资源,这帮助机器在先行模式期间进一步向前运行。
最后,已经提出:可以将依赖于等待时间较长的操作的指令从(相对较小的)调度窗口移走,并将其放置在(较大的)等待指令缓冲器(WIB)中,直到该操作得到完成,此时可将指令移回调度窗口。这结合了大指令窗口的容忍等待时间的好处和小调度窗口的快速周期时间的好处。但是,它仍然要求大的指令窗口(以及大的物理寄存器文卷),及其相关的费用。
【附图说明】
图1是根据本发明的一种实施方案的包含一种体系结构状态的处理系统的框图,该体系结构状态包含处理器寄存器和存储器。
图2是根据本发明的一种实施方案的用于图1的处理系统的示例性处理器结构的详细框图,该处理器结构具有先行高速缓冲存储器结构。
图3是根据本发明的一种实施方案的图2的先行高速缓冲存储器部件的详细的框图。
图4是根据本发明的一种实施方案的用于图1的先行高速缓冲存储器的示例性标签阵列结构的详细框图。
图5是根据本发明的一种实施方案的用于图1的先行高速缓冲存储器的示例性数据阵列结构的详细框图。
图6是根据本发明的一种实施方案的使用先行执行模式来防止处理器中的阻塞的方法的详细流程图。
【具体实施方式】
根据本发明的一种实施方案,为了容忍等待时间非常长的操作,可以使用先行执行来替代构建较大的指令窗口。代替使等待时间较长的操作“不阻碍”的操作(这要求把它和跟在它后面的指令缓冲到指令窗口),乱序执行处理器上的先行执行可以简单地将其丢弃出指令窗口。
根据本发明的一种实施方案,当指令窗口被等待时间较长的操作所阻塞的时候,体系结构的寄存器文卷的状态可被按点检查。然后处理器可进入“先行模式”,并且可以发布用于阻塞操作的假的(即,无效的)结果,并且可以将该阻塞操作丢弃出指令窗口。然后可以取用、执行跟在阻塞操作后面的指令,并使该指令从指令窗口伪退出。“伪退出”意味着指令可以得到传统意义上的执行和完成,只是它们不更新体系结构的状态。当完成了阻塞指令窗口的等待时间较长的操作时,处理器可以重新进入“正常模式”,并且可以恢复按点检查的结构体系状态以及预取和重新执行以阻塞操作开始的指令。
根据本发明的一种实施方案,按照先行执行模式的好处在于将受等待时间较长的操作阻塞的小指令窗口转变为无阻塞的窗口,使它具有更大的窗口的性能。可在先行模式期间取用和执行指令,来为数据和指令高速缓冲存储器创造非常准确的预取。这些好处是以适度的硬件成本为代价换来的,这一点将在后面得到描述。
根据本发明的一种实施方案,只有在第二级(L2)高速缓冲存储器中未命中的存储器操作可以得到评价。但是,所有其它的实施方案可以在阻塞处理器中的指令窗口的任意等待时间较长的操作的时候被启动。根据本发明的一种实施方案,处理器可以是Intel体系结构32位(IA-32)指令集体系结构(ISA)处理器,该处理器由位于加利福尼亚的圣克拉拉的Intel公司制造。相应地,这里详细描述的所有微体系结构参数(例如指令窗口大小)以及IPC(每周期指令数)性能也是就微操作而言进行报道的。具体地,在基于具有128个条目的指令窗口的IntelPentium4处理器的基线机器模型中,目前的乱序执行机通常不能容忍较长的主存储器等待时间。但是,先行执行通常可以更好地容忍这些等待时间并且实现具有更大的指令窗口的机器的性能。一般情况下,具有理想的存储器等待时间的基线机器的IPC性能是0.52,而具有100%的第二级高速缓冲存储器命中率的机器的IPC是1.26。添加先行操作可以使基线机器的IPC增加22%到0.64,这位于具有384个条目的指令窗口的相同机器的IPC的1%之内。
通常情况下,乱序执行通过调度那些不依赖于高速缓冲存储器的未命中操作来比按顺序执行更好地容忍高速缓冲存储器的未命中。乱序执行机使用两个窗口来实现这一点:一个指令窗口和一个调度窗口。指令窗口可以保持所有已经得到译码、但尚未提交至体系结构状态的指令。大体上说,该指令窗口的主要目的是保证指令的按顺序退出,以便支持准确的异常事件。类似的,调度窗口可以保持指令窗口中的指令的一个子集。大体上说,调度窗口的主要目的是在每个周期对它的指令进行搜索,以寻找那些准备被执行的指令,并调度这些指令以便执行。
根据本发明的一种实施方案,等待时间较长的操作可能阻塞指令窗口直到它得到完成为止,并且即使随后的指令可能已经被完全地执行,它们也不能从指令窗口中退出。因此,如果操作的等待时间足够长且指令窗口不是足够大,则指令可能堆积在指令窗口中,直到该指令窗口变满为止。此时,机器可以停止并且不向前进行,这是因为尽管机器仍然可以取用和缓冲指令,但是它不能对它们进行译码、调度、执行和使它们退出。
通常,处理器在指令窗口受到阻塞、等待主存储器访问的时候不能继续运行。幸运的是,先行执行可以从窗口中去除该阻塞指令,提取跟在它后面的指令,并且执行那些不依赖该阻塞指令的指令。先行执行的性能的好处在于:将指令提取到取用(fetch)机器的高速缓冲存储器中,并且执行未命中第一或第二级高速缓冲存储器的独立的加载和存储。所有这些高速缓冲存储器未命中可以与对启动了先行模式的主存储器的未命中并行地得到服务,并提供有用的预取请求。因此,与指令窗口正常情况下允许的情况相比,处理器可以提取和执行更多的有用指令。如果不是这种情况,则先行不会提供优于乱序执行的任何性能上的好处。
根据本发明的一种实施方案,先行执行可以在多种乱序处理器上实施。例如,在一种实施方案中,乱序处理器可以具有这样的指令:这些指令在它们被调度之后并在它们被执行之前对寄存器文卷进行访问。这种类型的处理器的例子包含但不限于:IntelPentium4处理器;MIPSR10000微处理器,由位于加利福尼亚的芒廷维尤的SiliconGraphics公司制造;以及Alpha 21264处理器,由位于麻萨诸塞州的梅纳德的Digital Equipment Corporation公司制造(该公司现在为位于加利福尼亚的帕洛阿尔托的Hewlett-Packard公司)。在另一种实施方案中,乱序处理器可以具有这样的指令:这些指令在它们被放到调度器中之前访问寄存器文卷,这种类型的处理器包含,例如,IntelPentiumPro处理器,由位于加利福尼亚的圣克拉拉的Intel公司制造。尽管先行执行的实施细节在两种实施方案之间可以有细微的不同,但基本的机制按照相同的方式进行工作。
图1是根据本发明的一种实施方案的包含一种体系结构状态的处理系统的框图,该体系结构状态包含处理器寄存器和存储器。在图1中,计算系统100可以包含连接到系统总线120的随机存取存储器110,该系统总线120可以连接到处理器130。处理器130还可以包含总线单元131,该总线单元131连接到系统总线120和第二级(L2)高速缓冲存储器132来允许L2高速缓冲存储器132和系统总线120之间的双向通信和/或数据/指令转移。L2高速缓冲存储器132可以连接到第一级(L1)高速缓冲存储器133来允许双向通信和/或数据/指令转移,并且连接到取用/译码单元134来允许从L2高速缓冲存储器132加载数据和/或指令。取用/译码单元134可以连接到执行指令高速缓冲存储器135,并且取用/译码134和执行指令高速缓冲存储器135可被共同看作是执行流水线处理器130的前端136。执行指令高速缓冲存储器135可以连接到执行核心137(例如一种乱序核心),来允许将数据和/或指令转发到执行核心137用于执行。执行核心137可以连接到L1高速缓冲存储器133来允许双向通信和/或数据/指令转移,并且可以连接到退出部件138来允许从执行核心137转移已执行指令的结果。通常情况下,退出部件138处理这些结果并且更新处理器130的体系结构状态。退出部件138可以连接到分支预测逻辑部件139来向分支预测逻辑部件139提供完成的指令的分支历史信息,以便用于预测逻辑的训练。分支预测逻辑部件139可以包含多个分支目标缓冲器(BTB)并且可以连接到取用/译码单元134和执行指令高速缓冲存储器135,以便提供将从L2高速缓冲存储器132检索的预测的下一指令地址。
根据本发明的一种实施方案,图2显示了一种具有新的先行高速缓冲存储器202的程式化的乱序处理器流水线200。在图2中,虚线显示流动数据,并且信号未命中通信量可以呈现在处理器高速缓冲存储器——第一级(L1)数据高速缓冲存储器204和第二级(L2)数据高速缓冲存储器206——之内和之外。根据本发明的一种实施方案,在图2中,阴影部分指示用来支持先行执行所要求的处理器硬件部件。
在图2中,L2高速缓冲存储器206可以通过用于L2高速缓冲存储器206的前侧总线访问队列208连接到诸如海量存储器的存储器(未显示),以便向存储器发送数据和从存储器请求数据。L2高速缓冲存储器206还可以直接连接到存储器,以便响应于这些发送/请求而接收数据和信号。L2高速缓冲存储器206还可以连接到L2访问队列210来接收对通过L2访问队列210发送的数据的请求。L2访问队列210可以连接到L1数据高速缓冲器204、基于流的硬件预取器212以及跟踪高速缓冲存储器取用单元214,以便从L1数据高速缓冲器204、基于流的硬件预取器212以及跟踪高速缓冲存储器取用单元214接收对数据的请求。基于流的硬件预取器212还可以连接到L1数据高速缓冲存储器204来接收对数据的请求。指令译码器216可以连接到L2高速缓冲存储器206来从L2高速缓冲存储器206接收对指令的请求,并且连接到跟踪高速缓冲存储器取用单元214来转发从L2高速缓冲存储器206接收的指令请求。
在图2中,跟踪高速缓冲存储器取用单元214可以连接到微操作(μop)队列217来将指令请求转发到μop队列217。μop队列217可以连接到重命名器218,该重命名器218可以包含前端寄存器别名表(RAT)220,该前端寄存器别名表(RAT)220可被用于对进入的指令重新命名,并且包含体系结构寄存器到物理寄存器的推测性映射。浮点(FP)μop队列222、整数(Int)μop队列224和存储器μop队列226可以并行地连接到重命名器218来接收合适的μop。FPμop队列222可以连接到FP调度器228,并且FP调度器228可以接收来自FPμop队列222的浮点μop并调度它们用于执行。Intμop队列224可以连接到Int调度器230并且Int调度器230可以接收来自Intμop队列224的整数μop并调度它们用于执行。存储器μop队列226可以连接到存储器调度器232并且存储器调度器232可以接收来自存储器μop队列226的存储器μop并调度它们用于执行。
在图2中,根据本发明的一种实施方案,FP调度器228可以连接到FP物理寄存器文卷234,该FP物理寄存器文卷234可以接收和存储FP数据。FP物理寄存器文卷234可以包含无效(INV)位235,该无效(INV)位235可被用来指示FP物理寄存器文卷234的内容是有效的还是无效的。FP物理寄存器文卷234可以进一步连接到一个或多个FP执行单元236,并且可以向FP执行单元236提供FP数据用于执行。FP执行单元236可以连接到重排序缓冲器238并且还可以向回连接到FP物理寄存器文卷234。重排序缓冲器238可以连接到按点检查的体系结构寄存器文卷240,该按点检查的体系结构寄存器文卷240可以向回连接到FP物理寄存器文卷234,并且可以连接到退出RAT241。退出RAT 241可以包含指向那些包含提交的体系结构值的物理寄存器的特定指针。退出RAT 241可以被用来恢复在分支误预测和异常事件之后的体系结构状态。
在图2中,根据本发明的一种实施方案,Int调度器230和存储器调度器232都可以连接到Int物理寄存器文卷242,该Int物理寄存器文卷242可以接收和存储整数数据和存储器地址数据。Int物理寄存器文卷242可以包含无效(INV)位243,该无效(INV)位243可以被用来指示Int物理寄存器文卷242的内容是有效的还是无效的。Int物理寄存器文卷242可以进一步连接到一个或多个Int执行单元244以及一个或多个地址生成单元246,并且可以分别向Int执行单元244和地址生成单元246提供整数数据和存储器地址数据,以用于执行。Int执行单元244可以连接到重排序缓冲器238并且还可以向回连接到Int物理寄存器文卷242。地址生成单元246可以连接到L1数据高速缓冲存储器204、存储缓冲器248和先行高速缓冲存储器202。存储缓冲器248可以包含一个INV位249,该INV位249可以被用来指示存储缓冲器248的内容是有效的还是无效的。Int物理寄存器文卷242还可以连接到按点检查的体系结构寄存器文卷240来接收体系结构状态信息,并且可以连接到重排序缓冲器238和选择逻辑250来允许双向信息转移。
根据本发明的其它实施方案,根据本发明所使用的是哪种类型的乱序处理器,地址生成单元可以被实施为一种更通用的地址源,例如寄存器文卷和/或执行单元。
根据本发明的一种实施方案,在图2中,处理器200可以在任意时刻(例如但不限于:数据高速缓冲存储器未命中、指令高速缓冲存储器未命中,以及调度窗口停止)进入先行模式。根据本发明的一种实施方案,处理器200可以在第二级高速缓冲存储器206中发生存储器操作未命中和该存储器操作到达指令窗口的头部的时候进入先行模式。当存储器操作到达(阻塞)指令窗口的头部的时候,可以记录指令的地址并且可以进入先行执行模式。为了在从先行模式中离开的时候正确地恢复体系结构状态,处理器200可以按点检查体系结构寄存器文卷240的状态。出于性能方面的考虑,处理器200还可以按点检查各种预测结构(例如分支历史寄存器)的状态,并返回地址堆栈。指令窗口中的所有指令可以被标记为“先行操作”并且受到处理器200的微结构的区别对待。大体上说,在先行模式下所提取的任意指令也可以被标记为先行操作。
根据本发明的一种实施方案,在图2中,可以通过复制由退出RAT241指向的物理寄存器234、242的内容(这需要花费时间)来实现对按点检查的体系结构寄存器文卷240的按点检查。因此,为了避免由复制引起的性能损失,处理器200可以被配置成总是在正常模式期间更新按点检查的体系结构寄存器文卷240。当非先行指令从指令窗口中退出的时候,它可以用它的结果对按点检查的体系结构寄存器文卷240中的它的体系结构的目的地寄存器进行更新。也可以使用其它的按点检查机制,并且在先行期间可以不对按点检查的体系结构寄存器文卷进行更新。因此,先行执行的实施方案可以将第二级按点检查机制引入到流水线。尽管在通常情况下,退出RAT 241在正常模式中指向体系结构的寄存器状态,但是它可以在先行模式期间指向伪体系结构寄存器状态,并且可以反映由伪退出指令更新的体系结构状态。
大体上说,与先行指令的执行有关的主要复杂性涉及存储器通信和无效结果的传播。根据本发明的一种实施方案,在图2中,物理寄存器234、242均可以具有与之相关的无效(INV)位来指示它是否具有假的(也就是无效的)值。大体上说,源于无效位被设置的寄存器的任意指令可以视为一条无效指令。INV位可以被用来防止预取无效数据和使用无效数据来解析分支。
在图2中,例如,如果一条存储指令无效,它可以在先行期间将一个INV值引入到存储器映像。为了处理在先行模式期间通过存储器传送数据值(以及INV值),可以使用先行高速缓冲存储器202,它可以与第一级(L1)数据高速缓冲存储器204并行地受到访问。
根据本发明的一种实施方案,在图2中,引入INV值的第一指令可以是使得处理器200进入到先行模式的指令。如果这条指令是加载,则它可以将它的物理目的地寄存器标记为INV。如果它是存储,它可以在先行高速缓冲存储器202中分配一个线并且将它的目的地字节标记为INV。大体上讲,写到寄存器(例如寄存器234、242)的任何无效指令都可以在它被调度和执行后将该寄存器标记为INV。类似地,写到寄存器234、242的任何有效操作可以重新设置目的地寄存器的INV位。
大体上讲,先行存储指令并不在任何地方写入它们的结果。因此,依赖于无效的先行存储的先行加载可以被看作是无效的指令并且被丢弃。相应地,因为将先行存储的结果转发到先行加载对于实现高性能是必需的,所以如果存储和依赖它的加载都在指令窗口中,则转发就可以得到完成,在图2中,转发是通过存储缓冲器248完成的,该存储缓冲器248通常已经存在于多数当今的乱序处理器中。但是,如果先行加载依赖于已经伪退出的先行存储(也就是说,该存储不再存在于存储缓冲器中),则该先行加载可以从某个其它的位置得到存储的结果。一种可能性是,例如,将伪退出存储的结果写进数据高速缓冲存储器。不幸的是,这给L1数据高速缓冲存储器204的设计引入额外的复杂度(并且可能会给L2数据高速缓冲存储器206的设计引入额外的复杂度,这是因为L1数据高速缓冲存储器204需要得到修改,以使得由推测性先行存储写入的数据可以不被后来的非先行指令所使用)。类似地,将推测性存储的数据写进数据高速缓冲存储器还可以逐出有用的高速缓冲存储器线。尽管另一种替换的实施方案可以是使用较大的完全相关联的缓冲器来存储伪退出先行存储指令的结果,但这种相关联结构的大小和访问时间可能是大到无法承受的。另外,这样一种结构不能在不增加复杂度的情况下处理一个加载依赖于多个存储的情况。
根据本发明的一种实施方案,在图2中,先行高速缓冲存储器202可以被用来保持伪退出先行存储的INV状态和结果。先行高速缓冲存储器202可以像L1数据高速缓冲存储器204那样被寻址,但是先行高速缓冲存储器202在大小上可以更小,这是因为从大体上说,在先行模式期间仅有少量的存储指令伪退出。
尽管在图2中,由于先行高速缓冲存储器202与传统的高速缓冲存储器物理结构相同而可被称作高速缓冲存储器,但是先行高速缓冲存储器202的目的不是要对数据进行“高速缓冲存储”。相反地,先行高速缓冲存储器202的目的是在指令之间提供数据和INV状态的通信。被逐出的高速缓冲存储器线通常并不被存储回任何更大的存储器中,相反,它们可以简单地被丢弃。先行加载和存储可以对先行高速缓冲存储器202进行访问。在正常模式中,指令都不可以访问先行高速缓冲存储器202。大体上说,可以使用先行高速缓冲存储器来允许:
1.通过存储器正确地传送INV位;以及
2.将先行存储的结果转发到依赖性的先行加载。
图3是根据本发明的一种实施方案的图2的先行高速缓冲存储器部件的详细的框图。在图3中,先行高速缓冲存储器202可以包含连接到标签阵列320和数据阵列330的控制逻辑310,并且标签阵列320可以连接到数据阵列330。控制逻辑310可以包含用于连接到如下线的输入:存储数据线311、写使能线312、存储地址线313、存储大小线314、加载使能线315、加载地址线316、以及加载大小线317。控制逻辑310还可以包含用于连接到命中信号线318和数据输出线319的输出。标签阵列320和数据阵列330可以分别包含读出放大器322、332。
根据本发明的一种实施方案,在图3中,存储数据线311可以为64位线,写使能线312可以是单命中线,存储地址线313可以为32位线,存储大小线314可以为2位线。类似地,加载使能线315可以为1位线,加载地址线316可以为32位线,加载大小线317可以为2位线,命中信号线318可以为1位线,数据输出线319可以为64位线。
图4是根据本发明的一种实施方案的用于图3的先行高速缓冲存储器202的示例性标签阵列结构的详细框图。在图4中,标签阵列320的数据可以包含多个标签阵列记录,每个标签阵列记录具有一个有效位字段402、标签字段404、存储(STO)位字段406、无效(INV)位字段408,以及替换策略(replacement policy)位字段410。
图5是根据本发明的一种实施方案的用于图1的先行高速缓冲存储器的示例性数据阵列结构的详细框图。在图5中,数据阵列330可以包含多个n位数据字段,例如,32位数据字段,这些数据字段中的每个可以与一个标签阵列记录相关联。
根据本发明的一种实施方案,为了支持存储和加载之间的INV位的正确通信,图2的存储缓冲器248中的每个条目和图3的先行高速缓冲存储器202中的每个字节都可以具有一个对应的INV位。在图4中,先行高速缓冲存储器202中的每个字节还可以具有与它相关联的另一个位(STO位),用于指示存储是否已经被写到该字节。对先行高速缓冲存储器202的访问,只有在存储对被访问的字节进行了写操作(也就是说STO位被设置)并且被访问的先行高速缓冲存储器线是有效的情况下才可能导致命中。先行存储可以按照下面的规则来更新INV和STO位并存储结果:
1.当有效的先行存储完成执行时,它可以将数据写进存储缓冲器248中的条目(就像在普通处理器中一样),并且可以重新设置该条目的相关联的INV位。同时,先行存储可以查询L1数据高速缓冲存储器204,并且,如果该查询在L1数据高速缓冲存储器204中未命中的话,可以沿着存储器层级向下发送预取请求。
2.当无效的先行存储被调度的时候,它可以设置它在存储缓冲器248中的相关联条目的INV位。
3.当有效的先行存储离开指令窗口时,它可以将其结果写入先行高速缓冲存储器202中,并且可以重新设置所写字节的INV位。它还可以设置它所写向的字节的STO位。
4.当无效的先行存储离开指令窗口时,它可以设置它所写到其中的字节的INV位和STO位(如果它的地址有效的话)。
5.先行存储决不会将它们的结果写入L1数据高速缓冲存储器204。
当存储操作的地址无效时会出现一种复杂的情况。在这种情况中,存储操作可以被简单地按照空操作(NOP)来处理。因为加载通常不能识别出它们对这些存储的依赖性,所以它们有可能会从存储器不正确地加载失效的数据。可以通过使用存储器依赖性预测器来识别INV地址存储和依赖它的加载之间的依赖性,从而缓解该问题。例如,如果预测结构(例如存储加载依赖性预测)被用来补偿无效地址或值。但是,这些规则可能是不同的,取决于使用的是哪些类型的存储器依赖性预测器。一旦已经识别出了依赖性,如果存储的数据值是INV的话,可以将加载标记为INV。如果存储的数据值是有效的,可以将该数据值转发到加载。
在图2中,根据本发明的一种实施方案,出于以下不同原因中的任何一条原因,可以将先行加载操作视为无效:
1.它可能源于无效的物理寄存器。
2.它可能依赖于在存储缓冲器中被标记为无效的存储。
3.它可能依赖于已经伪退出并且无效的存储。
4.它未命中L2高速缓冲存储器。
另外,在图2中,根据本发明的一种实施方案,如果结果是由无效的指令产生的,那么该结果可以被认为是无效的。因此,一条有效的指令是一条并非无效的任意指令。类似的,如果一条指令源于一个无效的结果(也就是说,被标记为无效的寄存器),那么该指令可以被认为是无效的。因此,有效的结果是并非无效的任意结果。在某些特殊的例子中,如果不是因为未命中高速缓冲存储器,而是因为其它原因而进入先行,那么规则也可以发生改变。
根据本发明的一种实施方案,在图2中,可以使用先行高速缓冲存储器202检测无效情况。当有效加载执行时,它可以并行访问下面三个结构:LI数据高速缓冲存储器204、先行高速缓冲存储器202、以及存储缓冲器248。如果加载在存储缓冲器248中命中并且它命中的条目被标记为有效,则该加载可以从存储缓冲器接收数据。但是,如果加载在存储缓冲器248中命中并且该条目被标记为INV,则该加载可以将其物理目的地寄存器标记为INV。
根据本发明的一种实施方案,在图2中,仅当加载所访问的高速缓冲器线为有效、并且它所访问的高速缓冲器线中的任意字节的STO位被设置的情况下,该加载才可以被认为在先行高速缓冲存储器202中命中。如果加载在存储缓冲器248中未命中,而在先行高速数据缓冲器202中命中,则它可以检查它正在访问的先行高速缓冲存储器202中的字节的INV位。如果这些INV位都没有被设置,那么该加载可以使用先行高速缓冲存储器202中的数据来执行。如果这些作为源的数据字节中的任意字节都被标记为INV,那么加载就可以将它的目的地标记为INV。
在图2中,根据本发明的一种实施方案,如果加载在存储缓冲器248和先行高速数据缓冲器202中都未命中,但是在L1数据高速缓冲存储器204中命中了,则它可以使用来自L1数据高速缓冲存储器204的值并且被认为是有效的。但是,加载可能实际上是无效的,这是因为它可能是:1)依赖于具有INV地址的存储,或者2)依赖于INV存储,该INV存储将其在先行高速缓冲存储器中的目的地字节标记为INV,但是先行高速缓冲存储器中的对应的线由于冲突而被取消了分配。但是,这些很少出现的情况,它们不会对性能造成显著的影响。
在图2中,根据本发明的一种实施方案,如果加载在所有的三个结构中都没有命中,则它可以向L2高速缓冲存储器206发送请求来提取它的数据。如果这个请求在L2高速缓冲存储器206命中,则数据可以从L2高速缓冲存储器206转移到L1高速缓冲存储器204,并且加载可以完成它的执行。如果请求在L2高速缓冲存储器206中未命中,则加载可以将其目的地寄存器标记为INV,并且可以被从调度器中除去,就像使得条目进入先行模式的加载一样。请求可以像未命中L2高速缓冲存储器206的正常加载请求那样被发送到存储器。
图6是根据本发明的一种实施方案的使用先行执行模式来防止处理器中的阻塞的方法的详细流程图。在图6中,对于在例如图2中的乱序执行处理器200中的数据高速缓冲存储器未命中指令,可以进入先行执行模式(610)。返回到图6,在进入到先行执行模式的时候存在的体系结构状态可以受到按点检查(620),也就是说,被存储到例如图2的按点检查的体系结构寄存器文卷240中。还是在图6中,对于该指令的无效结果可以被存储(630)在例如图2的物理寄存器234、242中。返回到图6,指令可以在指令窗口中被标记(640)为无效,并且指令的目的地寄存器也可以被标记(640)为无效。当每个先行指令到达例如图2的处理器200的指令窗口的头部时,可以通过在不更新处理器200的体系结构状态的情况下使先行指令退出,来使得每个先行指令伪退出(650)。还是在图6中,按点检查的体系结构状态可以在用于引起数据高速缓冲存储器未命中的指令的数据从存储器(例如从图1的RAM 110)返回的时候被恢复(660)。在图6中,指令的执行可以在例如图2的处理器200中的正常模式中得以继续(670)。
在先行模式中对分支的预测和解析的方式与在正常模式中对它的预测和解析方式是一样的,除了有一点不同:与所有的分支一样,带有INV源的分支可以被预测并且可以推测性地更新全局分支历史寄存器,但是,与其它分支不同的是,它可能永远都无法得到解析。如果分支得到正确的预测的话,这可能不是问题。但是,如果分支被错误地预测了,处理器200通常会在该取用分支后处于错误的路径上,直到它命中一个控制流独立点。可以将在程序中的这样一个点称为“分歧点”:在该点处取用了错误预测的INV分支。分歧点的存在不一定对性能产生不良的影响,但是它们在先行模式中越晚发生,性能提高的程度也就越大。
关于分支预测的一个令人感兴趣的问题是在先行模式期间的分支预测器表的训练策略。根据本发明的一种实施方案,一种选择可以是始终训练分支预测器表。如果分支首先在先行模式中执行,然后在正常模式中执行,则这样一种策略可以导致分支预测器被同样的分支训练两次。因此,预测器表可以得到加强并且计数器可丢失它们的滞后现象,也就是说,基于方向动量来控制计数器中变化的能力。在一种替换的实施方案中,第二选择可以是永远不在先行模式中训练分支预测器。大体上说,这可以导致先行模式中的较低的分支预测准确度,这可能会降低性能并且使分歧点在时间上移动到距先行进入点更近的地方。在另一种替换的实施方案中,第三种选择是总在先行模式中训练分支预测器,而且还要使用队列来将分支的结果从先行模式传送到正常模式。如果存在一个预测的话,可以使用在该队列中的预测来预测正常模式中的分支。如果使用来自队列的预测来预测分支,那么它就不会再次训练预测器表。在另一种替换的实施方案中,第四种选择是针对先行模式和正常模式使用两个相互独立的预测器表,并且在进入先行条目的时候将表信息从正常模式复制到先行模式。在硬件上实施第四种选择的费用较高。大体上说,第一种选择,也就是训练分支预测器表条目两次,与第四种选择相比并不会表现出显著的性能损失。
在先行模式期间,指令可以按照程序顺序离开指令窗口。如果一条指令到达指令窗口的头部,可以考虑使其伪退出。如果考虑伪退出的指令是INV,它可以立即被移出窗口。如果它是有效的,它可能需要等待直到它得到执行(此时它可能变成INV)并且它的结果被写入到物理寄存器文卷。在伪退出的时候,指令可以释放分配给它用于它的执行的所有资源。
根据本发明的一种实施方案,在图2中,有效的和无效的指令可以在它们离开指令窗口的时候更新退出RAT 241。退出RAT 241可以不需存储与每个寄存器相关联的INV位,这是因为物理寄存器234、242已经具有了与它们相关联的INV位。但是,在指令被调度之前访问寄存器文卷的微结构中,退出寄存器文卷可能需要存储INV位。
当一个INV分支从指令窗口离开的时候,取消为恢复该分支而分配的资源,如果有的话。这对由于缺乏分支检查点而没有停止的先行模式的进行是非常必要的。
根据本发明的一种实施方案,表1显示了示例代码摘录,并且解释了每条指令在先行模式中的行为。在这个例子中,指令已经被重新命名并且在物理寄存器上工作。
表1 指令 解释 1:load_word p1<-mem[p2] 第二级高速缓冲存储器未命中,进入先行,将p1设置为INV
2:add p3<-p1,p2 从p1取得INV,将p3设置为INV 3:store_word mem[p4]<-p3 从p3取得INV,将它的存储缓冲器条目设置为INV 4:add p5<-p4,16 有效操作,正常执行,重新设置p5的INV位 5:load_word p6<-mem[p5] 有效加载,未命中数据高速缓冲存储器,存储缓冲器,先行高速缓冲存储器,未命中L2高速缓冲器存储器,发送对地址(p5)的取用请求,将p6设置为INV 6:branch_eq p6,p5,(eip+60) 带有来自p6的INV的分支,正确地被预测为采用 跟踪高速缓冲存储器未命中-当该未命中得到满足的时候,μop 1-6离开指令窗口 当它们离开窗口时,μ ops 1-6更新退出RAT μop3在地址p4分配先行高速缓冲存储器线,并且 设置从地址p4开始的4个字节的STO和INV位 一旦它的伪退出跟踪高速缓冲存储器未命中从L2得到满足,就释放分配给μops6的恢复资源 7:load_word p7<-mem[p4] 在存储缓冲器中未命中,在先行高速缓冲存储器中命中,检查地址p4的INV位,将p7设置为INV
8: store_word mem[p7]<-p5 INV地址存储将它的存储缓冲器条目设置为INV,这之后的所有加载可以在不知道的情况下取别名
根据本发明的一种实施方案,可以在任意时刻开始从先行模式中离开。为了简化,可以采用与处理分支错误预测相同的方式对从先行模式中的离开进行处理。特殊地,在机器中的所有指令可被清除,并且取消对它们的缓冲器的分配。可以将按点检查的体系结构寄存器文卷240复制到物理寄存器文卷234、242的预先确定的部分中。前面的RAT 220和退出RAT 241还可以得到修复,以指向保持体系结构寄存器的值的物理寄存器。这种恢复可以通过将相同的硬编码映射重新加载到这两个别名表而得以实现。可以使先行高速缓冲存储器202中的所有线无效(并且将STO位设置为0),并且按点检查的分支历史寄存器和返回地址堆栈可以在从先行模式中离开的时候得到存储。处理器200可以开始取用如下的指令,这些指令以引起条目进入先行模式的指令的地址开始。
根据本发明的一种实施方案,在图2中,策略可以是在阻塞加载请求的数据从存储器返回的时候从先行模式中离开。一种替换的策略是使用定时器在较早的某个时刻离开,以使得可以消除一部分流水线充满损失或者窗口充满损失。尽管较早离开的替换方案对于某些基准可以很好地起作用,但对于其它的基准来说不能很好地起到作用,从总体上讲,较早离开可以使得工作情况轻微变差。较早离开对于某些基准工作得不好的原因是与处理器200并不从先行模式中较早离开的情况相比,在较早离开情况下可以产生更多的L2高速缓冲存储器206未命中的预取请求。一种更积极的先行实施可以动态地决定何时从先行模式中离开,这是因为在最初的L2高速缓冲存储器206未命中从存储器返回之后某些基准可以通过待在先行模式中甚至数百个周期来获益。
在这里对本发明的几种实施方案进行了特殊地举例说明和描述。但是,可以理解在不偏离本发明的精神和所要覆盖的范围的情况下,本发明的修改和变化可以由上述描述涵盖并且在所附的权利要求范围之内。