减少软件数据预取的开销的机制的制作方法

文档序号:6500605阅读:192来源:国知局
专利名称:减少软件数据预取的开销的机制的制作方法
发明
背景技术
领域本发明涉及预取数据的方法,并且具体来说,涉及在循环内进行预取的方法。
背景领域目前可获得的处理器运行的时钟速度比起与之关联的存储器运行的时钟速度高很多。存储器系统的功能是掩蔽存储器与处理器之间的速度差别,并且持续为处理器的执行资源提供数据。因此,存储器系统通常除了主存储器外还包括一个高速缓存的分层结构,例如L0、L1、L2….。利用大多数程序代码显示出来的空间和时间的局部性,这些高速缓存保存有处理器可能请求的数据。例如,因为程序试图访问邻近的存储单元(空间的局部性),则数据被加载到被称为“高速缓存行”的分块的高速缓存中。相似地,最近没有被用过的数据被优选地从高速缓存中赶出,因为当数据最近被访问过,那么该数据更有可能被访问(时间的局部性)。
在高速缓存中存储数据的优点源自高速缓存相对小的尺寸和其所附带的较高的存取速度。他们是能够给处理器迅速提供数据的快速存储器结构。高速缓存的存储容量通常从L0增大到L2等,以及下面分层结构中的后继高速缓存所需返回数据到处理器的时间也是如此。数据请求通过高速缓存结构进行传播,它从最小的、最快的结构开始,直到数据被定位或耗尽所有的高速缓存。在后一种情况时,从主存储器返回被请求的数据。
尽管存储器系统设计有进步,但是某些类型的编程结构仍然使其给处理器提供数据的能力经受相当的考验。例如,从循环访问大量数据的代码段可能迅速产生许多高速缓存未命中。每一个高速缓存未命中需要一个长执行时间的访问以便对来自较高层高速缓存或主存储器的目标数据进行检索。这些访问可能会大大降低计算机系统的性能。
预取是一种众所周知的用来掩蔽主存储器向低层高速缓存(那些最接近处理器的执行资源)移动数据相关联的执行时间的技术。在远远提前于选中的目标所需时间之前发布一个预取指令。这使得该访问与其它操作相重叠,把该访问执行时间隐藏在这些操作之后。但是,预取指令要以花费他们自己的潜在性能为代价。预取请求在处理器存储器通道中增加了通信量,这会增大加载的执行时间。对于那些在连续循环迭代期间从多个数组加载数据的循环,这些问题会愈发严重。在执行相应的加载时,这样的循环会定期发布预取请求以确保低层高速缓存可以获得数组数据。如下所述,简单地在每一个循环发布请求会产生不必要的,即冗余的存储器数据量并且在相对短的时间间隔内聚集(bunch)预取。
预取返回一行数据,其中包括高速缓存的一个或多个被请求地址。每个高速缓存行通常包括充足的数据以提供给数组项进行多循环迭代。作为结果,不必在每一次循环迭代时发布预取。另外,在短的时间间隔内生成太多预取请求会降低系统性能。每个预取请求会消耗处理器存储器通信通道中的带宽,增加要求读取以及使用该通道的其它操作的执行时间。另外,在循环内部对多数组进行处理的情况下,给每一个数组提供预取操作。对这些预取的高速缓存未命中倾向同时发生,这些活动的群发进一步加重了存储器子系统的负担。处理这些问题的一个方法是循环展开(loop unrolling)。
下面示出了一个循环实例的一部分。该循环在每个循环迭代时加载和处理来自5个数组A、B、C、D、和E的数据。
Orig_LooploadA(I)loadB(I)loadC(I)loadD(I)loadE(I)...
branch Orig_Loop

