直接映射缓存中是否会发生伪共享?相关理解是否正确?
直接映射缓存里的伪共享问题解析
先给结论:直接映射缓存肯定会发生伪共享
伪共享的本质是「不同线程访问的非共享数据,恰好被打包进了同一个缓存行」,和缓存是直接映射、组相联还是全相联无关——直接映射只是规定了内存地址到缓存行的固定映射关系,但只要多个线程碰的不同数据落在同一块内存块(对应同一缓存行),伪共享就会找上门。
关于缓存一致性机制的理解完全错误
别觉得直接映射缓存就不需要一致性机制:
- 现在的多核CPU,每个核心都有自己的L1/L2私有缓存,直接映射只是说某内存地址会对应到每个核心缓存里的固定位置,但各核心的缓存是独立的。
- 比如核心A修改了某个缓存行的数据,核心B的对应缓存行就会失效,必须靠MESI这类缓存一致性协议来同步状态,不然会出现数据不一致的大问题。
- 你说的「写入无需刷回内存」也不对:缓存行被修改后,要么在被替换时刷回内存,要么在其他核心发起读请求时同步过去,不可能一直只留在本地缓存里。
关于并行性的理解有偏差
缓存访问不是简单的「串行执行」:当多个线程啃同一个缓存行里的不同数据时,只要有一个线程写入,其他线程的对应缓存行就会被标为无效。之后这些线程再读的时候,就得重新从内存或者持有有效数据的核心缓存里拿数据——这个过程会产生额外开销,拖慢并行效率,但不是彻底的串行。这也是伪共享最烦人的地方:明明线程没共享数据,却因为缓存行粒度被迫做同步。
关于SharedData结构体的判断是对的
如果SharedData的四个成员(加上结构体对齐的字节)总大小没超过一个缓存行(一般是64字节),那它们确实会被加载到同一个缓存行里。这时候四个线程分别访问不同成员,就正好踩中伪共享的坑,导致频繁的缓存同步。
内容的提问来源于stack exchange,提问作者progr
相关产品推荐
相关产品推荐

