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

文档序号:9383066阅读:来源:国知局
增尾数 将使其等于其依赖于准确性的阈值(示为从1040肯定离开),但是共享概率计数器的指数 部分还没有处于其最大值(示为从1050否定离开),则该方法可以包括线程通过尝试递增 尾数、把递增后的尾数减半并且递增指数来尝试递增计数器(就像在1060中),之后,递增 操作可以完成(就像在1080中)。在一些实施例中,更新共享计数器的尝试可以利用单个 CAS类型的操作或者类似的同步操作来执行,所述操作可以重复(如果必要的话),直到其 成功(或者直到尝试由于各种适用的重试或争用管理策略而退出-未示出)。就像在其它 例子中,如果更新共享计数器的尝试失败,则该方法可以包括从元素1020 (未示出)开始重 复图10中所示的至少一些操作。
[0099] 如在以上的示例伪代码中所说明的,BFPCounter类在一些实施例中可以接受(作 为模板自变量)对RSTDV的期望界限,作为百分比(例如,准确性参数值1可以对应于对 RSTDV的期望界限1 % )。在一些实施例中,尾数-阈值参数的值可以基于期望的准确性来确 定,如以下解释的。在这个例子中,递增操作(示为Inc)可以以概率1 - 1/2ε决定,而不更 新计数器,其中e是当前存储在计数器中的指数值(就像在以上伪代码的行36-46)。在这 个例子中,如果对更新计数器作出决定,则递增操作可以首先检查,以查看计数器是否已经 达到其最大值(就像在行52中),在这种情况下,可以尝试把计数器更新为零。应当指出, 在其它实施例中,例如,如果这在给定语境下或者对于给定的应用是优选的,则递增操作可 以代替地在这种情况下发信号通知错误。否则,新对可以基于当前对来确定(如在以上行 56-61中所示)。最后,递增操作可以尝试把新对存储到计数器,例如,利用CAS类型指令来 确认计数器还没有改变(就像在行63中)。在这个例子中,如果CAS操作失败,则操作可以 重试,以确定是否更新计数器开始。在其它实施例中,其它争用管理策略可以适用。
[0100] 在一些实施例中,本文所述递增操作的各种优化可以提高整体性能。例如,在一些 实施例中,实现递增操作的代码可以"内联(inline)"公共更新情况(即,其中更新计数器 的CAS类型操作成功的情况),并且在重试递增操作之前使用失败的CAS类型操作的返回 值避免再读计数器数据(例如,在以上的示例代码中,bfpData)的需求。在一些实施例中, 当CAS类型的操作由于与并发更新(例如,由相同多线程应用的另一线程尝试的更新)的 冲突而失败时,基于新值确定更新是否应当应用的测试可以在退避之前执行,因为情况几 乎从不会如此。在一些实施例中,上述对这种计数器的所有计算都可以利用位移位和屏蔽 操作执行(即,无浮点运算)。
[0101] 应当指出,类似于以上所述的现有顺序近似计数算法不支持并发更新,并且不如 上述方法灵活。在这种现有算法中,不是在计数器更新的任何时候明确地更新尾数和指数, 而是仅仅通过递增所存储的值来执行更新。在这种现有算法中,当计数器的尾数部分递增 超过其最大值时,溢出可以自然递增指数字段(指数字段可以被适当地放置,以确保溢出 可以自然递增指数字段)。由于这种选择,使用现有算法的更新函数可以比以上所述的稍简 单。但是,这可以具有很小的性能影响,因为计数器随时间推移越来越不频繁地被更新。现 有算法的另一含义是更新递增指数(并且由此减小对后续操作的更新概率)的频率需要是 二的幂。此外,现有算法必须实现从计数器中所存储的数据计算预计值的不同途径,因为所 存储数据的尾数部分在指数递增时变成零。
[0102] 在一些实施例中,本文所述的BFP-DUP计数器在第一次递增指数之前对尾数执行 的递增可以是在指数的后续递增之间对尾数执行的递增的两倍,而现有算法在指数的每次 递增之前对尾数执行相同次数的递增。因此,用来建模BFP-DUP计数器的Markov链在以别 的方式类似于由现有算法使用的链之前包括长度为尾数-阈值/2的确定性链。但是,应当 指出,这不会改变限制内的结果,因为尾数的这些确定性递增以概率1发生,并且因此不增 加计数器的不准确性。
[0103] 与和上述概率-适应计数器关联的操作形成对比,在这种BFP-DUP计数器中,对 RSTDV的界定不能独立于所执行的递增操作的次数。更确切地说,当递增次数η接近无穷大 时,这些技术可以在限值内提供对预期RSTDV的界定。更精确地说,这可以如下描述:
[0104]
[0105] 在这个例子中,An代表在η个递增操作之后预期的RSTDV,并且M代表指数的递增 之间尾数递增的次数(在这个例子中,等于尾数-阈值/2)。在一些实施例中,这个公式可 以用来确定M的选择,以便实现期望的界限。例如,因为以上伪代码中的BFPCounter类接 受其准确性自变量作为百分比(如上所述),所以以上等式可以暗示以下:
[0106] M ^ ((30, 000/Accuracy2) +3) /8
[0107] 在这个例子中,用于尾数-阈值的对应公式在以上伪代码的行18找到(并且尾 数-阈值=2M)。应当指出,在一些实施例中,因为BFP-DUP计数器不把递增次数限制到 指数递增之间的尾数,所以这种方法的使用可以提供基于这种计算选择尾数-阈值的灵活 性,从而导致对准确性性能折中的更精细粒度的控制。在一些实施例中(包括在本文所述 各种实验中建模的那些实施例),准确性参数值被设置为反映对RSTDV的1 %界定,从而导 致尾数-阈值被设置为7500。
[0108] 用于依赖于可配置准确性参数递增概率计数器的方法的一种实施例由图11中的 流程图示出。如在1110所说明的,在这个例子中,该方法可以包括多线程应用的线程启动 存储概率计数器的多值表示的共享计数器的递增,其中预计计数可以从所存储的概率计数 器值计算。如果线程确定它应当更新所存储的概率计数器值(示为从1120肯定离开),则 该方法可以包括线程尝试更新所存储的概率计数器值,其中更新所存储的概率计数器值的 尝试依赖于可配置准确性参数的值(就像在1130中)。应当指出,在一些实施例中,更新所 存储的概率计数器值的尝试(和/或这么做的确定)还可以基于所存储的概率计数器值本 身(即,当前所存储的值)。
[0109] 如在这个例子中所说明的,如果更新所存储的概率计数器值的尝试成功(示为从 1140肯定离开),则递增操作可以完成(就像在1150中)。另一方面,如果更新所存储的概 率计数器值的尝试不成功(示为从1140否定离开),则该方法可以包括重复更新所存储概 率计数器值的尝试,直到其成功,或者直到尝试由于各种适用的重试或争用管理策略而退 出。应当指出,在这个例子中,重复更新所存储的概率计数器值的尝试可以包括重复确定是 否执行更新。这在图11中说明为从1140到1120的反馈。如在这个例子中所说明的,在一 些实施例中,线程读取共享计数器的后续操作可以通过读取所存储的概率计数器并且依赖 于所存储的概率计数器值计算预计计数值来做这件事,就像在1160中。
[0110] 在各种实施例中,由BFP-DUP计数器使用的确定性更新策略可以对在各种语境下 和在各种多线程应用中使用有吸引力。但是,虽然对于扩展性和性能而言随着计数器增长 减小更新概率是重要的,但是有时对于给定系统和工作负荷,对计数器变量的争用可以减 小到几乎为零,并且偶尔更新计数器的开销将变得不明显。过了这个点,减小更新概率可 以进一步用来仅仅增加计数器的不准确性。因此,一些实施例采用自适应和/或争用敏感 更新策略,诸如争用敏感更新策略。例如,在一些实施例中,递增操作可以选择只有当存在 (或者曾经存在)对计数器的争用时更新指数(由此减小更新概率)。换句话说,自适应 BFP计数器可以采用依赖于计数器的当前、最近或历史争用数量的递增操作。例如,在一些 实施例中,递增操作可以首先尝试利用CAS类型指令递增尾数(例如,无条件地,或者除非 其将溢出)一次(或者另一预定次数),并且只有其失败时,才可以决定是否利用与在上述 BFP-DUP计数器中所使用的相似的策略更新指数并把尾数减半。采用这种争用敏感更新策 略的BFP计数器可以在本文被称为BFP-DUP计数器。在各种实验中,显示BFP-DUP计数器 可以产生类似于上述BFP-DUP计数器的性能的性能,同时在实践中实现更高的准确性。
[0111] 用于递增存储代表依赖于对共享计数器的争用的计数器值的二进制浮点值的概 率计数器的方法的一种实施例由图12中的流程图示出。如在1210所说明的,在这个例子 中,该方法可以包括在给定节点上执行的线程启动存储概率计数器值作为二进制浮点数的 共享概率计数器的递增,其中可从概率计数器的指数部分计算的更新概率受限于二的非正 幂。例如,在一些实施例中,计数器结构可以包括尾数部分和指数部分,这两部分一起代表 m*26的预计(预期)值。如果递增计数器的尾数部分将使其值等于其依赖于准确性的阈值 (示为从1220肯定离开),则该方法可以包括继续递增共享概率计数器的尝试,就像在图10 中所说明的方法中,以元素1040开始。
[0112] 如在这个例子中所说明的,如果递增计数器的尾数部分将不使其值等于其依赖于 准确性的阈值(示为从1220否定离开),则该方法可以包括线程通过执行递增尾数的一次 或多次尝试来尝试递增共享概率计数器(就像在1230中)。在各种实施例中,线程可以重 试其尝试的次数可以依赖于一个或多个适用的重试或争用管理策略,并且可以执行多个重 试尝试,有或没有居间的退避期。如果线程成功递增共享概率计数器(示为从1240肯定离 开),则递增操作可以完成(就像在1250中)。如果线程没有成功递增共享概率计数器(示 为从1240否定离开),则该方法可以包括继续递增共享概率计数器的尝试,就像在图10中 所说明的方法中,以元素1040开始。
[0113] 在不同的实施例中,各种争用敏感方法可以用于确定是否、何时和/或如何基于 当前、最近或历史争用来更新统计计数。用于确定是否(和/或何时)递增共享计数器以 及用于依赖于对共享计数器的争用递增共享计数器的方法的一种实施例由图13中的流程 图说明。如在1310所说明的,在这个例子中,该方法可以包括多线程应用的多个并发执行 的线程之一启动共享计数器的递增。在一些实施例中,线程可以是共同实现多个并发执行 的原子事务的多个线程之一。该方法可以包括线程确定是否或者何时更新共享计数器,其 中用于确定是否或何时更新共享计数器的方法依赖于并发执行的线程之间对共享计数器 的争用量(就像在1320中)。例如,该方法可以至少部分地依赖于对共享计数器的当前、最 近或历史争用。
[0114] 如果线程确定它不应当更新共享计数器(示为从1330否定离开),则递增操作可 以完成(即,不更新共享计数器),就像在1360中。另一方面,如果线程确定它应当更新共 享计数器(示为从1330肯定离开),则该方法可以包括线程尝试更新共享计数器,其中用 于尝试更新共享计数器的方法依赖于并发执行的线程之间对共享计数器的争用量(就像 在1340中)。再次,该方法可以至少部分地依赖于共享计数器的当前、最近或历史争用。如 在这个例子中所说明的,如果更新共享计数器的尝试成功(示为从1350肯定离开),则递 增操作可以完成(就像在1360中)。另一方面,如果更新共享计数器的尝试不成功(示为 从1350否定离开),则该方法可以包括线程重试去更新共享计数器的尝试一次或多次,直 到其成功(或者直到尝试由于各种适用的重试或争用管理策略而退出-未示出)。应当指 出,在这个例子中,重复更新共享计数器的尝试可以包括重复确定是否或何时更新计数器。 这在图13中由从1350到1320的反馈说明。应当指出,在一些实施例中,重试尝试的执行 (和/或尝试可以重试的次数)还可以依赖于对计数器的争用量(包括可以造成这种最近 失败的争用)。还应当指出,虽然在图13中说明的例子中在1320中说明的操作和在1340 中说明的操作都被描述为依赖于对计数器的争用量,但是在其它实施例中,这些操作中只 有一个可以依赖于对计数器的当前、最近或历史争用量。
[0115] 本文所描述的例子大大集中在用于实现用在其中可以存在许多计数器的语境下 的统计计数器的技术,其中一些可以频繁地递增。因此,例子包括呈现低空间开销、在缺少 争用的情况下有低开销以及在重争用情况下有良好扩展性的技术。虽然这些技术已经对读 执行(例如,对于目标在于计数器的读取操作)必要地进行了优化,但是在一些实施例中, 与这些读操作关联的成本可以对本文所述的大部分技术合理地低。
[0116] 应当指出,一般而言,可以存在检索计数器值的成本的两个主要部分。一个部分 是与读必要数据的成本关联的成本,并且另一个部分是与从被读的数据计算返回值关联的 成本。在本文所述的许多场景中,这些成本当中第一个有可能主导检索与给定计数器关联 的计数值的成本,因为作为计数器基础的数据不可能在用于执行读操作的线程的高速缓存 中。因此,数据可以需要从存储器、或者从可以在系统中不同NUM节点上的另一个高速缓 存提取。
[0117] 应当指出,读取现有单纯计数器的值可以简单地涉及读取计数器本身当中所存储 的数据并且返回被读取的值。由此,它们的读成本(最多)是单个高速缓存失中的成本。在 一些实施例中,本文所描述的NUMA感知RBO类型计数器或者自适应NUMA感知RBO类型计数 器,或者采用在本文被称为BFP-DUP和BFP-CSUP的方法,还会招致单个高速缓存失中的成 本,但是这些计数器还会招致各种屏蔽和/或移位操作以确定计数器的预计值的成本。读 取本文所述的多行计数器可以需要作为计数器基础的每个高速缓存行被读取。但是,这些 可以是独立的读,因此高速缓存失中可以在很大程度上并行地在大部分现代体系架构上解 决。采用本文所述的多行-适应方法的计数器上的读操作可以类似于那些现有的简单计数 器,除非计数器经历要膨胀的充分更新争用,在这种情况下,读操作必须不仅读为计数器分 配的多个高速缓存行,而且读确定它们在哪里的指针。所分配的高速缓存行的读操作依赖 于指针的值,并且因此读操作的等待时间可以有可能包括至少顺序的两个高速缓存失中的 成本,即使所有分配的行都被并行读取。以Morris和"概率-适应"计数器为目标的读操 作可以都包括如果频繁执行则有可能添加显著开销的多个浮点运算。因此,基于BFP的计 数器在这些场景下可以是优选的。作为替代,给定(最终)计数器的所存储值只能不频繁 地改变(例如,在更新概率已经充分减小之后),记录从所存储值计算的预计值的优化可以 是合算的。
[0118] 在一些实施例中,本文所描述的可扩展统计计数器可以在包括事务存储器支持的 系统中使用的时候尤其有价值,不管事务存储器支持是在硬件中、在软件中还是利用硬件 和软件的组合实现的。例如,统计计数器可以在此类系统中用于各种目的,诸如在散列表中 记录条目的数量,或者维护关于某块代码多经常执行的统计数据。常见的经历是计数器在 原子事务中的使用使得所有事务对都冲突,因为它们全都更新计数器。如在本文所描述的, 在一些实施例中,可以通过减少对其的争用来使得计数器更可扩展,或者通过分割它们,使 得多个更新可以并行发生(就像在以上所述的多线方法
当前第5页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1