使CPU的缓存无效

7 cpu caching cpu-cache

当我的程序执行带有释放语义或可能是全栅栏的获取语义/存储操作的加载操作时,它会使CPU的缓存无效.
我的问题是:缓存的哪一部分实际上是无效的?只有持有我用过的变量的缓存行获取/释放?或者整个缓存可能无效?(L1 + L2 + L3 ..等等?).当我使用获取/释放语义或使用全栅栏时,这个主题是否有区别?

0xf*_*xfe 2

当您在没有栅栏或互斥体的情况下执行加载时,加载的值可能来自任何地方,即缓存、寄存器(通过编译器优化)或 RAM...但从您的问题来看,您已经知道这一点。

在大多数互斥体实现中,当您获取互斥体时,始终会显式(例如,mfence、barrier 等)或隐式(例如,用于锁定 x86 上总线的锁定前缀)应用栅栏。这会导致路径上所有缓存的缓存行失效。

请注意,整个缓存并未失效,只是内存位置的相应缓存行失效。这还包括互斥锁的行(通常作为内存中的值实现)。

当然,有一些特定于体系结构的细节,但这就是它的一般工作方式。

另请注意,这并不是使缓存失效的唯一原因,因为一个 CPU 上的某些操作可能需要使另一 CPU 上的缓存失效。在谷歌上搜索“缓存一致性协议”将为您提供有关此主题的大量信息。