当不同的变量位于同一个缓存行内时,您可以体验到虚假分享,这意味着即使两个不同的线程(在不同的内核上运行)正在访问两个不同的变量,如果这两个变量驻留在同一缓存行中,您也会受到性能影响,因为每次都会触发缓存一致性。
现在说这些变量是原子变量(我所说的原子变量是指引入内存栅栏的变量,例如atomic<t>
C++ 的),错误共享在那里会很重要,或者原子变量是否在同一个缓存行中并不重要,因为据说它们无论如何都会引入缓存一致性。换句话说,将原子变量放在同一个缓存行中是否会使应用程序比不将它们放在同一个缓存行中更慢?
澄清:对于负面后果,至少应该写入一些对“错误共享”变量的访问。如果写入很少,则错误共享对性能的影响可以忽略不计;写入次数越多(缓存行使消息无效),性能就越差。
即使使用原子,缓存行共享(无论是假还是真)仍然很重要。在这里寻找一些证据:http://www.1024cores.net/home/lock-free-algorithms/first-things-first。因此,答案是 - 是的,与将不同线程使用的原子变量放置到同一缓存行相比,将它们放置到两个不同的行可能会使应用程序变慢。但是,我认为除非应用程序花费大量时间来更新这些原子变量,否则它基本上不会被注意到。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)