【问题标题】:False Sharing and Atomic Variables错误共享和原子变量
【发布时间】:2012-04-25 23:39:15
【问题描述】:
当不同的变量在同一个缓存行中时,你会遇到False Sharing,这意味着即使两个不同的线程(运行在不同的内核上)正在访问两个不同的变量,如果这两个变量驻留在同一个缓存行中,您将受到性能影响,因为每次都会触发缓存一致性。
现在说这些变量是原子变量(我所说的原子是指引入内存栅栏的变量,例如 C++ 的atomic<t>),在那里错误共享很重要,或者原子变量是否在同一缓存行与否,因为据说它们无论如何都会引入缓存一致性。换句话说,将原子变量放在同一个缓存行中会使应用程序比不将它们放在同一个缓存行中更慢吗?
【问题讨论】:
标签:
c++
c
multithreading
caching
x86-64
【解决方案2】:
如果你使用具有最强一致性要求的原子变量,一个完整的内存屏障,错误共享的影响可能不会很明显。对于这样的访问,原子操作的性能基本上受到内存访问延迟的限制。所以无论如何事情都很慢,我认为在虚假分享的情况下它们不会变得更慢。
如果您有其他侵入性较小的内存排序,原子本身对性能的影响可能较小,因此错误共享的影响可能很大。
总的来说,我会先看看原子操作本身的性能,然后再担心此类操作的错误共享。
【解决方案3】:
将原子变量放在同一个缓存行中会使应用程序比不将它们放在同一个缓存行中更慢吗?
“原子”变量的错误共享可能导致性能问题(是否会导致此类问题取决于很多因素)。
假设您有两个内核,A 和 B,每个内核都在自己的变量上运行。我们分别称这些变量为a 和b。
A 的缓存中有a,B 的缓存中有b。
考虑当A 增加a 时会发生什么。
-
如果
a 和b 共享一个缓存行, B 的b 副本将失效,并且其对b 的下一次访问将导致缓存未命中。李>
-
如果
a 和b 不共享缓存行,就B 的缓存副本b 而言,不会对B 产生影响。
无论a 和b 是否为“原子”,都会发生这种情况。