包容性还是排他性?英特尔酷睿IvyBridge处理器中的L1,L2缓存

时间:2013-11-04 19:08:16

标签: c cpu-architecture processor cpu-cache

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

PART1:

  1. L1是包容性还是排他性?
  2. L2是包容性还是排他性?
  3. PART2:

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

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

    我的问题是 - 我是否正确?

    提前致谢。

1 个答案:

答案 0 :(得分:5)

请参阅英特尔优化指南中的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过滤(通常意味着更少的驱逐)
  3. 另请注意,如果您的基准测试访问的数据集大于L2,则可能无法进入L2(特别是如果您以串行方式访问它并超过L2超过单一大小的大小) ,你必须从L3获取它。