【发布时间】:2016-02-10 14:13:22
【问题描述】:
当前的 Intel CPU 缓存架构由本地 L1 和 L2 缓存以及共享的包容性 L3 缓存组成。我对此有两个类似的问题:
- 一个内核上运行的线程对内存的大量访问是否会使另一个内核的 L1/L2 缓存失效?
- 单核线程所需要的数据能否占用整个三级缓存?
更新:请注意,英特尔 Skylake 具有新的 L3 缓存架构,该架构不包含在内。
【问题讨论】:
当前的 Intel CPU 缓存架构由本地 L1 和 L2 缓存以及共享的包容性 L3 缓存组成。我对此有两个类似的问题:
更新:请注意,英特尔 Skylake 具有新的 L3 缓存架构,该架构不包含在内。
【问题讨论】:
这两个问题的答案都是肯定的。
第二个更简单,所以让我们从这里开始 - L3 缓存的主要好处是它是共享的。此共享的目的是允许您在需要时通过单个线程利用更多的缓存容量,而不是在内核之间拆分相同的资源而不是共享它们时获得的缓存容量。
换句话说,如果所有 N 个内核都处于活动状态且平衡,并且数据分布均匀(即没有对齐问题),那么每个内核将获得完全相同的 LLC 份额 (1/N)。但是,如果一个核心更需要缓存 - 它有增长的空间,但会牺牲其他目前较少受缓存限制的核心。当然,在极端情况下,您可以通过单个进程利用整个 L3,而忽略架构决定保留 L3 的某些子集专用于某些任务(非常常见)或某些核心(非常不常见)的情况。
至于第一个问题 - 如果 L3 是包容性的(在大多数常见的 CPU 中就是这种情况,主要用于高效的窥探过滤),并且其中一个线程变得占主导地位并完全接管它,那么放置在那里的数据由其他核心(不太活跃的核心)必须被驱逐到内存中,并且为了强制执行包容性 - 这些行也必须从各自核心的 L1 和 L2 中强制退出。如果您将数据保留在那里(破坏包容性),您将失去一致性。
在 L3 不包含在内的系统上,不会发生这种行为,不太活跃的核心将能够在 L1/L2 内部保留其数据。然而,这样的系统可能会使用一个包容性的窥探过滤器,它可能会遇到同样的问题(并再次强制驱逐)——这取决于确切的缓存协议。
【讨论】: