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

文档序号:9383066阅读:来源:国知局
始或缺省值存储在计数器的节点ID部分中时尝试递增计数器的线程可以尝试递增计 数器而不必还把值写到该计数器的节点ID部分。这种自适应NUMA感知方法已经显示在所 有争用级别都与最好的现有RBO方法以及比以上描述的非自适应NUMA感知方法具有竞争 力。
[0051] 用于递增依赖于对共享计数器的争用的NUM感知共享计数器的方法的一种实施 例由图5中的流程图示出。如在510说明的,在这个例子中,该方法可以包括在给定节点上 执行的线程启动共享计数器的递增。如果共享计数器的节点ID部分识别出具有(或已经 请求)优先权的节点(示为从515肯定离开),则该方法可以包括继续其递增共享计数器的 尝试,就像在图4中所示出的方法中,从元素415开始。如果共享计数器的节点ID部分没 有识别出具有(或已经请求)优先权的节点(示为从515否定离开),则该方法可以包括线 程尝试递增共享计数器,就像在520中。在一些实施例中,递增共享计数器的尝试可以利用 CAS类型操作或类似的同步操作执行。
[0052] 如在这个例子中说明的,如果递增共享计数器的尝试成功(示为从530肯定离 开),则递增操作可以完成(就像在535中)。另一方面,如果递增共享计数器的尝试不成功 (示为从530否定离开)但是还没有到达重试限值(示为从540否定离开),则该方法可以 包括线程重试其递增共享计数器的尝试一次或多次,有或没有延迟,就像在545中。例如, 线程可以重复其利用单个CAS类型操作或类似的同步操作递增共享计数器的尝试,有或没 有其间的退避期。这在图5中是由从545到530的反馈来说明的。如果递增共享计数器的 尝试不成功(示为从530否定离开)并且已经达到重试限值(示为从540肯定离开),则 该方法可以包括线程尝试递增共享计数器并且更新计数器结构的节点ID部分,以反映线 程在其上执行的节点,有或没有延迟,就像在550中。如在这个例子中所说明的,如果这个 尝试不成功(示为从555肯定离开),则该方法可以包括重复递增共享计数器和更新计数 器结构的节点ID部分的尝试一次或多次,直到其成功(或者直到由于各种适用的重试或争 用管理策略而中止)。这在图5中通过从555到550的反馈来表示。一旦递增共享计数器 和更新计数器结构的节点ID部分的尝试成功(示为从555肯定离开),递增操作就可以完 成,就像在560中。
[0053] 在各种实施例中,迄今为止所述的计数器在重争用情况下可以实现良好的单线程 性能和扩展性。但是,其优于简单RBO类型计数器的优点会在中等负载下减小,因为会有更 少在同一节点上执行连续递增的机会。此外,这些计数器会对特定于系统的调谐敏感,这会 使它们比一些其它方法更不稳定。在其它实施例中,使用稍多空间的计数器可以减小或消 除这些效果,其中一些计数器在以下描述。
[0054] 在一些实施例中,被称为"多行(multiline) "方法的方法可以被用来避免昂贵的 跨节点通信,而不会引入上述每线程计数器部件的缺点。例如,在一些实施例中,多行方法 可以采用每NUM节点的单独计数器部件。在此类实施例中,每节点部件的同步可以利用 CAS类型指令实现,以递增每个计数器部件,有或没有递增计数器的尝试之间的随机化退避 期。应当指出,当在这种情况下利用CAS类型指令同步时,不需要担心跨节点争用。当采 用多行方法时,读取计数器可以涉及依次读取每个部件,没有同步,并且返回所读取的值之 和。应当指出,这种方法的正确性可以依赖于递增操作只向计数加一的递增操作。但是,在 其中这种假设不适用的实施例中,其它技术可以被用于相同的效果。
[0055] 虽然当采用多行方法时空间的增加受节点个数的限制,但是优选的是对只很少递 增的计数器完全避免空间的增加。在一些实施例中,在本文被称为"多行-适应"方法的 自适应方法可以被采用,其中递增操作依赖于对计数器的当前、最近或历史争用量。例如, 在一些实施例中,多行-适应方法可以最初采用并递增标准计数器,并且可以"膨胀"其,以 便只有多于预定次数(例如,在一种实施例中是四次)的递增标准计数器的尝试失败时才 使用上述多线技术。其它策略可以在其它实施例中使用,例如,如果频繁地造成远程高速 缓存失中就膨胀计数器。在一些实施例中,膨胀计数器可以包括分配包括每个节点一个计 数器的附加结构并且用指向那个结构的指针代替标准计数器。在一些此类实施例中,初始 (定期)计数器结构的一位可以保留,以区分初始结构是存储到附加结构的指针还是计数 器值。这种计数器的一个例子在图3D-3E中示出并且在以上描述。
[0056] 在一些实施例中,用于采用多行-适应方法的低争用计数器的空间开销可以仅仅 是保留的位(在实践当中,这将减小计数器的范围一半)并且更高的空间开销只能适用于 经历更高争用的计数器(根据各种预定的争用管理策略)。在一些实施例中,多行-适应方 法引入用于争用计数器的额外间接性水平,这会减慢计数器的递增操作。但是,在实践中, 当计数器有争用时,这不会导致显著的性能问题,因为它可以减小初始计数器结构上CAS 类型递增尝试的速率(由此减小多线程应用经历的整体争用)。
[0057] 用于响应于争用而膨胀共享计数器的方法的一种实施例由图6中的流程图示出。 如在610说明的,在这个例子中,该方法可以包括在给定节点上执行的线程启动共享计数 器的递增。在一些实施例中,线程可以尝试递增共享计数器(就像在620中),例如,利用 CAS类型的操作,有或没有居间的退避期。如果递增共享计数器的尝试成功(示为从630 的肯定退出),则递增操作可以完成(就像在635中)。如果递增共享计数器的尝试不成功 (示为从630的否定退出)但是适用的重试限制条件还未满足(示为从640的否定退出), 则该方法可以包括线程重复其递增计数器的尝试一次或多次,直到其成功或者直到重试限 制条件已经满足。这在图6中由从640到620的反馈来说明。在各种实施例中,重试限制 条件可以基于未成功尝试的次数、高速缓存失中的次数或者基于另一适用重试或争用管理 策略。
[0058] 如在这个例子中说明的,如果递增共享计数器的尝试不成功(示为从630的否定 退出)并且适用的重试限制条件已经满足(示为从640的肯定退出),则该方法可以包括利 用到包括每个节点一个计数器的结构的指针(即,一个或多个节点本地的计数器)代替共 享计数器(或者其计数部分),就像在650中。例如,在一些实施例中,计数器的一位可以用 来指示计数器部分的值当前是代表计数值还是代表到多个计数器结构的指针。该方法可以 包括线程尝试递增其节点本地计数器一次或多次直到成功,如660中那样。例如,线程可以 尝试使用CAS类型操作或类似的同步操作来递增其节点本地计数器,而有或没有居间的退 避时段。如在这个例子中所说明的,在一些实施例中,在其中一个节点上的线程的读取共享 计数器的值的后续操作可以通过读取所有节点本地的计数器并且返回其计数器值之和来 做这件事。
[0059] 在一些实施例中,本文所述的多行-适应方法可以提供在低争用水平在空间开销 和吞吐量方面都比上述基本RBO计数器有竞争性、随着增加的争用扩展良好并且在高争用 情况下产生比基本RBO计数器高得多的吞吐量(例如,在一些实验中,多于700x吞吐量)的 计数器。应当指出,在一些实施例中,由于利用单一部件的同一节点上的线程之间的争用, 采用多行和多行-适应方法的计数器会遭受高争用水平。在一些此类实施例中,这种类型 的争用可以通过使用每节点更多部件来缓解。例如,虽然每节点的部件必须在单独的高速 缓存行中,以避免节点之间的错误共享,但是,如果每个节点采用多于一个部件,则在同一 高速缓存行中为单个节点定位多个部件不是不合理。虽然错误共享在这种情况下仍然会强 加一些开销,但是可以只在一个NUM节点中。此外,仍然会有使用多个部件的好处,因为更 少CAS错误将在这种情况下发生。因此,在一些实施例中,有可能在不增加空间使用的情况 下利用这种方法提高性能。
[0060] 应当指出,在一些实施例中,由于多行方法造成的附加空间开销在具有大量统 计计数器的系统中会是不可接受的,其中大部分统计计数器不是重争用的。虽然上述多 行-适应方法会招致只对有争用计数器的这种空间开销,但是,如果不同的计数器在不同 时间发生争用,则这会随时间推移导致过多开销。此外,在一些实施例中,这些方法增加读 取计数器的操作的等待时间和/或,在一些语境下,它们会由于其动态分配的存储器的使 用而不可接受。如以下更详细描述的,在一些实施例中,如果并且当计数器不需要精确时, 则这些问题中一些或全部可以被避免。
[0061] 如前面所指出的,甚至在中等争用水平,简单的不同步计数器通常也丧失计数器 更新的显著部分。因为计数器常常被用来检测各种系统事件的过高比率,所以这些单纯实 现(具有讽刺意味的是)在它们应当提供的数据最重要的时候最低效。然而,在一些语境 下并且对于一些应用,可以不需要精确的计数。如以下更详细描述的,在一些实施例中,计 数器可以在仍然旨在维持未由单纯计数器实现实现的规定准确性水平的同时采用这种灵 活性。
[0062] -种现有的概率计数器(有时候被称为"Morris计数器")可以代表比它所包含 的位数(例如,八位)通常表示的更大的值范围。Morris计数器通过存储计数值的概率近 似来做这件事,其中计数值的概率近似值在本文被称为v(n),其中η是根据以下的精确计 数(即,对应的递增操作被调用多少次):
[0063] v(n) = log(1+n/a)/log(l+1/a).
[0064] 在这个例子中,a代表其值控制计数器准确性的参数,如以下解释的。在这个例子 中,向n/a添加一(就像在分母中一样)确保函数被良好定义并且当η = 0时等于零。此 外,除以l〇g(l+l/a)确保当η = 1时函数为一。换句话说,这种近似确保计数器至少对于 值零和一包含准确的值。根据这个定义,当存储在计数器中的值为V时,它所代表的精确计 数是:
[0065] n(v) = a((1+1/a)ν-1).
[0066] 在本文各种描述中,物理存储在概率计数器中的值ν可以被称为"存储的值",并 且它所代表的值η(ν)可以被称为由该概率计数器"计数"的所发生类型的事件个数的"预 计值"或"估计值"。换句话说,Morris计数器存储概率近似ν (η),其中η是精确计数。在 这个例子中,所存储的值必须是整数,就像在这个例子中假设只使用八位。因此,精确计数 不能从所存储的值确定。因此,没有确定性的途径来知道何时递增存储在计数器中的值,以 反映已发生足够的递增,使得计数器的值现在应当由更高的所存储的值来表示。为了解决 这个问题,当计数器包含值ν时,Morris计数器算法如下按概率ρ (ν)递增所存储的值:
[0067] p (v) = 1/(η (ν+1)-η (ν))
[0068] 直观地,这意味着,平均而言,存储在Morris计数器中的值将在存储给定的值ν之 后每η (ν+1)-η (ν)个递增操作递增一次。这确保由所存储的值预计的值是其预期值等于精 确计数的随机变量。为了避免对每次递增计算概率,用于实现这种概率计数器的现有算法 预先为a的给定值计算所有256个概率,并且把它们存储在查找表中。在这个例子中,查找 表不需要为每个计数器复制,而是只为每个准确性类(即,a的每种选择)复制。
[0069] 在这个例子中,参数a可以既确定Morr i s计数器可以代表的范围又可以确定预计 和实际计数之间预期的误差,作为预计值与实际计数的标准偏差(STDV)之比(有时候被称 为相对STDV,或者RSTDV)。当精确计数为η时预计值的方差由〇 2=n(n-l)/2a给出,据 此,当η变大时,RSTDV粗略地为丨/^。在一个例子中,选择a = 30的准确性参数值产生大 约1/8的RSTDV。在这个例子中,a的这种选择允许计数器代表η (255),这是大约130000。 虽然这对于只使用八位的计数器结构是优秀的,但是对于在现代计算机系统中使用的许多 类型的统计计数器这不是令人满意的(关于范围和/或准确性)。如以下更详细描述的,在 一些实施例中,这种方法可以被修改,以便实现具有大得多的范围和更高准确性的可扩展 计数器。
[0070] 应当指出,因为η(ν)在η中是指数的,所以对Morris计数器的更新随着精确计数 增长而变得更不频繁。在一些实施例中,概率计数器可以采用这个属性,以便减小对频繁更 新的共享计数器的争用,同时界定预期的误差。在一些实施例中,可以实现提供比利用上述 Morri s计数器方法可能的更大范围和更高准确性的概率计数器。应当指出,仅仅把上述方 法扩展到使用更多位的Morris计数器在一些语境下可能不是可接受的,因为当使用更多 计数器位时,为所有可能的存储值预先计算更新概率会变得显著不期望。在一些实施例中, 概率计数器和以下描述的对应的递增操作可以以避免这种需求的方式扩展上述技术。例 如,已经观察到,从V到V+1递增所存储的值是具有因子aAa+l)的V中的几何级数,如下 所示:
[0071]
[0072] 因此,在一些实施例中,对于给定的值p(v),p (v+1)的值可以简单地通过用a/ (a+Ι)乘以p(V)来计算。在一些实施例中,这个常量可以预先计算,以避免重复执行这个 浮点除法运算。还已经观察到(例如,给定以上)n(v) =a(l/p(v)-l)。因此,在一些实施 例中,概率计数器的所存储计数器值V的预计值n(v)可以直接从p(v)计算,而无需知道 V。实际上,在一些实施例中,这么做可以比直接从V计算n(v)快五倍多。因此,在一些实 施例中,不是在概率计数器中存储v,就像在以上的Morris计数器例子中,而是用于概率计 数器的计数器结构可以代替地存储浮点值P (V)。在一个例子中,这种计数器结构可以存储 P(V)的32位浮点表示,但是在其它实施例中,范围和/或准确性可以通过利用64位双字 存储P(V)的值来进一步扩展。在一些实施例中,利用这种方法,对于以该计数器为目标的 每个被调用的递增操作,存储在计数器中的值P可以被读取,并且利用概率P,可以用等于 p*a/ (a+Ι)的值代替。当与上述Morris计数器方法比较时,这种方法可以提供对预计计数 器值的更快评估,并且当利用b位表示计数器时可以避免预先计算并存储所有乂位的值的 需求。作为替代,只有产生期望RSTDV的a的值和aAa+l)的对应值可能需要预先计算。
[0073] 在这种概率计数器的各种实施例中,在以该计数器为目标的每个递增操作期间, 所存储的值可以以概率P更新,其中P可以等于所存储的概率值本身(即,最近存储的值) (或者可以依赖于其来确定)。例如,在一种实施例中,递增操作可以采用线程本地的、具有 参数出,21,7)的XOR偏移伪随机数发生器,该发生器可以返回整数i,i具有在1和最大整 数值,MaxInt (在这个例子中,将等于232-1)之间的值。在这个例子中,如果i/MaxInt < p, 则所存储的值可以被更新。在一些实施例中,概率计数器结构可以存储(Maxlnt*p)(例如, 作为浮点数),因此递增操作只需要比较i与所存储的值,以
当前第3页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1