伪共享(False Sharing)

【参考】

https://zhuanlan.zhihu.com/p/55917869

【cache memory】

cpu和主存间存在三级缓存

L1, L2(单核独享)

L3(多核共享)

【L1和L2如何保持一致】

mesi协议定义cacheline四个状态

modified,只缓存在该cpu的缓存中,且被修改

exclusive,只缓存在该cpu的缓存中,未被修改

shared,被多个cpu缓存,并且各个缓存中的数据与主存数据一致,当有一个CPU修改该缓存行中,其它CPU中该缓存行可以被作废

invalid,该缓存是无效的(可能有其它CPU修改了该缓存行)

【false share问题】

 

1)core0抢到cacheline的主导权,thread0更新cacheline(导致core1中cache line 变为invalid)

2)thread1去更新时通知core0将cacheline刷回主存,然后再从主存中load该cacheline进入高速缓存进行修改(该修改又会使得core0的cacheline失效)

 【性能测试】

https://www.noerror.net/zh/cpp/thread/hardware_destructive_interference_size.html

只用了1/4的时间

【folly实现】

隔离几个变量

posted @ 2023-01-04 19:45  stupidstan2019  阅读(33)  评论(0编辑  收藏  举报