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

文档序号:9383066阅读:319来源:国知局
用于实现可扩展争用自适应统计计数器的系统和方法
【技术领域】
[0001] 本公开内容涉及共享的统计计数器,并且更具体而言涉及用于提高包括对共享统 计计数器进行访问的应用的性能的技术。
【背景技术】
[0002] 多核体系架构设计中当前的趋势暗示,在未来几年内,将有从简单的基于总线的 设计朝分布式非一致存储器访问(NUM)和高速缓存固有NUM(CC-NUM)体系架构的加速 偏移。根据NUMA,对任何给定访问的存储器访问时间依赖于被访问的存储器相对于处理器 的位置。这种体系架构通常包括具有快速本地存储器(例如,紧密耦合到处理器和/或位 于相同的单个多核芯片上的存储器)的计算核心的集合,其中这些存储器经由较慢的(芯 片间)通信介质彼此通信。在这种系统中,处理器通常可以访问其自己的比非本地存储器 快的本地存储器,诸如其自己的高速缓存存储器。在一些系统中,非本地存储器可以包括一 个或多个在处理器之间共享的存储器组和/或在另一处理器本地的存储器组。一些系统, 包括许多NUMA系统,提供非一致的通信体系架构(NUCA)属性,其中访问其它处理器核心的 高速缓存的时间随其离发出请求的核心的物理距离而变。在这些系统中,核心对其本地存 储器的访问,并且尤其是对共享的本地高速缓存的访问,可以比对远程存储器(例如,位于 另一芯片上的高速缓存)的访问快若干(或者许多)倍。
[0003] 更大型的软件系统使用统计计数器来进行性能监视和诊断。例如,统计计数器对 诸如检测各种系统事件的过高速率或者对基于事件频率而变的机制的目的具有实际重要 性。虽然单线程的统计计数器微不足道,但是通常使用的单纯(naive)并发实现很快变得 有问题,尤其是当线程计数增长时。例如,当系统增长并且当统计计数器在越来越多的非一 致存储器访问(NUM)系统中被使用时,常用的单纯计数器强加扩展性瓶颈和/或它们无用 的此类不准确性。特别地,这些计数器(当在线程之间共享时)会对计数器的每次修改招 致无效流量,这在NUMA机器上尤其昂贵。
[0004] 并行执行事务的能力是可扩展性能的关键。但是,当对计数器的访问发生在事务 内部时,共享计数器用于收集统计数据(例如,关于一块代码执行得多频繁、多少元素在散 列表中等等的统计数据)会不利地影响事务成功率(因为由不同事务或线程对共享计数器 的任何两次更新都将潜在地彼此冲突)。解决这个问题的一些之前的方法涉及把更新计数 器的操作移动到事务之外,由此改变程序的语义,或者实现对"事务提升"的复杂并且昂贵 的支持,这不是在所有语境下都适用。
[0005] 出于这些和其它原因,应用设计者面对困难的折中,涉及强加于轻争用计数器之 上的等待时间、可扩展性和(在一些情况下)重争用计数器的准确性,以及各种探针效应。

【发明内容】

