6

我有 Intel Core IvyBridge 处理器,Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz(L1-32KB,L2-256KB,L3-8MB)。我知道 L3 是包容性的,并且在多个核心之间共享。我想知道关于我的系统的以下内容

第1部分 :

  1. L1 是包容的还是独占的?
  2. L2 是包容的还是独占的?

第2部分 :

如果 L1 和 L2 都包含,那么为了找到 L2 的访问时间,我们首先声明一个大小大于 L2 缓存(256KB)的数组(1MB),然后开始访问整个数组以加载到 L2 缓存中。之后,我们以 64B 的步长访问数组元素从开始索引到结束索引,因为缓存行大小为 64B。为了获得更好的准确结果,我们重复这个过程(访问索引处的数组元素,开始-结束)多次,比如 100 万次并取平均值。

我的理解为什么这种方法会给出正确的结果如下 - 当我们访问大小超过 L2 缓存大小的数组时,整个数组从主内存加载到 L3,然后从 L3 加载到 L2,然后从 L2 加载到 L1。整个数组的最后 32KB 在 L1 中,因为它最近被访问过。由于包容性和缓存一致性,整个阵列也存在于 L2 和 L3 缓存中。现在,当我再次从起始索引开始访问数组时,它不在 L1 缓存中,而是在 L2 缓存中,所以会有缓存未命中,它将从 L2 缓存中加载。这样,整个数组的所有元素都需要更长的访问时间,总的来说,我将获得整个数组的总访问时间。为了获得单一访问权限,我将取总无访问权限的平均值。

我的问题是 -我正确吗?

提前致谢 。

4

1 回答 1

9

请参阅英特尔优化指南中的第 2.2.5 节 -
http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf

(请注意,这适用于 Sandy-Bridge,但对于 Ivy-Bridge 来说似乎没有变化,它与上一代相比只有很小的微架构变化)。

所以关于你的问题:

  1. 对于 L1,没有包容性的问题,因为它没有要包容的上层缓存
  2. L2 缓存包含在内,这意味着不能保证位于 L1 中的行也必须位于 L2 中。然而,在大多数情况下,它可能存在,因为它可能在最初由核心请求时被填充到 L2 中,并且由于它更大,因此很有可能在 L2 中存活更长时间(因此驱逐更好地分布在更多集合中) ,并由 L1 过滤(通常意味着更少的驱逐)

另请注意,如果您的基准测试正在访问大于 L2 的数据集,则它可能无法位于 L2 中(特别是如果您连续访问它并且超过 L2 的大小超过单路的大小),并且您必须从 L3 中获取它。

于 2013-11-04T22:23:13.130 回答