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缓存伪共享问题的主要内容,如果未能解决你的问题,请参考以下文章