虚假共享和原子变量

pyt*_*nic 8 c c++ multithreading caching x86-64

当不同的变量位于同一个缓存行中时,您可能会遇到错误共享,这意味着即使两个不同的线程(在不同的核心上运行)正在访问两个不同的变量,如果这两个变量位于同一个缓存行中,您将拥有性能命中,因为每次都会触发缓存一致性.

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

Ale*_*nov 5

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

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