一个核心大量使用 L3 缓存是否会使另一个核心的 L1/L2 缓存失效?

Can extensive usage of L3 cache by one core invalidate L1/L2 cache of another core?

当前的 Intel CPU 缓存架构由本地 L1 和 L2 缓存以及共享的包容性 L3 缓存组成。我有两个类似的问题:

  1. 一个内核上的线程 运行 的大量内存访问是否会使另一个内核的 L1/L2 缓存无效?
  2. 单核线程运行需要的数据能占满整个三级缓存吗?

更新:请注意,Intel Skylake 具有新的非包容性 L3 缓存架构。

两个问题的答案都是肯定的。

第二个更简单,让我们从这里开始 - L3 缓存的主要好处是它是共享的。这种共享的目的是允许您在需要时通过单个线程利用更多的缓存容量,而不是如果您要在内核之间拆分相同的资源而不是共享它们。

换句话说,如果所有 N 个核心都处于活动状态且处于平衡状态,并且数据分布均匀(即没有对齐问题),则每个核心将获得完全相同的 LLC 份额 (1/N)。但是,如果一个核心更需要高速缓存 - 它有空间增长,但会牺牲其他目前缓存较少的核心。当然,在极端情况下,您可以通过单个进程利用整个 L3,而忽略架构决定保留 L3 的某些子集专用于某些任务(非常常见)或某些核心(不太常见)的情况。

关于第一个问题 - 如果 L3 是包容性的(就像大多数常见 CPU 中的情况一样,主要是为了有效的监听过滤),并且其中一个线程成为主导并完全接管它,那么数据放置那里的其他核心(不太活跃的核心)将不得不被驱逐到内存中,并且为了强制执行包容性 - 这些行也必须被强制退出各自核心的 L1 和 L2。如果将数据保留在那里(破坏包容性),您将失去一致性。

在 L3 不包含在内的系统上,不会发生这种行为,不太活跃的核心将能够在 L1/L2 内部保留其数据。然而,这样的系统可能会使用一个包容性的监听过滤器,它可能会遇到同样的问题(并再次强制驱逐)——这取决于确切的缓存协议。