对集群处理器中的通信并行性折衷的动态管理的制作方法

文档序号:6656346阅读:212来源:国知局

专利名称::对集群处理器中的通信并行性折衷的动态管理的制作方法
技术领域
:本发明涉及用于管理集群处理器的运行的方法,具体地,涉及用于动态管理集群处理器中的通信并行性折衷的方法。
背景技术
:从现代处理器上的公共应用程序中提取大量的指令级并行性(ILP)需要使用许多功能单元和大的片上结构(诸如发布队列、寄存器组、缓存和分支预测器)。随着CMOS工艺技术持续缩短,线延迟成了主导控制因素(与逻辑延迟相比)。这与朝着更快时钟速度持续发展的趋势一起增加了存取常规片上结构(缓存、寄存器组等)的时间周期。这不仅降低了每周期指令(IPC)的性能,还会在将该存取分解成多个管线级时出现各种设计问题。尽管可用于体系结构的晶体管数量增加了,但越来越难以在不增加设计复杂度、不危及时钟速度以及不限制未来工艺技术的可升级性的情况下设计有助于ILP提取的大型单片集成电路结构。一种针对这些设计挑战的潜在解决方案是集群微体系结构,其中将关键的处理器资源分布在多个集群上,其每一个包含发布队列、寄存器组和功能单元的一个子集。在此设计中,在进行指令重新命名时,每个指令均被导引到其中的一个集群中。降低发布队列和寄存器组的大小和带宽要求的结果是,大大减少了这些周期时间苛求结构的存取时间,由此允许更快的时钟。这些结构的简化还降低了它们设计的复杂度。集群微体系结构的有吸引力的特征在于降低了为制造一处理器的连续数代产品而耗费的设计努力。不仅单个集群的设计大大得到了简化,而且一旦单个集群核设计完成,可将更多的这些核放入处理器中,用以在晶体管的预算增加时获得较低的设计成本(包括增加前端带宽)。增加更多的集群可能会潜在地提高IPC性能,因为每个程序都有更多的资源可与其一起工作。这样做对时钟速度几乎没有影响,即使有也是很小,因为每个集群个体的实施不改变。此外,即使大型集群处理器中的资源无法被单个线程有效使用,在一个集群处理器上对多个线程进行调度也可以极大地增加总的指令吞吐量。相对较低的设计复杂度和开发线程级并行性的潜在可能使得高度集群的处理器在十亿级晶体管时代成为极富吸引力的选择。集群微体系结构的主要缺点是与具有相同资源的单片集成电路设计相比降低了IPC。尽管在单个集群中的相关指令可以在连续的周期内发布,然而额外的集群间迂回延迟却阻止了位于不同集群内的相关指令在连续周期内发布。单片集成电路处理器可以使用潜在地慢得多的时钟以获得所有功能单元之间的单周期迂回,而集群处理器则允许更快的时钟,由此在一些功能单元之间引入额外的多个周期的等待时间。该集群设计仅在IPC的降低不会抵消时钟速度的提高时才是可行的选择。现代处理器像0.35μ技术的Alpha21264已经采用了有限的集群设计,其中例如整数域分为两个集群。最近有大量研究探究了将指令导引至集群的启发式设计。尽管出现了这些进步,在不久的将来由于以下原因这些研究的结果很可能需要重新考虑。1.由于线延迟逐渐成为主导因素以及时钟速度增长的趋势,与现有研究中假设的资源相比,每个集群核中的资源需要大大降低。2.由于更高的晶体管预算和开发线程级并行性的潜在可能,在模具上将会有比现有研究中假设的具有更多的集群。3.由于线延迟问题,用于在最远的两个集群之间传送数据的周期数将会增加。此外,通信延迟是不一致的,根据制造商和消费者节点的位置而变化。4.由于互联成本的增加和与其它集群资源相适应地升级缓存的期望,与大多数现有研究假设的集中式缓存不同,数据缓存需要分布在集群中。虽然大量集群的使用可能会大大推进多线程工作量的总吞吐量,其对单线程程序的性能的影响还不是那么明显。上述趋势的累积效果是集群处理器将受到的通信限制比现有模型中假设的要多得多。随着芯片上集群数量的增加,线程可以使用的资源的数量也在增加,这支持了较大的未完成指令窗口,并由此允许开发出更远的指令级并行性(ILP)。同时,该程序的各种指令和数据得以在更大的片上空间上分布。如果必需在不同集群之间频繁地传送数据,那么由于增长的通信而导致的性能降低可能抵消从由额外资源利用的并行性而产生的任何益处。在过去十年中出现了大量基于集群处理器的建议。这些建议的不同之处在于可分配的资源种类、指令导引启发和用于集群间通信的语义。缓存是在所有这些模型中的集中式结构。这些研究假设具有中等的通信成本的总数少量的集群。许多最近的工作体着眼于具有多重配置选择和用于在运行时挑选适当配置的算法的硬件单元。这些算法中有很多是基于间隔的,因为它们在固定的指令间隔或周期间隔内监控各种统计,并且基于该信息做出配置决定。在子例程边界处适配可比使用固定的指令间隔更有效。很多最近的工作已建议运行时算法用以对硬件进行动态的调整以符合程序阶段的要求。大多数这种技术使用基于间隔的算法,其中在最后几个间隔内的测量指示在随后间隔内的配置选择,其中间隔即预定数量的提交指令。将来的新生代处理器可能由于线延迟的高成本而遭受更低的IPC。
发明内容本发明的目的是克服现有技术的不足。为了实现上述和其它目的,本发明针对一种动态可调整的集群体系结构,其在面对上述趋势的情况下优化了通信并行性折衷从而获得改善的单线程性能。通过只采用该线程可用的全部集群的一子集来实现平衡。我们的结果显示基于集群数量的性能趋势根据集群中存在的远ILP的程度对于不同程序是变化的。因此开发了识别用于任意程序阶段的最佳集群数量并将硬件与程序要求相匹配的动态算法。我们给出在任意程序点改变工作集群数量的算法,并示出一查看过去几个间隔中的性能历史的简单算法通常会产生大部分可得到的性能改善。但是这种算法失去了精细粒度的重新配置的机会,我们也给出了投入更多的硬件尝试针对这些错过的机会的替换技术。该简单的基于间隔的算法总的来说提供了11%的改善程度,而精细粒度的技术可获得超出最佳静态结构15%的改善程度。为了改善单线程性能而针对给定的程序阶段禁止集群的子集具有其它有利含义。整个集群可以关闭其供应电压,由此可大大节省泄漏能量,这是一种在单片集成电路的处理器中不可能达到的技术。可替换的,这些集群可(分布在其它线程中)由其它线程使用,由此同时实现优化单线程和多线程吞吐量的目标。我们给出和评估了缩短工艺技术和占主导地位的线延迟对未来集群处理器设计的影响。在增加集群数量以利用增加的芯片密度改善处理器支持多线程的能力的同时,单线程的性能会被不利地影响。这是因为这种处理器受到集群间通信成本的制约。随着处理器被调整为包括大量的集群,这些成本可能会成为指令级并行性的任何增加的提取的主导的控制因素。我们已经证明利用基于探测的方法以规则间隔动态地选择集群数量在优化对于单线程的通信并行性折衷方面是有效的。该方法可用于几乎每个程序,并可获得高于我们的基本体系结构11%的平均性能改善程度。为了以精细的粒度来利用阶段变化,需要投入额外的硬件,这使得总改善程度达到15%。由于平均8.3个集群被重新配置机制禁止,因此有可能在单线程模式中节省大量的泄漏能量。多线程工作负载吞吐量还可以通过使一组集群动态地专用于每个线程来避免线程间的干扰而得到改善。我们已经针对大量感兴趣的处理器模型验证了我们结果的有效性,由此突出了管理通信并行性折衷在未来处理器中的重要性。我们是第一个建议识别可变长度指令间隔的重要性并将其组合到选择算法中。我们也是第一个在分支边界查看精细粒度的重新配置,并将其与基于间隔的机制相比较。我们是第一个研究将焦点集中在单工艺技术并研究分析加入更多资源的效果。该集群处理器模型揭示了在通信和并行性之间清楚的折衷,并且很容易使其适宜于低成本的重新配置。下面参考附图公开本发明的优选实施例及其改型。其中图1和图2是示出两个其中可实施优选实施例的集群处理器配置的框图;图3是示出固定集群结构的IPC(指令/周期)性能的图;图4是示出基本情况的和基于间隔的机制的IPC性能的图;图5是示出基本情况的、具有探测(exploration)的基于间隔的算法的、和两个精细粒度的探测机制的IPC性能的图;图6是示出用于具有分布式缓存的处理器模型的动态的基于间隔的机制的IPC性能的图;图7是示出用于具有网格互连的处理器模型的动态的基于间隔的机制的IPC性能的图。具体实施例方式下面参照附图详细描述本发明的优选实施例及其改型,其中,在说明书全文中,相同的附图标记代表相同的元件。首先来描述已经在之前研究中普遍使用的基线集群处理器模型。此模型在图1中以100示出,具有4个集群102(各表示为102-1、102-2、102-3、102-4)。这4个集群102的上游是指令缓存104、分支预测器106、指令取出缓存108、导引寄存器重命名单元110和重排序缓冲器112。在每个集群102内都有发布队列114、寄存器组116和功能单元118。集群102的下游是加载/存储队列(LSQ)120和数据缓存122。分支预测器106和指令缓存104是集中式结构,正如在传统处理器中那样。在导引寄存器重命名单元110中进行寄存器重新命名时,每个指令被分配给特定的集群。每个集群102都有其自己的发布队列14、寄存器组116、一组功能单元118和其自己的局部迂回网络。在集群内对结果的迂回不需要花费额外的周期(换句话说,在同一集群内相关指令可以在连续周期中发布)。但是如果消费指令不在与制造者相同的集群内,该指令就必须等待额外的周期才能在两个集群之间进行传送。传统的集群处理器只在集群102中分布寄存器组116、发布队列114和功能单元118。数据缓存122被集中放置。一种替换的结构是将缓存分布于集群中,由此使设计更容易升级,但同时增加了实施复杂度。由于两种结构都是有吸引力的设计选择,下面对这两种结构的动态调整效果进行评估。在传统的集群设计中,一旦准备好加载和存储,就将它们插入集中的加载-存储队列(LSQ)120。存储在提交时从该队列被发送到集中的L1缓存,而加载在已知不与较早的存储冲突时被发布。LSQ被集中化,因为在任何集群中的加载可能与来自任何其它集群的较早存储相冲突。对于正在研究的侵入式处理器模型,缓存必须服务于每个周期的大量的请求。实施高带宽缓存的有效途径是使其字交叉。对于4路字交叉的缓存,数据阵列被分为4个存储体(bank),每个存储体每个周期可服务于一个请求。字地址形式为4N的数据存储在存储体0中,字地址形式为4N+1的数据存储在存储体1中,等等。这样一种结构支持最大为4的带宽,并有助于最小化与存储体的冲突。在具有集中式缓存的处理器中,加载等待时间取决于集中式缓存与发布该加载的集群之间的距离。在我们的研究中,假设集中式LSQ和缓存与集群102-1同处一地。因此从集群102-1发布的加载不会遭遇任何通信成本。从集群102-2发布的加载用一个周期来将该地址发送到LSQ和缓存,再用另一个周期来取回该数据(假设集群之间的每一跳要用一个周期)。类似的,集群102-3对于每个加载要遭遇4个周期的总通信成本。这是除了执行缓存RAM查询所需要的几个周期之外。现在讨论导引启发(steeringheuristics)。集群设计允许更快的时钟,但由于集群间通信和负载的不平衡引起值得关注的IPC降低。利用智能指令控制来最小化这些不利结果已成为很多最近研究的焦点。我们使用有效的导引启发,其将指令(及其目标寄存器)导引至产生大多数其操作数的集群。在持平的情况下或在发现发布队列占有中的不平衡的情况下,将指令发送给被最少加载的集群。通过选择适当的阈值来检测加载不平衡,这样的算法还可以近似于其它建议的导引启发,如Mod_N和First_Fit。前者通过将N条指令导引给一个集群然后又导引给其邻居来最小化加载不平衡。而后者通过在将指令导引给一个集群的邻居之前填满该集群来最小化通信量。我们通过实验确定负载平衡的最佳阈值。此外,我们的导引启发还使用临界预测器对产生临界源操作数的集群给予更高的优先级。因此我们的启发代表了在导引机制中的技术状态。在高度集群的处理器中,集中式缓存可能是主要的瓶颈,因为其必须支持高带宽,并且其到发出请求的集群之间的平均距离也增加了。因此,分布式的缓存模型代表了有吸引力的设计选择。对于N-集群的系统,假设L1缓存被分成N个字交叉的存储体。每一存储体都与其自己的集群关联。LSQ也被分开处于不同的集群中。图2的例子示出具有4个集群的结构。图2的处理器模型200与图1的处理器模型100的不同之处在于每个集群202包括分布式LSQ220和分布式数据缓存222。此外,还提供存储体预测器209。由于各存储体是字交叉的,因此它们缓存相互独立的数据,不需要在它们之间存在任何缓存相关协议。该控制机制的目标是将加载或存储发送到缓存相应存储器地址的集群。下面讨论由于该缓存的分布式特性而引起的附加的控制复杂性。L2缓存继续与集群1(202-1)共处一地,未命中除了与该集群关联的L1缓存存储体外的任何其他L1缓存存储体会引起依赖于跳数的额外的等待时间。随着工艺技术缩短和集群数量增加,必须关注集群之间的通信延迟和互连拓扑。集群间通信在前端且在集群之间传送寄存器值时或在存取缓存时出现。由于前者出现在每个周期中,我们假设一单独的网络用于此目的,并且对不统一的分派等待时间以及将分支误预测传送回前端的附加等待时间建模。由于后面两个(缓存和寄存器到寄存器通信)涉及至/自寄存器的数据传输,我们假设使用相同的(单独)网络。在该优选实施例中,由于环互连的实施复杂度较低,我们将注意力集中在环互连上。每个集群直接与另外两个集群连接。我们假设有两个单向环,意味着一16-集群的系统具有总共32条链路(允许在一个周期中进行总共32次传输),其中任何两个节点之间的最大跳数是8。下面作为我们灵敏度分析的一部分,还示出网格互连的结果,其具有更大的实施成本但更高的性能。集群以二维阵列布局。每个集群直接与多达4个其它的集群连接。对于16个集群总共存在48条链路,其中最大跳数是6,由此降低了总通信费用。我们的仿真器基于针对AlphaAXP指令集的Simplescalar-3.0。对该仿真器进行了修改,以代表类似Alpha21264的微体系结构。寄存器更新单元(RUU)被分解为发布队列、物理寄存器组和重排序缓冲器(ROB)。发布队列和物理寄存器组进一步被分成整数型(int)和浮点型(fp)。因此在我们研究中的每个集群本身被分解为整数型和浮点型集群。还对存储器的层次结构进行了详细建模(包括字交叉存取,总线和端口竞争、写回缓冲器等等)。该基本处理器结构被修改,以对集群的微体系结构进行建模。为代表在将来技术中受线延迟约束的处理器,假设每个集群核具有每种类型的一个功能单元,30个物理寄存器(int和fp,每一个)和15个发布队列项(int和fp,每一个)。可在一周期内发布如可用功能单元个数一样多的指令。假设互连上的每跳仅用单个周期。虽然没有对跟踪缓存建模,我们假设一次可以从多至两个基本块中取出指令。重要的仿真参数总结在下面的表1中。表1我们研究的焦点集中在将来受线限制的技术,并且根据0.035μ的项目选择等待时间。我们使用CACTI-3.0来估计该缓存结构的存取时间。利用Simplescalar,我们对具有不同大小和端口参数(由此包括不同等待时间)的缓存结构进行仿真以确定最佳的基本情况。这些参数总结在下面的表2中。集中式缓存对于4路字交叉的32kB缓存产生最佳性能。此缓存具有每周期4次存取的带宽和6个周期的存取时间。最佳的分布式缓存结构在每个集群中具有一单端口4周期16kB的存储体。表2作为基准组,使用4个SPEC2k整数型程序、3个SPEC2kFP程序和两个来自UCLAMediabench的程序。这些程序的细节在表3中列出。这些程序代表各种程序类型的混合,包括高和低IPC代码以及由存储器、分支误预测等限制的那些。这些程序的大多数都通过第一二十亿个指令被快速转发并被详细仿真以便在进行测量之前预热各种处理器结构。虽然对侵入式处理器模型仿真,但并非所有我们的基准程序都具有高的IPC。注意侵入式处理器设计受到运行高IPC代码的需要和支持多线程的需要的激励。在两种情况下,快速完成单个低IPC线程仍然是很重要的,因此需要在基准组中包含这样的程序。表3为简明起见,我们将最初的分析集中于具有集中式缓存和环形互连的16-集群模型。图3示出静态地使用固定的集群子集用于程序的效果。增加集群的数量就增加了从集中式缓存加载/存储指令的平均距离和最差情况下的集群间迂回延迟,由此大大影响了总通信成本。假设加载和存储的零集群间通信成本使性能改善31%,同时假设寄存器到寄存器通信的零成本使性能改善11%,表明增加了的加载/存储等待时间是通信开销的主导因素。该等待时间可以通过将加载/存储引导至最接近缓存的集群来减少,但这又会增加负载的不平衡和寄存器通信。在16集群系统中,集群间寄存器通信的平均等待时间是4.1个周期。同时,使用更多的集群还可向程序提供更多功能单元、寄存器和发布队列项,由此允许其分派较大的未完成指令窗口。根据这两个冲突力量中哪一方占据主导地位,随着集群数量的增加,性能或者提高或者恶化。具有远ILP的程序如djpeg(从Mediabench进行JPEG解码)、swim、mgrid和galgel(来自SPEC2K的基于循环的浮点型程序)受益于使用很多资源。另一方面,大多数分支预测精确性很低的整数型程序无法使用大的未完成指令窗口。因此仅增加资源会由于额外的通信成本而降低性能。这是一种迄今还没有在集群处理器中观察到的现象(部分因为很少有研究关注超过4个集群,部分因为早期的研究假设在存取集中式缓存时没有通信成本)。我们的目标是通过向程序动态分配集群使硬件适应程序的要求。这可以通过修改导引启发以禁止向被禁止的集群分派指令来达到。换句话说,禁止等效于不向该集群分配任何新指令。已经分配给该被抑制的集群的指令则允许完成,从而得到该集群自然流失的结果。在每个程序阶段开始时,将每个配置选项运行一段间隔并记录IPC。然后选择具有最高IPC的配置,并使用该配置直到检测到下个阶段变化为止。这样一种机制强烈地依赖于程序在多个间隔期间维持一致性能的能力。我们发现浮点型程序通常表现出这种特征,而整数型程序表现出更大的可变性。尽管早期的研究假设固定的间隔长度,但我们发现这可能会导致多个程序的性能非常差。因此,选择适当的间隔长度是配置选择算法成功的基础(并且除了该数量的集群之外还可以通用于该处理器的其它方面的配置)。为了研究程序性能在不同间隔期间的可变性,我们运行数十亿指令的每个程序,从而以均匀的10K指令间隔产生不同统计数据的绘图。我们使用3种度量来定义程序阶段-IPC、分支频率和存储器参考频率。在每个程序阶段开始时,在第一间隔期间收集的统计数据用作参考。对后面的每个间隔,如果对于该间隔,这3种度量类似于参考点,则该间隔被称为“稳定的”。如果这3种度量中任何一个显著不同,则宣称该间隔是“不稳定的”,并且开始一个新的程序阶段。该分析是对很多间隔长度进行的。间隔长度的不稳定系数是被认为“不稳定的”间隔所占的百分比,也就是阶段变化发生的频率。在我们的研究中,发现仅探查可能的配置的有限子集(2、4、8和16个集群)就足够了,因为它们覆盖了绝大部分感兴趣的情况。5%的不稳定系数确保了低于15%的间隔处于次优的配置。下面的表4示出向每个程序提供低于5%的可接受的不稳定系数的最小间隔长度。如表所示,所出现的作为最佳的间隔长度在10K和40M之间变化。我们还示出针对10K指令的固定间隔长度的不稳定系数。很明显,该间隔长度对大量程序而言都工作欠佳,并导致无法令人接受的性能。绝大多数程序通常对在足够粗略的间隔长度的若干间隔内表现出一致的特性,这使得基于间隔的机制非常强壮并且可以通用。即使像parser(语法分析程序)这样的、其特性基于输入数据显著变化的程序对于40M的大的指令间隔也具有较低的不稳定系数。表4为了在运行时达到最佳指令间隔长度,我们使用简单的算法。我们从最短指令间隔开始。如果不稳定系数太高,则将该间隔的大小加倍,并重复这一算法直到遇到较低的不稳定系数或者达到预先指定的界限(如十亿条指令)。如果达到该界限,则停止采用该选择算法,并选择最常选择的配置。一旦选择了间隔长度,我们不需要一直保持在该间隔长度。该程序可以从一个大的宏阶段移动到另一个可能具有完全不同的最佳指令间隔的宏阶段。为了进行此处理,我们可以继续分层地建立阶段检测算法。以粗略的粒度(如每千亿条指令)检查统计数据的算法可能触发对新的宏阶段的检测,在该点,可能要以10K的间隔长度重新启动该选择算法,并重新找到最佳间隔长度。为了完备性,在下面列出的代码中,我们描述了在运行时选择间隔长度、检测阶段并选择最佳配置的算法。在阶段开始时,在第一间隔中收集的统计数据用作参考点,相对该参考点来比较将来的统计数据并检测阶段变化。分支和存储器参考频率是独立于微体系结构的参数,即使在探测过程中也能用于检测阶段变化。探测之后,选择最佳执行的配置,且其IPC也用作参考。如果分支的数量、存储器参考的数量或者IPC与参考点显著不同,则发信号表明阶段变化。有时,在一间隔期间,IPC还存在微小的变化(也许是由于分支误预测或者缓存未命中的突然出现而导致的),其后,特性返回到前一阶段的特性。为了在这种情况下阻止不需要的探测,我们容许IPC测量(用numipc变化参数)中的一些噪声。此外,如果阶段变化很频繁,则增加不稳定变量,且最终间隔长度加倍。用于动态选择集群数量的运行时算法初始化和定义;interval_length=10K;(numberofcommittedinstrsbeforeinvokingthealgo)discontinue_algorithm=FALSE;(ifthisisset,nomorereconFigurationsareattempteduntilthenextmacrophase)have_reference_point=FALSE;(thefirstintervalinanewphaseprovideeareferencepointtocomparefutureintervals)significant_change_in_ipc(thisissetiftheIPCinthecurrentintervaldiffersfromthatinthereferencepointbymorethan10%)significant_change_in_memrefs;(thisissetifthememoryreferencesinthecurrentintervaldiffersfromthereferencepointbymorethaninterval_length/100)significant_change_in_branches;(similartosignificant_change_in_memrefs)num_ipc_variations=0;(thisindicatesthenumberoftimestherewasasignificant_change_in_ipc)stable_state=FALSE;(thisissetonlyafterallconfigsareexplored)num_clusters;(thenumberofactiveclusters)instability=0;(numberináicatingphasechangefrequency)THRESH1=THRESH2=5;THRESH3=1billioninstructions;InGpectstatisticsevery100billioninstructions.If(newmacrophase)Initializeallvariables;If(notdiscontinue_algorithm)Executethefollowingaftereveryinterval_lengthinstructions;If(have_reference_point)If(significant_change_in_memrefsorsignificant_change_in_branchesorsignificant_change_in_ipcandnum_ipc_variations>THRESH1))have_reference_point=stable_state=FALSE;num_ipc_variations=0;num_clusters=4;instability=instability+2;if(instability>THRESH2)interval_length=interval_length*2;instability=0;if(interval_length>THRESH3)Pickmostpopularconfiguration;discontinue_algorithm=TRUE;elseif(significant_change_in_ipc)if(stable_state)num_ipc_variations-num_ipc_variations+2;elsenum_ipc_variations=MAXi-2,num_ipc_variations-0.125;instability=instability-0.125;elsehave_reference_point=TRUE;RecordbranchesandmemrefsIf(have_reference_pointandnotstable_state)recordIPC;num_clusters=num_clusters*2;if(num_clusters>16)pickthebestperformingconfiguration;makeitsIPCtheIPC_reference_point;stable_state=TRUE;该运行时重新配置的整个过程可以在来自硬件事件计数器的支持下用软件来实施。在决定下个配置之前检查各种硬件计数器的低开销软件例程(如用于软件TLB丢失处理的例程)在每个间隔中都被调用。该算法总计大约100条汇编指令,只有一小部分在每次调用时执行。即使对于最低的10K条指令的间隔长度,这等于远少于1%的开销。用软件实施选择算法增加了灵活性,并开启了特定于应用的算法的可能性。检测宏阶段变化的更高级别的算法具有更低的开销。由于该算法完全以软件运行,绝大多数特定于程序的状态都驻留在存储器而不是硬件寄存器中。因此除了事件计数器之外,无需在关联切换开关上存储和恢复其它状态。现在给出结果。在图4中,第三栏示出使用在每个程序阶段开始时探测的基于间隔的选择机制的效果。作为参考点,前两栏示出具有4个和16个集群的静态结构。可以看到在几乎所有情况下,该动态机制在与最佳静态结构性能的近似性方面都做得非常好。对于几乎没有不稳定性的浮点型程序(galgel、mgrid、swim),该动态机制容易使硬件与程序的要求相匹配。对于整数型程序,在多数情况下,当间隔大小不合适时存在最开始的不稳定时段。与我们早先的分析一致,该间隔大小被增加直到其稳定在允许低于5%的不稳定系数的间隔大小。在parser中,仿真间隔的长度不足以允许动态机制稳定在所要求的40M的指令间隔。在djpeg中,需要间隔大小足够大(1.28M条指令)的多个间隔,以允许小的不稳定系数。此外,由于该间隔长度很大,会错过很多重新配置的机会。在每个间隔内存在其中ILP特性不同的很短的阶段。由于这两个原因,该动态机制达不到用于djpeg的具有16个集群的固定静态结构的性能。在gzip的情况下,存在多个延长的阶段,一些具有远ILP特性,另一些具有低数量的远ILP。由于该动态机制任何时刻都选择最佳的配置,因此其性能甚至好于最佳的静态固定结构。平均来说,任何时候在基准组之间16个集群中的8.3个被禁止。在没有任何其它工作负载时,假设提供给这些未用集群的电压可以关闭,则这节省了大量泄漏能量。类似的,对于多线程工作负载,即使在优化了单线程性能之后也有超过8个集群还保留着以由其它线程使用。总的来说,具有探测的动态的基于间隔的机制比最佳的静态固定结构的性能高大约11%。该机制还非常强壮-其应用于基准组中的每一个程序,因为通常存在足够粗略的间隔长度,使得这些间隔之间的特性相当一致。但是,不利的方面是不能针对相对较短的阶段。我们用较短的初始间隔长度进行了试验,但发现该动态机制在这些短的间隔长度处遭遇了巨大的不稳定性,因此像以前一样将间隔长度增加到更大的值。这是由以下事实引起的随着间隔大小的降低测量变得噪声更大,并且更难以在间隔之间检测到相同的程序度量,因此更难以识别任一阶段的最佳配置。为了解决这些问题,我们尝试了一种替换的基于间隔的机制。不是在每个程序阶段开始时探测不同的配置,而是使用16-集群的配置用于一间隔,并基于可获得的远ILP的程度,我们选择4集群或16集群配置用于后面的间隔,直到下一个阶段改变为止(我们最初的结果表明这是两个最有意义的配置并且覆盖了大多数情况)。一条指令如果比ROB中最久的指令年轻至少120条指令,则该指令被标记为远的(distant)。在发布时,如果该指令是远的则其在其ROB项中设置一位。在提交时,该位被用于增加“远ILP的程度”。由于每个集群具有30个物理寄存器,因此4个集群就足以支持大约120条未完成指令(in-flightinstruction)。如果在一间隔中发布的远的指令数量超过某一阈值,则表示将要求16个集群来利用可获得的远ILP。在我们的实验中,对1000的间隔长度使用160的阈值。由于没有探测阶段,硬件对程序阶段变化反应迅速,并且以更精细的粒度进行重新配置也变得有意义。因此我们将焦点放在小的固定指令间隔上,不尝试在运行时增加间隔长度。但是,由于该决定是基于程序度量而不是探测,因此会牺牲一些精度。此外,间隔长度越小对阶段变化的反应就越快,但测量的噪声也越大,由此导致一些不正确的决定。图4也示出这种机制在3种不同固定间隔长度的情况下的结果。1K条指令的间隔长度在精确度和对阶段变化的快速反应之间提供了最佳折衷。总的来说,其比最佳静态基本情况表现出了同样11%的改善。然而,在如djpeg的程序中,由于可以针对具有不同要求的小阶段,其所做的比具有探测的基于间隔的机制好得多(21%)。不幸的是,在诸如galgel和gzip的程序中遭到了性能方面的打击,因为小的间隔长度和有噪声的测量导致频繁的阶段变化和做出不精确的决定。造成这种情况的一个主要原因是在连续的1000个指令间隔中执行的基本块不总是相同的这一事实。由此,发出信号表明频繁的阶段变化,且每个新的阶段变化导致具有16个集群的间隔,以帮助确定该远ILP。为了缓解这个问题,我们在基本块边界上检查精细粒度的重新配置机制。为了允许以精细粒度来重新配置,我们将每个分支看作潜在的阶段变化。我们需要确定分支后面是否跟随着高程度的远ILP,在这种情况下分派应当自由地继续,否则分派就应当只限于前面4个集群。探测各种配置不是可行的选择,因为在不同的探测阶段可能存在很多相邻的分支,从而导致对每个分支的带噪声的测量。因此在获得足够的信息之前,假设分派到16个集群,并计算每个分支之后的远ILP特性。这用于更新重新配置表,从而在稍后才面对相同的分支时可以选择正确的集群数量。如果我们遇到的分支在该表中没有列项,则假设16-集群的结构,从而可以确定其远ILP的程度。假设4个集群可以支持大约120条指令以确定分支后是否跟着远ILP,我们需要识别在分支之后提交的360条指令中有多少在发布时是远的。因此4个或16个集群将是合适的。为了实现该计算,我们跟踪该360条最后提交的指令的远ILP特性。可通过进入和离开该360条指令的队列的指令来更新单个计数器,从而可以保持远ILP的运行计数。如果一个分支恰好是该360条指令中最久的,则其远ILP程度由计数器中的值表示。很可能还有来自相邻分支的一些干扰。为了使该机制更为强壮,我们在为一分支在重新配置表中创建项之前对该同一分支的大量实例的行为进行采样。此外,我们可以通过仅对特殊的分支尝试改变来精细调整重新配置的粒度。例如,我们发现在仅对每第5个分支尝试改变时获得最佳性能。我们还展示了只在子例程调用和返回时尝试改变的机制的结果。我们使该算法形式化如下针对每第N个分支的算法在每第N个分支,查询重新配置表。如果找到项,则改变为所建议的配置。否则使用16个集群。在从360个提交的指令的队列中除去一个分支时,如果已经看见该分支的M个样本,则不更新表。否则,记录最后一个样本。如果这是第M个样本,则计算所建议的配置。否则所建议的配置是16个集群。上述方法的不利方面是最初的测量指明了将来的行为。分支后面的代码特性可能在该程序的过程中变化。不可能总是很容易地检测到这样的变化,尤其是当只使用4个集群并且远ILP的程度不明显时。为了处理这种情况,我们以周期性的间隔刷新该重新配置表。我们发现每10M条指令重新建立该表造成开销可以忽略不计。在图5中,除了基本情况和具有探测的基于间隔的机制之外,还示出针对两种精细粒度的重新配置机制的IPC。第一种机制尝试在每第5个分支重新配置,并在针对每个分支收集10个样本之后在表中创建一项。为了消除别名的影响,使用大型16K-项的表,尽管在几乎所有情况中,一小得多的表工作得也同样好。第二种机制尝试在每个子例程调用和返回时改变,并使用3个样本。该图表明对阶段变化快速反应的能力导致在诸如djpeg、cjpeg、crafty、parser和vpr的程序中提高了性能。对于crafty观察到最大数量的配置之间的变化(1.5百万)。与没有探测的基于间隔的机制不同,未由噪声测量导致不稳定性。然而,gzip无法与由基于间隔的机制达到的性能匹配。这是因为分支之后的代码的特性在该程序过程中发生改变。因此使用最初的测量来选择将来配置的策略不总是精确的。同样的行为也在galgel中观察到,只是程度较低。总的来说,与基于间隔的机制所获得的11%的改善相比,精细粒度的机制产生超过基本情况15%的改善程度。从这些结果中,得出以下结论具有探测的基于间隔的机制容易实施、强壮并提供大部分可能的加速。由于该机制选择粗略间隔长度的倾向,因此,错过了很多重新配置的机会。因为在连续的小间隔上的有噪声的测量,选择小的间隔长度不是其解决方案。为了允许精细粒度的重新配置,我们选择基本块边界作为重新配置点,并使用最初的测量来预测将来的行为。除gzip之外,此方法不会牺牲太多精确度,并且硬件可以快速适应于该程序的需要。但是为了得到额外的4%的改善,必须投资非小数目的硬件一跟踪预测的表和保持远ILP度量的逻辑电路。现在描述分布式缓存模型,首先关于集群的LSQ实施。在该分布式缓存模型中,如果在对存储器指令重新命名时知道有效地址,则可将该地址指向缓存相应数据的集群。然而,在重新命名时通常不知道该有效地址,因此要求我们预测该存储器操作将要存取的存储体。基于该预测,将该指令发送给一个集群。一旦计算出该有效地址,在误测存储体的情况下就必须采取适当的恢复操作。如果该操作是加载,则恢复是简单的-将有效地址发送给正确的集群,其中在LSQ中解决存储器冲突,从缓存存储体中取出数据,并将其返回给提出请求的集群。如果存储器操作是存储,则误导向可能导致正确性问题。在没有意识到存在被错误导向同一地址的存储的情况下,可能已经进行不同集群中的加载了。为了解决这一问题,我们采用了以下策略。在重命名时,有效地址未知的存储被分配给特定的集群(其中计算其有效地址),但同时也在其它集群中创建伪时隙(dummyslot)。该伪时隙之后的其它集群中的后续加载被阻止,因为存在具有可能会潜在地导致冲突的未解析地址的早期存储。一旦计算出有效地址,就向所有集群广播该信息,并除去除了一个之外的所有LSQ中的伪时隙。该广播增加了寄存器和缓存数据互连的通信量(我们对此建模)。有关存储体预测,早先的工作建议使用类似分支预测器的表来预测加载或存储访问的存储体。在我们的仿真中,使用两级存储体预测器,其中第一级具有1024条,第二级具有4096条。有关导引启发,在具有分布式缓存的处理器中,对于每个加载或存储,导引启发必须处理3个数据相关性-两个源操作数和缓存该数据的存储体。由于缓存数据的发送涉及两次通信(地址和数据),因此在加载或存储被导引至被预测为缓存对应数据的集群时性能被最大化(注意与在集中式缓存模型中不同,这样做不会增加加载不平衡,因为缓存不是在单一的位置上)。即使这样,频繁的存储体误预测和由于存储地址广播而增加的通信量严重影响了性能。忽略这些影响则性能改进29%。同时,来自缓存存储体对从属性的支持导致寄存器通信的增加。假设免费寄存器通信则提高性能27%。因此寄存器和缓存业务同等地造成了这种系统中的通信瓶颈。迄今为止,我们的结果假设集群处理器具有集中式缓存。因此重新配置只是允许导引启发可分派到全部集群的子集的问题。使用分布式缓存,每个集群都具有与该集群关联的缓存存储体。数据以字交叉的方式分配给这些缓存存储体。在从16个集群到4个集群的过程中,缓存存储体的数量以及因此数据到物理缓存线的映射会变化。为了解决这一问题,最不复杂的解决方案是在L1数据缓存被刷新到L2的同时安装处理器。幸运的是,不需要刷新存储体预测器。使用16个集群,存储体预测器产生4位预测。在使用4个集群时,该预测的两个较低顺序位指示正确的存储体。由于数据到物理缓存位置的索引改变,因此重新配置不像在集中式缓存模型中那样的无缝。每次重新配置都需要安装处理器和缓存刷新。因此没有应用来自之前章节的精细粒度的重新配置机制。图6示出针对基本情况和基于间隔机制的IPC。第三栏示出具有探测和10K条指令的最小间隔长度的机制。第4栏和第5栏示出没有探测的基于间隔的机制和使用远ILP度量来选择最佳配置。分布式缓存的仿真参数总结在表2中。我们发现该结果趋势类似于早先针对集中式缓存模型所看到的趋势。除了djpeg的情况之外,利用更短的间隔进行重新配置不会带来什么好处。总的来说,具有探测的基于间隔的机制产生超过基本情况10%的速度的增加。由于该动态机制尝试使重新配置最小化,因此缓存刷新保持到最小程度。由于刷新,Vpr面临最大数量的回写(400K),这导致1%的IPC速度的减慢。总的来说,这些刷新导致0.3%的IPC降低。我们的结果示出,对于两个重要缓存结构,随着集群数量的增长,通信并行性折衷大大影响不同程序的可升级性。在这一节,我们确认我们的动态重新配置算法可应用于其他有意义的基本情况。影响通信程度和远ILP程度的一些关键参数是对集群之间互连的选择、跳跃之间的通信等待时间、每个集群中的功能单元数量、和每个集群可支持的指令数量(每个集群中寄存器和发布队列项的数量)。图7示出使用具有集中式缓存模型的网格互连的效果。由于更好的连接,通信不再是瓶颈,16集群结构的性能比4集群结构的性能好8%。为简明起见,我们只展示了具有探测的基于间隔的机制的结果。该趋势与以前看到的一样,但由于通信的不利方面不像宣称的那样,因此比最佳基本情况相比总改善程度只有7%。精细粒度的重新配置技术在数量上产生与环互连类似的结果。我们还研究了该结果对于一集群内各种资源的大小的敏感度。我们研究了使用更少资源(每个集群10个发布队列项和20个寄存器)和更多资源(每个集群20个发布队列项和40个寄存器)的效果。如果每个集群存在很少的资源,则平均来说需要更多的集群,以利用可用的并行性。因此16集群的系统是有利的基本情况,且基于间隔的动态机制相对于它的改善程度只有8%。如果每个集群存在更多的资源,则对于低ILP阶段使用少量集群是非常有利的。因此,相对于16集群基础的改善是13%。每次跳跃之间的通信成本的加倍导致受通信高度约束的16集群系统。通过采用动态机制和使用更少的集群用于低ILP阶段,可获得23%的性能改善。这些结果在数量上类似于在之前的子章节中基于间隔的机制获得的改善,表明可动态调整的设计能有助于在很大的处理器参数范围内显著改善性能。因此,通信并行性折衷及其管理在将来大多数处理器中很可能是很重要的。虽然上面描述了优选实施例及其改型,本领域的技术人员通过查阅本公开将容易地理解在本发明的范围内可以实现其它实施例。例如,数字值只是说明性的而非限制性的,算法的说明也是如此。因此本发明应当被解释为只通过所附权利要求来限定。权利要求1.一种用于运行包括多个集群的处理器的方法,该方法包括(a)确定将在所述处理器上运行程序的所述集群的最佳个数;(b)从所述处理器仅向所述最佳个数的集群发送指令。2.根据权利要求1所述的方法,其中在运行所述程序期间执行步骤(a)多次。3.根据权利要求2所述的方法,其中在该程序的多个阶段的每个阶段开始时执行步骤(a)。4.根据权利要求3所述的方法,其中步骤(a)包括(i)在每个阶段中定义多个间隔;(ii)检测来自该多个间隔的至少一个间隔的程序统计数据;以及(iii)从该程序统计数据来确定最佳的集群个数。5.根据权利要求4所述的方法,其中步骤(a)(i)包括选择所述间隔的长度。6.根据权利要求5所述的方法,其中所述间隔的长度是通过以下步骤选择的以预定的初始间隔长度开始然后增加该预定间隔长度直到达到稳定的阈值或达到预定的最大间隔长度为止。7.根据权利要求3所述的方法,其中步骤(a)包括(i)在每个阶段中定义多个间隔;(ii)在所述多个间隔的第一间隔期间检测可获得的远指令级并行性程度;以及(iii)根据该可获得的远指令级并行性程度确定最佳的集群个数。8.根据权利要求7所述的方法,其中步骤(a)在每第N个分支处执行,其中N是整数。9.根据权利要求7所述的方法,其中步骤(a)在每次子例程调用和返回时执行。全文摘要在具有多个并行运行的集群的处理器中,正在使用的集群数量可以动态改变。在每个程序阶段开始时,运行对于间隔的配置选择以确定最佳配置,该最佳配置一直被使用直到检测到下个阶段变化。通过以最小间隔开始然后加倍直到达到低稳定性系数来确定最佳指令间隔。文档编号G06F15/76GK101023417SQ200580022150公开日2007年8月22日申请日期2005年6月8日优先权日2004年6月8日发明者拉吉夫·巴拉苏布拉莫尼安,桑德亚·德瓦卡达斯,大卫·阿尔博内西申请人:罗切斯特大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1