图1表示根据其修改的以便采用预取的循环(I)。这里,假设每一个数组项是8字节并且每一个高速缓存行返回64字节,在这种情况下,只需对一个数组每8次循环迭代发布一个预取。在图1中这通过将循环(I)展开8次,以及通过利用连续的数组项的指令组对每个数组发布一个预取请求来完成。采用这种方式展开循环,将循环的每一次迭代所消耗的数据量调整到等于由每个预取所提供的数据量,消除了冗余的预取。另一方面,循环展开可以显著扩大程序在存储器中的覆盖区(footprint)(尺寸),并且它不能对被淹没存储器通道的预取活动的群发进行寻址。
消除冗余预取的另一种方法是对预取进行预测,计算连续迭代的预测值选通和关闭恰当的预取。实施判定计算所必需的指令扩大了代码容量并且,依赖于待定条件,可能会延缓循环。
本发明阐述这些和其它与从循环实施预取相关的问题。
发明概述本发明减少了开销指令并且改进了对软件数据预取的调度。采用寄存器循环移位将预取分发到所选的循环迭代中,减少了在任意给定循环中发布的预取的数目。它对程序从循环中访问大量数据的情况特别有用。
根据本发明,数据在循环中被由寄存器中的值进行参数化的预取操作预取。通过将新值循环移位到寄存器中来调整被预取操作选中的数据。
对于一个本发明的实施例,对预取操作进行参数化的寄存器是指示将要被预取的地址的循环移位寄存器。将一个新值循环移位到该寄存器中为随后的循环迭代改变了预取目标。对于本发明的另一个实施例,该寄存器是循环移位预测寄存器,该寄存器根据其存储的当前判定值激活或去激活预取操作。将一个新值循环移位到该寄存器中为下一次的循环迭代激活或去激活预取操作。
附图简述对本发明的理解可以参照以下附图进行,图中采用相同的数字表示相同的部分。这些附图是用来展示本发明所选的实施例而不是企图限定本发明的范围。
图1表示已根据常规方法展开以实施从循环中预取的循环。
图2是可以实施本发明的系统的实施例的方框图。
图3是根据本发明对从循环中预取进行处理的的方法流程图。
发明详述以下讨论给出了许多具体细节以便为本发明提供一个全面的了解。但是,那些从本公开中获益的本领域的技术人员应当注意到本发明可以不具备这些具体细节而进行实施。另外,并没有对许多众所周知的方法、过程、部件、和电路进行详细描述以便将注意力集中在本发明的特点上。
本发明通过减少指令开销和改进软件数据预取的调度支持有效的预取。它对在循环操作时实施数据预取特别有用。根据本发明的方法允许在由高速缓存行容量和所请求的数据容量确定的间隔的循环内发布预取而不是由循环迭代间隔确定的间隔。它们这样做不用扩大代码量或在循环内增加高代价的计算(指令开销)。更确切地说,存储在从一组循环移位寄存器中选定的寄存器的数值对循环内的预取操作进行参数化(parameterize)。通过在循环的每一次迭代时将一个新值循环移位到所选的寄存器中来对预取进行调整。
对于一个实施例,寄存器值指示由预取操作选定的地址。在循环向多数组加载的地方,选定一个预取指令以便为循环的每一次迭代时的不同数组预取数据。循环移位寄存器的容量由循环中的数组的数目确定以便预取数据。根据将要预取的数组的数目、它们的数据项(跨距)和高速缓存行尺寸,可以对每一次循环迭代优选采用多于一个预取指令。除了对每个数组控制预取频率之外,对多数组预取指令的重用减小了存储器中程序代码的覆盖区。
对于另一个实施例,寄存器是预测寄存器并且根据它所拥有的值来选通和关闭预取指令。如果循环包括了从中加载数据的单数组,那么通过对循环移位寄存器进行适当初始化可以为所选的循环迭代激活预取指令。这消除了在高速缓存行对多循环迭代返回充分数据时可能会产生的冗余预取请求。如果循环包括多数组,那么多预取指令可以由相关联的预测寄存器进行参数化。寄存器循环移位确定为各次循环迭代的哪一个数组启动了哪一个预取指令。
从本公开中获益的本领域的技术人员应当认识到该示例性的实施例可以被修改和组合以适应在具体的计算机系统中可获得的资源和程序代码的特征。
本发明可以在为寄存器循环移位提供支持的系统中被实施。为了讨论的目的,寄存器循环移位是指实施寄存器重命名的方法。在寄存器循环移位中,存储在特定的一组寄存器中的值在该组寄存器内进行循环移位。循环移位通常受指令进行控制,如循环转移指令。例如,当循环转移指令触发循环的下一个迭代时,存储在寄存器r(n)中的值在当前循环迭代中被移位到寄存器r(n+1)中。例如,在加利福尼亚Santa Clara的Intel公司出版的IA-64应用指令组结构指南中对循环移位进行了描述。更加详细的描述可以在Rau,B.R.,Lee,M.,Tirumalai,P.,and Schlansker,M.S.Register的“软件管道循环的分配”(Allocation For Software Pipelined Loops),SIGNPLAN’92编程语言设计和实现研讨会论文集(proceedings of the SIGNPLAN’92Conference on programming Language Des ign and Implementation),(旧金山1992)中获得。
可获得的进行循环移位的寄存器的数量和类型可以随寄存器的类型的不同而发生变化。例如,Intel的IA-64指令组结构(ISA)提供64种循环移位判定寄存器,96种循环移位浮点寄存器,和一些通用的循环移位寄存器。在IA-64 ISA中,128种通用寄存器中多达96种寄存器可以被定义为循环移位类型。循环移位通用寄存器被定义为8的倍数。
图2是可以实施本发明的系统200的实施例的方框图。系统200包括处理器202和通过系统总线280和存储器总线284与系统逻辑290耦合的主存储器270。系统200通常还包括图形系统和也与系统逻辑290通讯的外设(没有示出)。
公开的处理器202的实施例包括执行资源210、第一高速缓存(L0)220、第二高速缓存(L1)230、第三高速缓存(L2)、高速缓存控制器250、和总线控制器260。处理器202通常还包括其它用来检索和处理指令以及当指令退役时更新其结构状态的逻辑元件(没有示出)。总线控制器260管理处理器202与主存储器270之间的数据流。L2高速缓存240可位于不同于处理器202的芯片上,在这种情况下,总线控制器260也可以管理L2高速缓存240与处理器202之间的数据流。本发明不依赖于存储器或处理器系统的详细结构。
L0高速缓存220、L1高速缓存230、L2高速缓存240、和主存储器270构成一个执行资源210提供数据和指令的存储器分层结构。该指令在数据(操作数)上操作,从寄存器堆214提供这些数据或者这些数据被旁路到来自存储器分层结构若干部分的执行资源210。预测寄存器堆218可以有条件地用来执行程序中所选的指令。操作数数据分别地通过加载和存储操作被来回传送。加载操作在特定的存储器地址对存储器分层结构进行数据搜寻,并且从发现被请求数据的分层结构的第一层返回数据到寄存器堆214。存储从寄存器堆214中的寄存器向存储器分层结构的一层或多层写数据。
对于本发明,通过寄存器重命名单元216可以对寄存器堆214、218的部分进行循环移位。当执行资源210实施一个根据本发明管理的预取的循环时,通过对寄存器的循环移位将预取操作导向存储器270的数据区274中的不同位置。这些预取操作将数组数据移到一个或多个低层高速缓存220、230,此处,它们可以在到达相应的循环迭代时被循环中的加载指令快速访问。对数据的预取、加载、和处理指令在执行期间通常存储在存储器270的指令区域278。它们可以从非易失性存储器结构(硬盘、软盘、CD等)提供给主存储器。
本发明的实施例通过特定的代码段被展示出来并且具有如下的理解从本公开中获益的本领域的技术人员应当认识到这些代码段的各种变化处于本发明的精神实质范围内。
通过以下的代码段展示出本发明的一个实施例(II)r41=address of E(1+X)r42=address of D(1+X)r43=address of C(1+X)r44=address of B(1+X)r45=address of A(1+X)LoopPrefetch[r45]R40=r45+INCR…..
load A(J)load B(J)
load C(J)load D(J)load E(J)……..
J=J+1Branch LoopA、B、C、D、和E代表数组,它们的数组项被相应的加载指令从代码段(II)的循环部分内访问。当适当地对预取进行同步时,可以在低层高速缓存中获得被这些加载选中的数组项,并且能够以低访问执行时间提供给处理器的执行资源,例如,一个或二个循环周期。在代码段(II)中,这通过选择适当的值给地址偏差,X,和地址增量,INCR来完成。
在开放循环中,在该当前循环迭代运行在数组项(J)上时,该预取选定数组项(J+X)。这里,X代表数组项的数目,由该数目选定的数组项跟随该当前的数组项。实际上,X表示当执行选定J+X的加载时确保元J+X必然在高速缓存中所必需的前置时间。X的值依赖于实施代码段(II)的每一次迭代所需的周期数目,和从主存储器返回数据的执行时间。例如,如果代码段(II)在10个时钟周期内完成了一次迭代并且用了100个时钟周期从存储器返回一个高速缓存行,那么该循环中的当前迭代应该选定的元超前该循环中的当前迭代中的元至少10个项。
对于代码段(II)的每一次迭代,预取指令选定r45中被指定的一个地址。这里,r45是指向物理寄存器中的值的虚拟寄存器标示符。物理寄存器与虚拟寄存器标示符之间的通信由寄存器重命名算法提供,在该情况下寄存器重命名算法是寄存器循环移位。对于代码段(II),r41-r45被分别初始化到数组E-A中的数组项的地址。当执行循环转移指令时,这些寄存器中的值在循环的每一次迭代被循环移位。寄存器循环移位对在代码段(II)的每一次迭代时施加预取指令的数组进行调整。这消除了分离各数组的预取指令的需要和与被转移的预取相关联的带宽问题。它还允许调整对具体数组的发布预取的频率以便反映出由预取返回的高速缓存行的容量和该数组的跨距。
赋值指令,r40=r45+INCR为其下一次预取递增该数组的目标地址并且将其返回到循环移位寄存器组中的起始寄存器中。在代码段(II)中,该预取每5次迭代选定给定数组的一个数组项--该循环迭代数目是将递增的数组地址从r40移回到r45所必需的。作为结果,预取在5次连续迭代时选定数组项A、B、C、D、和E,然后在第6次迭代从数组A开始重复该循环。
赋值指令中的递增值依赖于以下参数在每次预取时返回的高速缓存行的容量(L);行读取之间的迭代数目,即请求预取的数组的数目(N);以及数组项的尺寸(跨距)(M)。该高速缓存行容量被跨距除得到由单行读取提供数据的迭代的数目。例如,高速缓存行是64字节(L=64),5个数组需要数据(N),以及每个数组项是8字节(M=8)INCR=N*L/M对于上述实例,INCR=5*64/8=40某些ISA,例如IA-64ISA,提供自动递增的由指定值预取的地址的预取指令,例如预取[目标地址]、地址递增。对于这些ISA,预取和赋值指令可以由一个自动递增prefetch指令和一个MOV指令代替。例如,循环(IIa)中的前二个指令可以由prefetch[r45]、40和movr40=r45代替。
表1示出了预取数组A的循环(II)的迭代、启动预取时A的当前数组项、将要被预取的数组项的地址、和被预取返回的数组的数组项。表中的条目适合X=20的情况。


