虚假共享和原子变量

时间:2012-04-13 15:23:00

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

当不同的变量在同一个缓存行中时,您可以体验False Sharing,这意味着即使两个不同的线程(在不同的核心上运行)正在访问两个不同的变量,如果这两个变量位于同一个高速缓存行,每次触发高速缓存一致性时,都会有性能损失。

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

如果您使用具有最强一致性要求的原子变量,一个完整的内存屏障,则错误共享的效果可能不会明显。对于这种访问,原子操作的性能基本上受到存储器访问等待时间的限制。所以事情总是很慢,我不认为他们会在虚假分享的情况下变慢。

如果你有其他较少侵入性的记忆顺序,原子本身所遭受的性能可能会更低,因此虚假共享的影响可能会很大。

总之,我首先要考虑原子操作本身的性能,然后再担心这种操作的错误共享。

答案 2 :(得分:0)

  

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

错误共享“原子”变量可能导致性能问题(无论 会导致此类问题取决于很多事情。)

假设您有两个核心AB,并且每个核心都运行自己的变量。我们分别调用这些变量ab

A在其缓存中有aB在其缓存中有b

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

  • ,如果ab共享一个缓存行, B的{​​{1}}副本将失效,并且下一次访问b会导致缓存未命中。
  • ,如果ba不共享缓存行,b的缓存副本而言,对B没有任何影响关心。

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