包容性还是排他性?Intel Core IvyBridge处理器中的L1,L2缓存

bho*_*ath 5 c processor cpu-architecture cpu-cache

我有Intel Core IvyBridge处理器,Intel®Core™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的步长从开始索引到结束索引访问数组元素。为了获得更好的准确结果,我们重复此过程(访问索引处index,开始到末尾的数组元素)多次,比如说进行一百万次并取平均值。

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

我的问题是- 我正确吗?

提前致谢 。

Lee*_*eor 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,因为Ivy-Bridge在上一代产品中只有很小的微体系结构更改)。

因此,关于您的问题:

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

还要注意,如果基准测试访问的数据集大于L2,则它可能无法位于L2中​​(特别是如果您串行访问它并且超出L2的大小超过单向的大小),并且您必须从L3取回它。

  • @alphazero,从某种意义上说,对于存储而言,这并不重要,因为缓存以行粒度运行(因此,您只会在行内未使用的块上浪费空间)。但是,即使在页面粒度上,数据碎片也绝对不是一个好主意-您将需要更多的TLB条目(并且更有可能通过页面遍历进行序列化),HW预取在物理页面边界上无效,并且您可能会增加低位addr位的冲突速率可能会对存储单元产生负面影响。我认为L2在这里没有任何特殊作用,这适用于整个系统。 (2认同)