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

文档序号:9383066阅读:来源:国知局
确定是否更新所存储的值。这 个存储的值在本文可以被称为"阈值"。在这个例子中,初始阈值T。= Maxlnt,并且当所存 储的值被更新!\时,如果并且仅当伪随机数发生器返回的数字至多为T i,当前值T1被值T1+1 = I^aAa+!))代替。根据一种实施例,可以用来实现这种技术的示例伪随机代码在下面 给出。
[0074]
[0075]

[0076]
[0077] 用于递增存储浮点值的概率计数器的方法的一种实施例由图7中的流程图示出。 如在710说明的,在这个例子中,该方法可以包括在给定节点上执行的线程启动存储浮点 更新概率值(诸如本文所描述的那些)的共享概率计数器的递增。该方法还可以包括线 程依赖于所存储的概率值和整数随机数的值来确定共享计数器是否应当递增,就像在720 中。例如,在一些实施例中,确定可以依赖于其值在0和预定最大值(例如,maxint)之间 的整数随机变量的值。应当指出,在一些实施例中,确定可以涉及浮点运算的使用,以比较 更新概率的浮点表示与这个整数随机数。如果线程确定它不应当递增共享计数器(示为从 730否定离开),则递增操作可以完成(即,不递增共享计数器),就像在755中。
[0078] 如在这个例子中说明的,如果线程确定它应当递增共享计数器(示为从730肯定 离开),则该方法可以包括线程通过尝试在共享计数器中存储等于所存储更新概率乘以依 赖于期望的准确性百分比的概率因子的新值来尝试递增计数器,就像在740中。例如,在一 些实施例中,线程可以尝试利用单个CAS类型操作(或者类似的同步操作)在共享计数器 中存储新值,有或没有居间的退避期。如果递增共享计数器的尝试不成功(示为从750否定 离开),则该方法可以包括线程重复其递增共享计数器的尝试一次或多次,直到其成功(或 者直到尝试由于各种适用的重试或争用管理策略而退出-未示出)。这在图7中由从750 到720的反馈说明。应当指出,在这种情况下,该方法可以包括(基于更新概率)重复确 定是否更新所存储的值,因为,如果递增共享计数器的尝试由于冲突而失败,则这可以指示 另一个操作(例如,另一线程的递增操作)已经从进行前一确定开始修改了更新概率。一 旦递增共享计数器的尝试成功(示为从750肯定离开),则递增操作可以完成,就像在755 中。如在这个例子中说明的,在一些实施例中,线程读取共享计数器的后续操作可以通过读 取所存储的更新概率并依赖于所存储的更新概率和期望的准确性百分比计算共享计数器 的预计值来做这件事,就像在760中。
[0079] 在上述概率计数器的一些实施例中,需要注意避免在T1变得太小时更新其,因为 这会造成计数器的属性丢失。特别地,可以指出,因为这种方法适用整数伪随机数发生器, 所以,如果更新不减小所存储阈值的整数部分,则这可以真正影响更新的概率。
[0080] 在一些实施例中,已经观察到,至少当T1S a+Ι时T 彡1。因此,在一些实施 例中,当这不再为真时,概率计数器可以复位。在其它实施例中,如果这在给定语境中和/ 或对于给定的多线程应用是优选的,则在这种情况下会发生误差。在其中选择a = 5000(例 如,为了实现1%的RSTDV)并且使用32位计数器的例子中,当预计值低于MaxInt值大约 0.02%时,这个阈值可以被越过。因此,当与单纯32位计数器比较时,概率计数器可以实现 低相对误差和好得多的扩展性,而不显著减小所实现的计数器的范围。
[0081] 在一些实施例中,迄今为止所描述的概率计数器方法可以在计数器变得有争用并 且达到更高的值时执行得非常好,但是当争用低并且预计计数器值低时会比标准的基于 CAS的计数器显著更慢。在一些实施例中,这种概率计数器的混合版本(在本文被称为"概 率-适应"计数器)可以被采用,其中递增操作依赖于对计数器的当前、最近或历史争用量。 例如,在一些实施例中,这种自适应概率计数器可以最初通过递增标准并发计数器(例如, 利用CAS类型指令)对递增计数器的请求作出响应,但是,如果CAS操作失败多次(例如, 根据预定的重试限值或者其它争用管理策略),则它可以切换到上述概率计数方案。例如, 在一种实施例中,概率计数器结构可以在64位字的一半中存储标准计数器,并且在另一半 中存储概率计数器。当遇到争用时,递增操作可以从更新结构的标准计数器部分切换到更 新概率计数器部分。在这个例子中,读取计数器可以包括把通过计数器结构的概率计数器 部分预计的值添加到由结构的标准计数器部分存储的值。这种自适应方法可以尤其适于用 在访问数千计数器的多行程应用中,其中只有几个常常(或者曾经)被争用。
[0082] 用于依赖于对计时器的争用来递增混合计数器的方法的一种实施例由图8中的 流程图示出。如在810说明的,在这个例子中,该方法可以包括启动混合共享计数器(例如, 包括标准计数器部分和概率计数器部分的计数器)的递增的多线程应用的线程。应当指 出,在这个和其它例子中,启动共享计数器递增的线程可以是共同表示多个并发执行的原 子事务的多个线程之一,并且该共享计数器可以从这些事务当中一个或多个中访问。该方 法还可以包括线程尝试递增共享计数器的标准计数器部分,就像在820中(例如,利用CAS 类型操作或者类似的同步操作)。如果尝试成功(示为从830肯定离开),则递增操作可以 完成,就像在870中。如果递增混合共享计数器的标准计数器部分的尝试不成功(示为从 830否定离开)但是还没有达到重试限制条件(示为从840否定离开),则该方法可以包括 线程重试其递增共享计数器的标准计数器部分的尝试一次或多次,有或没有延迟,就像在 845中,并且确定这些尝试是否成功(示为从845到840的反馈)。应当指出,在各种实施 例中,重试限制条件可以是一个或多个之前的CAS类型操作未能递增计数器的标准部分和 /或指示对共享计数器的争用的一个或多个其它因素。
[0083] 如果递增混合共享计数器的标准计数器部分的尝试不成功(示为从830否定离 开)并且已经达到重试限制条件(示为从840肯定离开),则该方法还可以包括线程通过尝 试递增共享计数器的概率计数器部分来尝试递增混合共享计数器(就像在850中)。如果 这种尝试不成功(示为从860否定离开),则该方法可以包括线程重复其递增混合共享计数 器的概率计数器部分的尝试,直到其成功(或者直到尝试由于各种适用的重试或争用管理 策略而退出-未示出)。这在图8中由从860到850的反馈说明。如果递增混合共享计 数器的概率计数器部分的尝试成功(示为从860肯定离开),则递增操作可以完成,就像在 870中。如在这个例子中所说明的,在一些实施例中,线程读取混合共享计数器的后续操作 可以通过读取标准计数器部分的值和概率计数器部分的值并且返回其和来做这件事,就像 在880中。
[0084] 关于其准确性、低争用情况下的性能,高争用情况下的扩展性以及空间使用,上述 概率计数器可以适于用在许多语境下并且用于许多类型的多线程应用。但是,在其它语境 下,在不使用浮点运算的情况下提供相似属性的计数器可能更合适。因此,在一些实施例 中,更新概率可以限制到总是二的非正幂。这可以使得决定是否更新计数器相对容易(具 有适当的概率),并且如果是这样,就计算下一个更新概率,而不使用任何浮点运算。以下描 述两个这种计数器(连同对应的递增和读取操作)。
[0085] 在其中只有二的非正幂用作更新概率的实施例中,响应于对递增计数器的请求, 通过确定整数随机数的低k位是否全为零,递增操作可以决定是否以概率l/2 k更新计数器 (而不需要执行任何浮点计算)。应当指出,这种方法采用比上述方法更粗粒度的更新概 率,因为,相对于按因子&八 &+1)减小其,每个更新可以只把更新概率减半。减小更新概率 对于性能和扩展性是重要的(至少在一定程度上)。但是,如果更新概率在每次更新后减 半,则它会太快变小,这会减小计数器的准确性。因此,在一些实施例中,根据用于管理这种 折中的策略,相同的更新概率可以在最终减小其之前被重复使用,策略的例子在本文描述。
[0086] 在以下描述的例子中,计数器值可以利用二进制浮点(BFP)表示。例如,计数器可 以存储对(m,e),该对代表预计值m*2 6(即,m是尾数,而e是指数)。计数器变量中的不同 位字段被用来存储m和e。例如,如果四位被用来存储用于e的值并且28位被用来存储用 于m的值,则计数器结构可以代表多达(2 28-1) *215的计数器值,或者大约2K倍的Maxlnt。
[0087] 在以下所描述的例子中,当指数为e时,计数器可以以概率2 ε更新。就像在前面的 例子中,为了保持计数器的预期预计值等于至今所执行的递增的总数,26可以在利用概率 2 6递增计数器时添加到预计值。注意,在各种实施例中,2 6可以以至少两种途径添加到由 (m,e)表示的计数器的预计值。例如,一种途径是把所存储的值更新为(m+l,e)。只能在m 为奇数并且指数字段不饱和的时候应用的另一种途径是把计数器更新为((m+l)/2, e+Ι)。 在这两种情况下,添加到预计值的量都很容易看到是26。以下基于这种通用方法描述的实 施例可以在当更新计数器时控制使用哪种方法的一种或多种策略中不同。
[0088] 用于递增存储二进制浮点值的概率计数器的方法的一种实施例由图9的流程图 示出。如在910说明的,在这个例子中,该方法可以包括在给定节点上执行的线程启动存储 概率计数器值作为二进制浮点数的共享概率计数器的递增,其中更新概率可从概率计数器 值的指数部分计算并且限制到二的非正幂。例如,在一些实施例中,计数器结构可以包括尾 数部分和指数部分,这两部分一起用来表示m*2 6的预计(或预期)值。该方法还可以包括 线程确定共享概率计数器是否应当递增(就像在920中)。例如,在一些实施例中,共享概 率计数器可以以概率1/2 ε更新。
[0089] 在这个例子中,如果线程确定不应当递增共享概率计数器(示为从930否定离 开),则递增操作可以完成(即,不递增共享概率计数器),就像在955中。另一方面,如果 线程确定应当递增共享概率计数器(示为从930肯定离开),则该方法可以包括线程通过 尝试在共享概率计数器中存储新值来尝试递增计数器,使得其新预计值等于其之前的预计 值与2 6之和,就像在940中。例如,递增计数器的尝试可以利用CAS类型操作执行,有或没 有退避。应当指出,以这种途径(用((m+l)/2,e+l)代替(m,e))递增计数器减小更新计数 器的概率一半。如果递增共享概率计数器的尝试成功(示为从950肯定离开),则递增操 作可以完成(就像在955中)。如果递增共享概率计数器的尝试不成功(示为从950否定 离开),则该方法可以包括重复递增共享概率计数器的尝试一次或多次,直到其成功(或者 直到尝试由于各种适用的重试或争用管理策略而退出-未示出)。应当指出,在这个例子 中,重复递增所存储概率计数器的尝试可以包括重复确定是否执行递增。这在图9中由从 950到920的反馈说明。如在这个例子中所说明的,在一些实施例中,线程读取共享概率计 数器的后续操作可以通过读取所存储的概率计数器值并计算预计值来做这件事(即,在这 个例子中,返回左移指数值的尾数值),就像在960中。应当指出,在这个例子中,这等效于 计算m*2e。
[0090] 在一些实施例中,存储概率计数器值作为二进制浮点数的概率计数器可以采用确 定性更新策略,其中更新概率可从概率计数器值的指数部分计算。这种计数器的一个例 子(在本文被称为BFP-DUP计数器)可以呈现类似于上述概率计数器的属性,例如,关于 RSTDV的期望界限可以被指定,并且对应的更新操作可以尽快减小更新概率,以便在确保期 望RSTDV界限的同时提高扩展性。在一些实施例中,确保指定的界限可以涉及确保更新概 率不会太快减小。在一些实施例中,更新策略可以造成对缺省地递增尾数的计数器的更新。 但是,如果递增尾数将使其达到预定的限值(在本文被称为"尾数-阈值"),其中阈值可能 需要是偶数,则递增操作可以代替地把尾数减半(在递增其之后)并且递增指数。利用这 种方法,第一尾数-阈值数的递增可以以概率2°= 1更新计数器,由此确保计数器达到尾 数-阈值,而不引入任何误差。其后,指数可以在计数器更新的每个尾数-阈值/2次递增 (并且尾数减半)。在一些实施例中,尾数-阈值的选择可以确定指数增长多快(并且因此 确定更新概率减小多快)。本文描述用于选择尾数-阈值的各种方法。
[0091] 如上所述,BFP-DUP计数器的一种实施例可以由以下给出的示例伪代码说明。
[0092]
[0093]
[0094]
[0095]
[0096] 用于递增包括多个更新选项的概率计数器的方法的一种实施例由图10的流程图 示出。如在1010说明的,在这个例子中,该方法可以包括在给定节点上执行的线程启动存 储概率计数器值作为二进制浮点数的共享概率计数器的递增,其中可从概率计数器值的指 数部分计算的更新概率被限制到二的非正幂。例如,在一些实施例中,计数器结构可以包括 尾数部分和指数部分,这两部分一起表示m*2 6的预计(预期)值。该方法还可以包括线程 依赖于所存储的概率计数器值和整数随机数的值确定共享概率计数器是否应当递增(就 像在1020中)。例如,在一种实施例中,为了以概率1/2ε更新计数器,该方法可以包括确定 整数随机数的低e位是否全为零(浮点运算是不必要的)。如果是这样,则以这里所描述的 方式更新计数器可以减小更新计数器的概率一半。在一些实施例中,用来执行计数器更新 的方法可以依赖于如果计数器的尾部部分递增则其是否将溢出和/或计数器的指数部分 是否饱和。
[0097] 如在这个例子中所说明的,如果线程确定不应当递增共享概率计数器(示为从 1030否定离开),则递增操作可以完成(即,不递增共享概率计数器),就像在1080中。另 一方面,如果线程确定应当递增共享概率计数器(示为从1030肯定离开),并且如果递增尾 数将不使其等于其依赖于准确性的阈值(示为从1040否定离开),则该方法可以包括线程 通过尝试递增共享计数器的尾部部分来尝试递增计数器(就像在1070中),在这个时候,递 增操作可以完成(就像在1080中)。在一些实施例中,尝试递增共享计数器的尾数部分可 以利用CAS类型操作(或者类似的同步操作)执行一次或多次,直到其成功(或者直到由 于各种适用的重试或争用管理策略而退出),有或没有居间退避期(未示出)。就像在其它 例子中,如果递增共享计数器的尾数部分的尝试失败,则该方法可以包括重复图10中所示 的至少一些操作,从元素1020(未示出)开始。
[0098] 如在这个例子中说明的,如果线程确定应当递增共享概率计数器(示为从1030肯 定离开),但是递增尾数将使其等于其依赖于准确性的阈值(示为从1040肯定离开),并 且共享概率计数器的指数部分已经处于其最大值(示为从1050肯定离开),则该方法可以 包括线程把计数器复位到零(就像在1055中),在这个时候,递增操作可以完成(就像在 1080中)。换句话说,该方法可以包括把(尾数,指数)对复位成值(0, 0)。如果递
当前第4页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1