代码段(II)中被具体化的方法不产生冗余的预取。例如,在第10第25,第35和第50迭代启动的预取选定与第5,第20,第30和第45迭代启动的预取相同的高速缓存行。当在高速缓存行中被返回的数组项的数目与预取之间的迭代数目不成比例关系时产生冗余的预取。但是该冗余水平比在每一次迭代都启动预取得到的冗余水平要低得多。另外,处理器可以包括逻辑电路来确认和消除冗余的预取。
本发明的另一个实施例由以下的代码段示出(III)p41=truep42=falsep43=falsep44=falsep45=falsep46=falsep47=falsep48=falser4=address of A(1+X)r5=address of B(1+X)r6=address of C(1+X)r7=address of D(1+X)r8=address of E(1+X)(IIIa)Loop(p41)prefetch[r4],64(p42)prefetch[r5],64(p43)prefetch[r6],64(p44)prefetch[r7],64(p45)prefetch[r8],64
p40=p48loadA(J)loadB(J)loadC(J)loadD(J)loadE(J)...
J=J+1Branch Loop在进入循环(IIIa)之前,对一组循环移位判定寄存器p41-p48进行初始化使得至少一个判定代表逻辑真值。另外,将一组非循环移位寄存器r4-r8中的每一个寄存器为数组A-E中的一个数组初始化到一个预取地址。这里,X代表相对于该数组的第一地址的偏差。如前面实施例中,在执行加载选定之前,它被选择为返回到高速缓存的预取数据提供充足的时间。
循环(IIIa)包括一个针对每个数组的判定的预取指令。当判定寄存器在连续循环迭代期间循环移位时,真判定值移到连续的判定寄存器。在每次迭代时,由当前拥有真值的判定寄存器选通的预取指令被激活。其它预取指令被去激活(被预测关闭)。在寄存器组中的8个判定寄存器当中,只有5个选通的预取指令。最后3个是虚指令它允许对数组的预取频率与高速缓存行容量和数组跨距同步。对于该公开的实施例,利用将真判定值经过8个循环移位寄存器进行循环移位,每8次迭代激活一个预取。这使得预取(8)之间的迭代数目等于由高速缓存行(8)返回的数组项的数目,消除了冗余的预取。
对于该公开的实施例,被激活的预取指令在相应的寄存器中自动以64字节递增地址,例如,8个数组项。对于其它的实施例,如代码段(II)中通过简单的预取指令(不具备自动递增能力的预取指令),和一个赋值指令(r4=r4+64)可以完成同样的操作。
跟随被判定的预取,赋值指令,p40=p48将判定寄存器组中的最后的判定寄存器中的值循环移回到可以通过该判定寄存器组重新开始循环的位置。基于IA-64ISA的代码段(III)的实施例可以利用下面的比较指令实施赋值(p48)comp.eq.unc p40,p0=r0,r0.
该IA-64ISA还允许利用单一指令pr.rot=0×20000000000实施判定初始化,它将P41初始化到真,将其它判定寄存器初始化到假。
图3是一幅根据本发明的执行从循环中的软件预取的方法300的流程图。在进入方法300中的循环部分之前,将一组循环移位寄存器初始化310。例如,如代码段(II)所示,循环移位通用寄存器可以由数组的第一地址进行初始化。另一种方法,如代码段(III)所示,循环移位判定寄存器可以通过逻辑值真或者假进行初始化,以激活所选的预取指令。在这种情况下,非循环移位通用寄存器被初始化到数组的第一预取地址。
初始化310之后,开始了方法300的循环的部分。为通过循环移位寄存器组指定的数组预取高速缓存行320。对于公开的实施例,这可以通过由一个或多个循环移位寄存器参数化的预取指令来完成。对于代码段(II),目标地址是该参数并且指明该目标地址的通用寄存器对预取进行参数化。对于代码段(III),与预取指令相关的判定是参数,并且拥有这些值的判定寄存器对它们的相关的预取进行参数化。在每一种情况下,改变指定寄存器中的值也就改变了由预取操作选定的数组。跟随预取320,进行了预取的数组地址被调整指向包含将要为数组进行预取的下一个组元的高速缓存行330。
在循环的每一次迭代期间,执行循环本体中的任意指令,例如加载指令以及在被加载的值上操作的任意指令340。尽管它们在图中显示在预取320和调整330之后,但是它们在方法300中的顺序并不重要。剩下的指令可以在预取和调整当前数组地址之前、之后、或同时被执行。在每一次循环迭代时,查验终止条件350并且如果该条件被满足则终止循环370。如果还有另外的迭代,则对寄存器进行循环移位以便为下一次迭代更新预取指令360,并且重复该循环。根据所采用的计算机系统,恰好满足循环条件时,寄存器可以被循环移位。
所以通过减少冗余预取和在整个多循环迭代期间分配预取活动,本发明支持从循环中有效的预取。这不用扩大循环的代码容量或者增加指令开销就可以完成。对一组循环移位寄存器进行初始化,并且利用一组循环移位寄存器对循环中的一个或多个预取指令进行参数化。当寄存器在循环的连续迭代期间进行循环移位时,对预取指令的操作,例如,目标地址、激活/NOP状态进行调整。本发明可以有益地应用于从循环中实施预取指令的任何代码中。
公开的实施例是用来展示本发明一般特点。从本公开中获益的计算机软件领域的技术人员应当认识到对这些实施例的修改和改变没有偏离本发明的构思。本发明仅受所附权利要求的限制。
权利要求
1.一种用于预取数据的方法,包括对被指示数组的预取操作进行初始化;为一个或者多个数组加载数据,包括被指示的数组;以及执行寄存器循环以指示新数组。
2.权利要求1的方法,其中对预取操作的初始化包括对由指定的循环寄存器指示的数组的预取操作进行初始化。
3.权利要求2的方法,其中执行寄存器循环包括在指定的循环寄存器中递增一个值以指向一个被指示数组的新的数组项;并且将一个与新数组相关联的地址循环到循环寄存器中。
4.权利要求1的方法,还包括对多循环寄存器初始化以指向所选的在进入循环之前的对应的多数组中的数组项。
5.权利要求1的方法,其中对预取操作的初始化包括对与被指示数组相关的预取操作的初始化。
6.权利要求5的方法,其中预取操作通过一个拥有特定逻辑值的循环预测寄存器与被指示的数组相关联。
7.权利要求6的方法,其中执行寄存器循环包括将特定的逻辑值循环到一个与新数组相关联的预测寄存器中。
8.一种从多个数组预取数组项的方法,该方法包括为通过预取参数指定的数组的数组项发布预取;从多个数组中的每一个加载数据;并且调整预取参数。
9.权利要求8的方法,其中该预取参数被存储在一个选通与数组相关联的预取的循环预测寄存器中,以及发布预取包括在该预测寄存器拥有一个特定逻辑值时发布预取。
10.权利要求9的方法,其中对预取参数的调整包括通过寄存器循环将逻辑值移到该预测寄存器中。
11.权利要求8的方法,其中该预取参数是一个存储在指定循环寄存器中的数组地址,以及发布预取包括将该预取发布到由该地址指示的数组的数组项。
12.权利要求11的方法,其中调整该预取参数包括将与其它数组相关联的地址循环到指定的循环寄存器中。
13.一种机器可读介质,其上存储可以被处理器执行的指令以实施一种方法包括发布一个被寄存器参数化的预取操作;调节一个被预取操作选定的地址;并且将新值循环到该寄存器中。
14.一种计算机系统,包括一个执行指令的处理器;以及一个存储了指令的存储器,该指令可以被该处理器执行以实施一种方法包括发布一个被寄存器参数化的预取操作;调整被该预取操作选定的地址;并且将新值循环到该寄存器中。
全文摘要
本发明提供了一种用以从循环内有效地预取数组数据的机制。一组循环移位寄存器中的一个寄存器对预取指令进行参数化。在每一次循环迭代时,根据该参数化的预取指令实施预取,并且对被该预取指令选中的地址进行调整。针对每一次循环迭代都要对寄存器进行循环移位,并且相应地对由循环移位寄存器参数化的预取指令进行调整。针对给定数组的预取之间的迭代数目由循环移位寄存器组中的组元数目确定。
文档编号G06F9/32GK1353832SQ00808209
公开日2002年6月12日 申请日期2000年5月12日 优先权日1999年5月28日
发明者G·B·多施, K·穆图库马 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1