使CPU缓存失效

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

你使用什么来使CPU缓存失效(汇编语言,操作系统调用?),这适用于哪种架构/CPU类型? - Johannes Rudolph
@Johannes Rudolph,假设实际代码是用C#编写的(易失性、Interlocked操作、MemoryBarriers),但最终会被转换为适当的汇编指令。在我个人的情况下,我正在使用带有英特尔芯片组(尤其是至强)的SMP机器进行工作。但我想了解这个失效过程如何在更“通用”的范围内发生(AMD/Intel,SMP/NUMA等)。 - unknown
1个回答

2
当您执行没有栅栏或互斥锁的负载时,加载的值可能来自任何地方,即缓存、寄存器(通过编译器优化)或RAM…但从您的问题中可以看出,您已经知道了这一点。
在大多数互斥锁实现中,当您获取互斥锁时,总是会应用栅栏,无论是显式地(例如mfence、barrier等)还是隐式地(例如在x86上锁定总线的锁前缀)。这会导致路径上所有缓存的缓存行被无效化。
请注意,整个缓存不会失效,只有内存位置的相应缓存行会失效。这也包括互斥锁的行(通常实现为内存中的值)。
当然,还有架构特定的细节,但这就是它通常的工作方式。
还要注意,这不是使缓存失效的唯一原因,因为可能存在需要使另一个CPU上的缓存失效的操作。搜索“缓存一致性协议”将为您提供关于此主题的大量信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接