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

我使用的是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。 最近访问的是整个arrays的最后32KB在L1中。 由于包含属性和高速缓存一致性,整个arrays也存在于L2和L3高速缓存中。 现在,当我开始从启动索引再次访问数组时,该索引不在 L1缓存中,而是在L2缓存中,因此将存在缓存未命中,并且它将从L2缓存加载。 这样,整个arrays的所有元素都需要更长的访问时间,总的来说,我将获得整个arrays的总访问时间。 为了获得单一访问权限,我将取总访问量的平均值。

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

提前致谢 。

请参阅英特尔优化指南中的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获取它。