可以通过一个核心广泛使用L3缓存使另一个核心的L1 / L2缓存失效吗?

时间:2015-11-09 20:17:43

标签: cpu-cache cpu-cores

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

  1. 运行在一个核心上的线程可以进行大量内存访问,从而使另一个核心的L1 / L2缓存失效吗?
  2. 单核上运行的线程所需的数据是否可以占用整个L3缓存?
  3. 更新:请注意,英特尔Skylake具有新的L3缓存架构,这种架构不具备包容性。

1 个答案:

答案 0 :(得分:6)

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

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

换句话说,如果所有N个内核都处于活动状态和平衡状态,并且数据均匀分布(即没有对齐问题),则每个内核可以获得完全相同的LLC共享(1 / N)。但是,如果一个核心的缓存更多,那么它的成长空间是以牺牲当前缓存较少的其他核心为代价。当然,在极端情况下,您可以通过单个进程利用整个L3,而忽略了体系结构决定保留专用于某项任务(非常常见)或某些核心(非常不常见)的L3的某些子集的情况。 / p>

至于第一个问题 - 如果L3是包容性的(如大多数常见CPU中的情况,主要用于有效的窥探过滤),并且其中一个线程成为主导并完全接管它,那么数据放在那里其他核心(不太活跃的核心)必须被驱逐到内存中,并且为了实现包容性 - 这些线路也必须被强制排除在各自的核心之外。 L1和L2。如果你保留数据(打破包容性),你就会失去一致性。

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