用于实现可扩展争用自适应统计计数器的系统和方法_2

文档序号:9383066阅读:来源:国知局
的,该方法可以包括至少部分地依赖于所述确定(即,依赖 于在系统中另一个节点上执行的线程当前是否具有更新计数器的优先权或者已经请求更 新计数器的优先权)尝试递增共享计数器或者延迟其递增计数器的尝试的线程,就像在 130。例如,在一些实施例中,如果线程确定(例如,基于计数器中几个指定位的值,或者另 一个优先节点指示符)在另一个节点上执行的线程具有(或者已经请求)更新计数器的优 先权,则线程可以延迟其递增计数器的请求,并且随后可以重试其递增计数器的请求一次 或多次,例如,直到尝试成功或者直到已达到预定的重试限制(例如,根据各种争用管理策 略)。如果线程确定(例如,基于计数器中几个指定位的值,或者另一个优先节点指示符) 没有设置(或请求)优先权,或者线程在其上执行的节点当前具有(或者已经请求)更新 计数器的优先权,则线程可以以递增计数器的一次或多次尝试继续进行(例如,直到其中 一次尝试成功或者直到已达到预定的重试限制)。应当指出,在一些实施例中,已经被指定 为识别优先节点的计数器位(或者专用优先节点指示符)的预定默认或初始值可以指示还 没有请求或设置优先权。
[0033] 在本文所述的许多例子中,可以假设计算机系统被组织成处理器核心的群集,每 个群集具有在那个群集本地的核心之间共享的一个或多个高速缓存。在此类实施例中,群 集间的通信可以比群集内的通信显著更昂贵。在本文所述的至少一些例子中,术语"群集" 和"节点"可以被用来指处理器核心的集合,并且,依赖于在系统中实现的NUM机器的尺 寸,核心的这个集合可以包括单个多核芯片上的核心,或者接近同一存储器或高速缓存结 构的多核芯片的集合。在这些例子中,还可以假设每个群集具有该群集上所有线程已知的 唯一群集id。
[0034] 图2示出了实现NUM风格存储器体系架构的计算机系统的一部分。在这个例子 中,计算机系统包括多个经互连250彼此通信的CPU板200 (示为200a - 200η)。这些CPU 板之一(200a)说明得比其它更详细。在一些实施例中,CPU板200当中每一个可以包括与 为CPU板200a所说明的相同或相似的体系架构。在其它实施例中,每个CPU板可以包括 不同数量和/或布置的处理器芯片、处理器核心、高速缓存,等等。例如,在一些实施例中, 可以有紧密耦合到每个处理器芯片的、为其处理器核心(未示出)充当"本地存储器"的一 个或多个存储器芯片。如图2中所说明的,计算机系统还可以包括一个或多个系统存储器 260和/或其它部件270。在这个例子中,CPU板200a包括经由互连240彼此通信的四个 处理器芯片(示为210a-210d),其中之一更详细地说明。在这个例子中,假设处理器芯片 210a-210d包括类似于处理器芯片210a的存储器体系架构。
[0035] 在图2所说明的例子中,处理器芯片210a包括八个处理器核心(示为 220a-220h),并且每个处理器核心具有各自的(专用的)级别I(Ll)高速缓存(示为 230a-230h)。在一些实施例中,每个处理器核心可以是多线程核心。例如,在一种实施例中, 每个处理器核心可以能够并发地执行八个硬件线程。在给定处理器核心220上执行的线程 可以共享用于那个处理器核心220的级别1高速缓存230,并且对这个级别1高速缓存的 访问可以极其快,该高速缓存可以被认为是处理器核心220及其硬件线程本地的。此外,八 个处理器核心220可以共享用于处理器芯片210a的级别2 (L2)高速缓存250,并且对这个 级别2高速缓存的访问也可以快,但是不像每个处理器核心自己的级别1高速缓存那么快。 在这个例子中,当与对那个硬件线程本地的级别1和级别2高速缓存和/或其它存储器的 访问比较时,对同一 CPU板200上不同处理器芯片210的高速缓存、对不同CPU板200上处 理器芯片210的高速缓存以及对各种系统存储器260的访问(关于执行处理器芯片210a 的特定处理器核心220的硬件线程,所有这些都可以被看作远程访问)可以呈现越来越高 的等待时间。
[0036] 如前面所指出的,在一些实施例中,通过如下方式可以在NUM体系架构上获得性 能增益,即采用鼓励具有高相互存储器本地性的线程(例如,在相同处理器芯片上的处理 器核心上执行的线程,或者在彼此附近的处理器核心上执行的线程)的共享计数器以连续 递增计数器,由此在多个线程启动递增那些计数器的尝试时减小高速缓存失中的整体水 平。本文所述用于实现NUM感知共享计数器(例如,可以驻留在一个或多个系统存储器260 中的计数器数据结构,并且其一部分在被系统中对应处理器核心上执行的线程更新和/或 读取时可以被带入各种高速缓存)的系统和方法可以导致这种高存储器本地性,因为这些 技术鼓励来自单个群集中的线程的递增这种计数器的请求的批(例如,共享级别1或级别 2高速缓存的线程)被顺序执行。
[0037] 如上所述,NUMA感知RBO计数器的一种实施例可以进一步通过以下的示例伪代码 说明。
[0038]
[0"u」
LUUHI」 yw ?7ΙΠ/η 弓"Τ/71 ^ΗΛΙ 口,」? 1工
T/Jmi7U "Τ ? kl 支义名汁 hJ tA 少百 Λ?μν 1/|见 V 现-0 I 卜 为替代,可以从计数器偷几位,由此限制其范围),这几位用来存储其线程当前具有更新计 数器的优先权的节点的指示。这种方法可能只需要足够的附加位来存储NUM节点的标识 符(例如,节点ID)再多加一位。在所说明的例子中,该技术可以适应利用N位保持在从0 到_丨范围内的值的计数器。例如,在一种实施例中,计数器可以包括32位, 其中三位可以被偷,以存储NUMA节点ID,从而把计数器的范围限制到229-1。在这个例子中, 这三位可以被用来存储计数器最后在其上连同计数器一起递增的节点的ID,由此为了鼓励 识别出的节点上的连续递增而允许和/或请求其它节点上的线程推迟它们递增计数器的 请求。在其它实施例中,计数器数据结构的不同数量的位可以被用来存储其线程当前具有 更新计数器的优先权的节点的标识符。
[0042] 图3A-3F是示出本文所述的一些不同计数器数据结构的各种实施例的框图。例 如,图3A示出了计数器结构300,其中计数器305已经增加了存储节点ID的附加位310。图 3B示出了计数器结构315,其中所存储计数值320的最高位子集(示为325)从计数值字段 被"偷"并用来指示节点ID。在一些实施例中,这个位子集可以保留,以存储节点ID,并且 各个节点ID值可以明确地写到计数器结构315的这个部分中(例如,当计数值320被更新 时)。在其它实施例中,这些位的值可以仅仅反映存储在计数器结构315中的计数值320的 对应位值。图3C说明了计数器结构330,其中计数值335中不包括最高位的位子集(示为 340)代表节点ID。在这个例子中,这些位的值可以仅仅反映存储在计数器结构330中的计 数值335的对应位值。一般而言,在不同的实施例中,所存储的计数值的任何位子集可以指 定为指示节点ID,并且位子集的选择可以影响由单个节点上执行的线程的连续递增操作的 次数。
[0043] 如以下更具体描述的,图3D-3E示出了在一些实施例中可以响应于某些条件而变 得膨胀的计数器结构。例如,图3D示出了计数器结构345,其中保留的位355指示计数器部 分350是否存储计数值或者到另一结构的指针。在这个例子中,由于所保留位355的值为 零,因此计数器部分350存储计数值。类似地,图3E示出了计数器结构360,其中计数器值 350的保留位370指示计数器部分365是否存储计数值或者到另一结构的指针。在这个例 子中,由于保留位370的值为一,因此计数器部分365存储指针值并且这个指针值指向附加 计数器结构375。在这个例子中,计数器结构375存储多个计数值,示为380a-380n。图3F 示出了在一些实施例中可以用来实现概率计数器的数据结构。在这个例子中,图3F示出了 包括尾部部分390和指数部分395的计数器结构385。
[0044] 应当指出,在上述NUMA感知计数器的一些实施例中,包括由以上示例伪代码表示 的计数器,等待太长时间以至于不能尝试更新计数器的线程会变得不耐烦,在这个时候,它 可以把它的节点ID存储到抗饥饿变量中。在此类实施例中,每个共享的计数器可以与这种 抗饥饿变量关联,但是没必要每个计数器具有独立的抗饥饿变量。例如,在一些实施例中, 单个抗饥饿变量可以被采用,以请求其它节点上的线程在尝试更新与抗饥饿变量关联的一 个或多个共享计数器之前等待,由此使得具有不耐烦线程的节点上的线程能够把包含计数 器的高速缓存线带到那个节点并递增计数器。但是,应当指出,这种方法不能防止其它线程 (例如,同一节点上的其它线程)在不耐烦的线程之前递增计数器(由此保留计数器的非阻 塞属性)。上述启发式方法已经显示在实践当中避免饥饿,甚至在重争用情况下。应当指 出,在一些实施例中,包括在以上伪代码中说明的例子中,单个全局抗饥饿变量可以被用来 请求其它节点上的线程在尝试更新多线程应用可访问的任何或全部共享计数器之前等待。
[0045] 在采用这种NUMA感知方法递增共享计数器的一些实施例中,在与已经变得不耐 烦的线程在相同节点上的线程可以响应于不耐烦的线程设置抗饥饿变量而退出其延迟 (例如,慢退避)并且可以尝试立即递增计数器。在此类实施例中,不管节点上的哪个线程 递增计数器,这都可以具有把相关高速缓存线带到那个节点上的效果,这可以给予那个节 点上的所有线程递增计数器的更好机会。在此类实施例中,不是尝试确保变得不耐烦的线 程接下来递增计数器,而是其增量将帮助不耐烦线程的附近线程可以被允许在不耐烦的线 程之前递增计数器。这种方法已经被发现导致比更具限制性的方法更好的性能。
[0046] 用于递增NUM感知共享计数器的方法的一种实施例是由图4的流程图示出的。如 在410说明的,在这个例子中,该方法可以包括在实现NUM风格存储器体系架构的系统的 给定节点上执行的线程启动共享计数器的递增。该方法可以包括确定(例如,作为递增计 数器的尝试的一部分)全局变量是否指示另一节点上的线程已经代表在该另一节点上执 行的线程请求更新计数器的优先权,如在415中。例如,在各种实施例中,如果设置抗饥饿 变量、保持特定的预定值或者保持另一节点的标识符,则抗饥饿变量可以指示另一节点上 的线程已经请求更新计数器的优先权。如果全局变量指示另一节点上的线程已经为该另一 节点上的线程请求优先权(示为从415肯定离开),则该方法可以包括线程延迟其递增计数 器的尝试,就像在420中。例如,在不同的实施例中,线程可以延迟其尝试预定的或随机的 量,在这之后,线程可以尝试递增共享计数器并且(例如,原子地,连同递增存储在计数器 结构中的计数值),以更新计数器结构的节点ID部分,以反映线程在其上执行的节点(就像 在425中)。应当指出,在一些实施例中,控制尝试延迟的时间量的一个或多个参数在节点 ID字段指示最后的更新由同一节点上的线程执行时可以与在节点ID字段指示最后的更新 由不同节点上的线程执行时具有不同的值。
[0047] 在这个例子中,如果全局变量指示另一节点上没有线程已经请求更新计数器的优 先权(示为从415的否定离开),则该方法可以包括线程尝试递增共享计数器并且(例如, 原子地,连同递增存储在计数器结构中的计数值),以更新计数器结构的节点ID部分,以反 映线程在其上执行的节点(就像在425中)。在一些实施例中,递增计数值的尝试以及计 数器结构的节点ID部分的更新可以利用单个CAS类型操作或者类似的同步操作执行。如 在这个例子中所说明的,如果递增计数器和节点ID的尝试成功(示为从430肯定离开), 则递增操作可以完成,就像在435中。另一方面,如果递增计数器和节点ID的尝试不成功 (示为从430否定离开),并且如果计数器结构的节点ID部分不指示另一节点上的线程是 更新计数器的最近线程(示为从440否定离开),则该方法可以包括线程延迟其递增计数器 的尝试,就像在460中。例如,在不同的实施例中,线程可以延迟其尝试预定或随机的量,其 后,线程可以重试其递增共享计数器并更新计数器结构的节点ID部分的尝试,以反映线程 在其上执行的节点(示为从460到425的反馈)。
[0048] 如在这个例子中所说明的,如果递增计数器和节点ID的尝试不成功(示为从430 否定离开),并且如果计数器结构的节点ID部分指示另一节点上的线程是更新计数器的最 近线程(示为从440肯定离开),则该方法可以包括确定全局变量是否指示另一节点上的 线程已经请求节点优先权(就像在445中)。如果是这样(示为从445肯定离开),则该方 法可以包括线程延迟其递增计数器的尝试,就像在460中。例如,在不同的实施例中,线程 可以延迟其尝试预定或随机的量,其后,线程可以重试其递增共享计数器并更新计数器结 构的节点ID部分的尝试,以反映线程在其上执行的节点(示为从460到425的反馈)。如 果全局变量不指示另一节点上的线程已经请求节点优先权(示为从445否定离开),但是 线程的耐心已经耗尽(示为从450否定离开),则该方法可以包括线程延迟其递增计数器 的尝试,就像在460中。例如,在不同的实施例中,线程可以延迟其尝试预定或随机的量,其 后,线程可以重试其递增共享计数器并更新计数器结构的节点ID部分的尝试,以反映线程 在其上执行的节点(示为从460到425的反馈)。否则(示为从445否定离开和从450否 定离开),该方法可以包括线程更新为其节点请求优先权的全局变量(就像在455中),然 后延迟其递增计数器的尝试,就像在460中。
[0049] 虽然上述递增共享计数器的NUMA感知方法可以在一些实施例中在重争用情况下 产生比标准RBO方法更高数量级的吞吐量,但是它在低争用场景下会强加显著的开销。例 如,迄今为止所描述的方法包括在递增计数器的每次尝试之前测试抗饥饿标志。在其它实 施例中,自适应NUM感知方法可以被采用,其中递增操作依赖于计数器所经历的当前、最 近或历史争用量。例如,在一些实施例中,自适应NUM感知方法可以最初通过递增不记录 最近递增计数器的线程的节点ID的定期计数器(regular counter)来响应递增计数器的 请求。例如,计数器数据结构可以被初始化(例如,在多线程应用的初始化阶段期间)为指 示任何线程都可以尝试递增计数器而不必还写到计数器的节点ID部分的初始或缺省值。 在此类实施例中,虽然没有记录节点ID,但是可能不需要检查抗饥饿变量。
[0050] 在这种自适应NUM感知方法中,在成功递增计数器之前,比预定次数更多地重试 其递增计数器的尝试的线程(例如,快速相继地多于三次,之后是具有随机退避期的16次) 可以(一旦其最后成功)在计数器中记录其节点ID。其后,上述较慢但更可扩展的NUMA感 知计数可以响应于递增计数器的后续请求而应用。在一些实施例中,计数器可以偶尔复位 (或返回)普通计数器(例如,周期性地或者根据各种策略,包括对共享计数器的争用的减 少),使得偶然争用的效果不永远存在。例如,计数器的节点ID部分可以偶然复位到指示任 何节点上都没有线程具有(或已经请求)递增计数器的优先权的初始或缺省值,并且当这 个初
当前第2页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1