【问题标题】:False Sharing and Atomic Variables错误共享和原子变量
【发布时间】:2012-04-25 23:39:15
【问题描述】:

当不同的变量在同一个缓存行中时,你会遇到False Sharing,这意味着即使两个不同的线程(运行在不同的内核上)正在访问两个不同的变量,如果这两个变量驻留在同一个缓存行中,您将受到性能影响,因为每次都会触发缓存一致性。

现在说这些变量是原子变量(我所说的原子是指引入内存栅栏的变量,例如 C++ 的atomic<t>),在那里错误共享很重要,或者原子变量是否在同一缓存行与否,因为据说它们无论如何都会引入缓存一致性。换句话说,将原子变量放在同一个缓存行中会使应用程序比不将它们放在同一个缓存行中更慢吗?

【问题讨论】:

    标签: c++ c multithreading caching x86-64


    【解决方案1】:

    澄清:对于负面后果,至少应该写入对“错误共享”变量的一些访问。如果写入很少,则错误共享的性能影响可以忽略不计;写入次数越多(因此缓存行无效消息)性能越差。

    即使使用原子,缓存行共享(无论是假的还是真的)仍然很重要。在这里寻找一些证据:http://www.1024cores.net/home/lock-free-algorithms/first-things-first。因此,答案是 - 是的,将不同线程使用的原子变量放置到同一缓存行可能会使应用程序比将它们放置到两个不同的行更慢。但是,我认为它几乎不会被注意到,除非应用程序花费大量时间更新这些原子变量。

    【讨论】:

      【解决方案2】:

      如果你使用具有最强一致性要求的原子变量,一个完整的内存屏障,错误共享的影响可能不会很明显。对于这样的访问,原子操作的性能基本上受到内存访问延迟的限制。所以无论如何事情都很慢,我认为在虚假分享的情况下它们不会变得更慢。

      如果您有其他侵入性较小的内存排序,原子本身对性能的影响可能较小,因此错误共享的影响可能很大。

      总的来说,我会先看看原子操作本身的性能,然后再担心此类操作的错误共享。

      【讨论】:

        【解决方案3】:

        将原子变量放在同一个缓存行中会使应用程序比不将它们放在同一个缓存行中更慢吗?

        “原子”变量的错误共享可能导致性能问题(是否导致此类问题取决于很多因素)。

        假设您有两个内核,AB,每个内核都在自己的变量上运行。我们分别称这些变量为ab

        A 的缓存中有aB 的缓存中有b

        考虑当A 增加a 时会发生什么。

        • 如果ab 共享一个缓存行, Bb 副本将失效,并且其对b 的下一次访问将导致缓存未命中。李>
        • 如果ab 不共享缓存行,B 的缓存副本b 而言,不会对B 产生影响。

        无论ab 是否为“原子”,都会发生这种情况。

        【讨论】:

          猜你喜欢
          • 2014-11-30
          • 2013-02-13
          • 1970-01-01
          • 1970-01-01
          • 2016-08-16
          • 1970-01-01
          • 1970-01-01
          • 2016-06-23
          • 1970-01-01
          相关资源
          最近更新 更多