使CPU的缓存无效

时间:2010-02-06 14:35:43

标签: caching cpu cpu-cache

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

2 个答案:

答案 0 :(得分:3)

我不是这方面的专家,但我偶然发现了这个文件,也许它很有帮助 http://www.rdrop.com/users/paulmck/scalability/paper/whymb.2009.04.05a.pdf

答案 1 :(得分:2)

当您执行不带栅栏或互斥锁的加载时,加载的值可能来自任何地方,即缓存,寄存器(通过编译器优化)或RAM ......但是根据您的问题,您已经知道这一点

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

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

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

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