8

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

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

4

3 回答 3

7

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

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

于 2012-04-13T15:31:02.417 回答
1

If you use atomic variables with the strongest consistency requirements, a full memory barrier, the effect of false sharing will probably not be noticeable. For such an access the performance of an atomic operation is basically limited by the memory access latency. So things are slow anyhow, I don't think they would get much slower in the presence of false sharing.

If you have other less intrusive memory orderings the performance hit by the atomics itself may be less, and so the impact of false sharing might be significant.

In total, I would first look at the performance of the atomic operation itself before worrying about false sharing for such operations.

于 2012-04-13T16:06:49.367 回答
0

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

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

假设您有两个核心AB,并且每个核心都对自己的变量进行操作。让我们分别称这些变量ab

Aa在它的缓存中,并且Bb在它的缓存中。

A考虑递增时会发生什么a

  • 如果ab共享一个缓存行, B的副本b将失效,并且它的下一次访问b将导致缓存未命中。
  • 如果a并且b不共享缓存行,B则就其缓存副本而言没有影响b

无论是否a并且b是“原子的”,都会发生这种情况。

于 2012-04-13T15:45:16.610 回答