cpu缓存伪共享问题

Posted 奇妙之二进制

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cpu缓存伪共享问题相关的知识,希望对你有一定的参考价值。

缓存系统中是以缓存行(cache line)为单位存储的,当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。


CPU1想要修改X,CPU2想要修改Y,这两个频繁改动的变量在同一个缓存行上,两个争夺缓存行的拥有权。

CPU1抢到后,更新X,那么CPU2上的缓存行的状态就会变成I状态(无效)——状态含义(MESI协议)

当CPU2抢到,更新Y,CPU1上缓存行就会变成I状态(无效)

轮番抢夺,不仅会带来大量的RFO消息,而且某个线程读取此行数据时,L1和L2缓存上都是失效数据,只有L3是同步好的。

表面上 X 和 Y 都是被独立线程操作的,而且两操作之间也没有任何关系。只不过它们共享了一个缓存行,但所有竞争冲突都是来源于共享。

因此,当两个以上CPU都要访问同一个缓存行大小的内存区域时,就会引起冲突,这种情况就叫“伪共享”

解决方案

  • 让不同线程操作的对象处于不同的缓存行

在内核代码里经常会看到对数据结构的大小进行扩充,以使得其独占一个缓存行。

以上是关于cpu缓存伪共享问题的主要内容,如果未能解决你的问题,请参考以下文章

伪共享与CPU cache line

伪共享与CPU cache line

并发底层原理之CPU缓存伪共享

从Java视角理解CPU缓存和伪共享

从Java视角理解CPU缓存和伪共享

杂谈 什么是伪共享(false sharing)?