[0006] 本文所述的系统和方法在各种实施例中可以用来实现可扩展的统计计数器。在一 些实施例中,这些计数器,而不是标准计数器,的使用可以提高在采用NUM风格存储器体 系架构和/或呈现NUCA属性的系统中执行的应用的性能。如在本文所使用的,术语"NUMA" 和"NUMA风格存储器体系架构"可以参考呈现NUM和/或NUCA属性的任何系统来使用。 在一些实施例中,计数器可以实现为包括计数值部分和节点标识符部分的数据结构。节点 标识符部分可以识别最近递增计数器的线程在其上执行的节点或者已经请求递增共享计 数器的优先权的线程在其上执行的节点。在由计数器数据结构的节点标识符部分识别的节 点上执行的线程可以比其它线程具有递增计数器的更高优先权。在一些实施例中,在除由 计数器数据结构的节点标识符部分识别的节点之外的节点上执行的线程可以在重新尝试 它们之前延迟其递增计数器的尝试。这可以鼓励从单个节点上线程的连续更新,从而减少 高速缓存失中并提高整体性能。在一些实施例中,急不可耐的线程会尝试更新数据结构的 节点标识符部分,或者可以更新单独的抗饥饿变量(例如,通过写它们在其上执行的节点 的标识符),以指示对递增共享计数器的优先权的请求。
[0007] 在一些实施例中,本文所描述的系统和方法可以实现概率计数器。如在本文更详 细描述的,在各种实施例中,这些概率计数器可以直接存储概率值或者可以存储其它类型 的概率计数器值(例如,它们可以存储代表更新概率和/或预计计数器值或者从其可以计 算更新概率和/或预计计数器值的一个或多个值)。在一些实施例中,计数器和/或其更新 机制的实现可以依赖于可配置准确性参数的值。在此类实施例中,可配置的准确性参数可 以被调整,以便对计数器的准确性与访问它们的应用的性能之间的折中提供精细粒度的控 制。例如,计数器可以实现为包括共同表示更新概率值的尾数部分和指数部分的数据结构。 如在本文更详细描述的,当更新计数器时,可配置的准确性参数的值可以影响尾数部分和/ 或指数部分是否、何时、多频繁和/或按多少量更新。在另一个例子中,更新概率计数器可 以包括用依赖于可配置准确性参数的值的常量乘以其值。
[0008] 在一些实施例中,本文所描述的系统和方法可以实现适应应用的多个线程对计数 器的争用量的可扩展统计计数器。例如,用于确定是否响应于递增操作的启动而递增计数 器的方法和/或用于更新计数器的方法可以依赖于当前、最近或历史争用量而从多种可用 方法中选择。在一些实施例中,计数器可以从原子事务中访问。在各种实施例中,不同的争 用管理策略和/或重试条件可以用来在多种方法中选择。例如,在一些实施例中,用于确定 是否或者如何更新共享计数器的方法可以响应于对计数器的争用的增加或减少(例如,在 利用初始或缺省方法递增或更新计数器的预定最大次数失败尝试之后)而动态(即,在执 行期间)改变。在一些实施例中,共享的计数器可以包括在低争用情况下递增的精确计数 器部分和在高争用情况下更新的概率计数器部分。在一些实施例中,概率计数器递增的量 可以依赖于争用。在其它实施例中,计数器可以包括只有当计数器处于争用情况下时才鼓 励单个节点上的线程连续递增的节点标识符部分。在还有其它实施例中,相对简单的计数 器数据结构可以响应于对计数器的争用而膨胀(inflated),如以下更详细描述的。
【附图说明】
[0009] 图1是示出如本文所述用于实现NUM感知共享计数器的方法的一种实施例的流 程图。
[0010] 图2是示出实现NUM风格存储器体系架构的计算机系统的一部分的框图。
[0011] 图3A-3F是示出本文所述各种计数器结构的例子的框图。
[0012] 图4是示出根据一种实施例用于递增NUM感知共享计数器的方法的流程图。
[0013] 图5是示出根据一种实施例用于递增依赖于对共享计数器的争用的NUM感知共 享计数器的方法的流程图。
[0014] 图6是示出根据一种实施例用于响应于争用而膨胀共享计数器的方法的流程图。
[0015] 图7是示出根据一种实施例用于递增存储浮点值的概率计数器的方法的流程图。
[0016] 图8是示出根据一种实施例用于递增依赖于对计数器的争用的混合计数器的方 法的流程图。
[0017] 图9是示出根据一种实施例用于递增存储二进制浮点值的概率计数器的方法的 流程图。
[0018] 图10是示出根据一种实施例用于递增包括多个更新选项的概率计数器的方法的 流程图。
[0019] 图11是示出根据一种实施例用于依赖于可配置准确性参数而递增概率计数器的 方法的流程图。
[0020] 图12是示出根据一种实施例用于依赖于对共享计数器的争用递增存储浮点值的 概率计数器的方法的流程图。
[0021] 图13是示出根据一种实施例用于依赖于对共享计数器的争用确定是否递增共享 计数器并用于递增共享计数器的方法的流程图。
[0022] 图14是示出配置为实现本文所述一个或多个共享计数器的计算系统的一种实施 例的框图。
[0023] 虽然本公开内容作为例子对几种实施例和说明性附图进行了描述,但是本领域技 术人员将认识到,本公开内容不限于所述实施例或附图。应当理解,附图和对其的详细描述 不是要把本公开内容限定到所公开的特定形式,相反,本公开内容是要覆盖属于如由所附 权利要求定义的精神和范围的所有修改、等价物和备选方案。本文所使用的任何标题都仅 仅是为了组织而不是要限制描述或权利要求的范围。如本文所使用的,词"可以"是在允许 的意义上(即,意味着具有…的潜能)而不是在强制的意义上(即,意味着必须)使用的。 类似地,词"包括"意味着包括,但不限于。
【具体实施方式】
[0024] 如以上所指出的。统计计数器的使用在大部分大型软件系统中是非常常见的。对 共享统计计数器的访问可以是多线程应用的并发线程,包括在支持硬件和/或软件事务存 储器的系统中执行的那些应用,之间争用的来源。多核机器的尺寸增加,并且相应地从简单 的基于总线的设计偏移到NUM和CC-NUM风格存储器体系架构。由于这种偏移,存在对可 扩展统计计数器的增加的需求。本文所描述的系统和方法可以在一些实施例中被用来实现 可扩展统计计数器。在不同的实施例中,本文所描述的可扩展统计计数器通过把计数器分 成多个部分由此减少对每个部分的争用,或者通过采用计数器更不经常更新的技术,来实 现这种扩展性。这两类技术可以显著减少使用它们的并发执行的原子事务之间的冲突,因 此提高它们成功的机会并帮助实现可扩展性能。
[0025] 在不同的实施例中,与常用的单纯计数器相比,本文所描述的技术可以被用来实 现不阻塞并且提供显著更好扩展性和准确性属性的精确和/或概率(统计)计数器。虽然 概率计数器不能提供确切的计数,但是它们可以具有统计属性,使得它们有高概率不会从 精确计数偏离"太多",例如,根据可配置的准确性参数。在一些实施例中,甚至当争用低时, 本文所描述的计数器也可以与单纯计数器竞争。一般而言,本文所述的统计计数器可以适 于其中它们被用来计数有可能以高频率发生的事件的应用,同时计数器的值可以不频繁地 被读取,就像对性能监视和诊断常见的。虽然本文所描述的许多计数器被假设只递增一并 且从不递减,但是本文所描述的技术在其它实施例中可以一般化为削弱和/或避免这些假 设。
[0026] 在一些实施例中,在计数器更新在另一个节点上发生之前,本文所描述的技术可 以鼓励争用的统计计数器在NUM系统的一个节点上的多次连续递增。避免这些连续更新 之间的跨节点通信在一些实施例中可以显著减少NUM节点之间的昂贵通信流量,由此提 高吞吐量和扩展性。在一些实施例中,这些技术可以提供比常用的单纯方法扩展更好的准 确统计计数器,同时增加一点或不添加空间开销。
[0027] -般而言,无需同步地简单递增共享计数器在多线程应用中工作得不好,因为一 个线程所作的更新可以被另一个线程所作的更新重写,由此丧失一个或多个递增对计数器 的影响。在一些情况下,这种计数器可以通过用锁保护来使得它们线程安全。但是,在大多 数现代共享存储器多处理器中,利用诸如比较并交换(CAS)类型指令的原子指令递增计数 器可能更好。如果CAS类型指令被用来递增计数器,则将只有计数器保持在递增它之前递 增线程期望看到的值并且操作成功更新计数器值时才指示成功。否则,递增操作可以重试, 有可能在某个退避(back-off)期之后。这种解决办法简单、正确并且不阻塞,但是它不扩 展到更大和越来越多的NUM系统。利用单线程递增操作(例如,利用单独的加载和存储指 令来更新计数器)消除CAS类型指令的开销并且减小等待时间(例如,当不必知道计数器 的精确值时)无法避免解决有可能在变量被NUM系统中的线程修改时发生的远程高速缓 存失中的主要成本。此外,这种方法不仅仅导致在争用情况下更新的偶然丢失,但是已经显 示当被大量(例如,32个或更多)线程共享时导致绝大多数更新的丢失。具有讽刺意味的 是,这个问题随着争用增加而变得更糟,这常常是计数器要被检测的场景。
[0028] 使计数器可扩展的一种方法是把它们分成每个线程的部分,每个线程递增其自己 的部分,无需同步。但是,这种方法会有几个缺点。例如,如果计数器被动态线程集合使用, 则线程可能需要注册和注销,并且可能需要有为了读取计数器而对线程的部分进行迭代的 途径。此外,这种方法会按使用该计数器的线程数为因子增加空间需求。在各种实施例中, 本文所述的技术可以以变化的程度缓解这些缺点。
[0029] 在其中附加空间开销不期望或者不可接受并且计数器必须精确的情况下,随机化 的退避(RBO)技术可以被用来在重争用情况下至少避免完全的灾难。在一些实施例中, NUMA锁算法或队列(cohort)锁(可以在争用情况下通过在另一个节点上需要之前在给定 的NUMA节点内交出锁多次来显著提高性能和扩展性)可以改善对采用RBO的计数器的争 用管理。例如,当线程尝试利用CAS类型指令递增计数器失败时(例如,当争用发生时),它 只能在获取队列锁之后重试其递增计数器的尝试,由此鼓励在另一个节点更新之前在一个 NUMA节点上的多次更新。这种技术已经显示对相对于RBO提高性能是有效的。但是,由于 队列锁的空间开销,这种技术可以对本文所述的其它方法提供很小或者没有优点。
[0030] 在一些实施例中,类似于以上提到的NUMA锁但是不添加显著空间开销的方法可 以使用计数器值的少数几位来识别NUM风格存储器体系架构中的节点中哪个节点当前具 有优先权。在此类实施例中,当计数器递增时,这些位的值可以(作为正常操作的一部分) 不时地变化,从而给予另一个节点更新计数器的优先权。换句话说,在几次递增操作之后 (依赖于指示优先节点的位的位置),由于这些递增操作而导致的这些位的值的变化会造 成另一个节点变成优先节点。在此类实施例中,其它节点上的线程可以延迟其更新,从而使 得优先节点上的线程更有可能会执行连续的更新。应当指出,一般而言,用来识别优先节点 的位不可以包括最低位(即,最频繁改变的那些位),但是可以被选择,使得优先权常常足 够多地变化以避免不合理的延迟。这种方法是简单的、不添加空间开销并且已经显示在递 增操作跨所有节点相对均衡地散布时执行良好。但是,对不太均匀的工作量不太适合。
[0031] 用于实现NUM感知共享计数器(例如,NUM感知RBO类型计数器或者另一种类 型的NUM感知计数器)的方法的一种实施例由图1中的流程图示出。如在110示出的,在 这个例子中,该方法可以包括在实现NUM风格存储器体系架构的系统的给定节点上执行 的线程启动共享计数器的递增。该方法还可以包括线程确定在系统中另一个节点上执行 的线程当前是否具有更新计数器的优先权或者已经请求更新计数器的优先权(就像在120 中)。例如,在一些实施例中,计数器的少数几位可以被用来识别最近更新计数器的线程在 其上执行的节点(因此,指示那个节点作为优先节点),或者计数器的少数几位可以基于其 它标准识别当前被指定为优先节点的节点。在一些实施例中,另一种方法可以被用来指示 线程是否当前具有更新计数器的优先权(或者已经请求这种优先权),并且这种方法可以 包括抗饥饿变量的使用(如在本文更详细描述的)。
[0032] 如在这个例子中示出
当前第1页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1