包容还是排除?Intel Core IvyBridge处理器中的L1、L2缓存

7

我拥有英特尔酷睿IvyBridge处理器,英特尔(R)酷睿(TM)i7-3770 CPU @ 3.40GHz(L1-32KB,L2-256KB,L3-8MB)。我知道L3是包容的且在多个核之间共享。针对我的系统,我想知道以下问题:

PART1 :

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

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个回答

11
请参阅英特尔优化指南中的第2.2.5节 - http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf。请注意,这适用于桑迪桥处理器,但似乎对于仅有轻微微体系结构变化的常春藤桥处理器没有改变。
所以关于你的问题:
1. 对于L1缓存,不存在被包含的问题,因为它没有上一级缓存可以被包含。
2. L2缓存不是包容的,意味着住在L1中的行不一定也在L2中。然而,在大多数情况下,它可能会在那里,因为它可能在最初由内核请求时被填充到L2中,并且有更好的机会在L2中存活更长时间,因为它更大(因此驱逐更好地分布在更多集合中),并且由L1过滤(通常意味着驱逐较少)。
另外,请注意,如果您的基准测试访问的数据集大于L2,则很可能无法坐在L2中(特别是如果您以串行方式访问它并超过单个路的大小),并且您必须从L3中获取它。

1
谢谢Leeor。你能告诉我L1缓存未命中时会如何处理吗?如果在L1发生未命中,它会检查L2,然后是L3还是直接检查L3?另外,我还有一个疑问,当L1缓存未命中且新行从更高级别的缓存中被带入时,L2或L3是否会发生替换以替换L1中被替换的缓存行? - bholanath
1
一个缺失会查找下一个高速缓存级别,L1->L2->L3。当获取一行时,它应该填充所有的高速缓存级别 - 填充L3是强制性的,因为它是包容性的,正如我们所说的L2不是包容性的,但仍然有必要填充它,因为该行可能会在L1中静默丢失,所以你希望它在其他级别上复制。 - Leeor
@leeor一直认为,由于VM分页,当进程内存> L2时,将分页对齐分配(并通过在同一页中打包相关元素来利用局部性)是有用的。我被告知仅对齐单词即可,并且页面对齐不会提供任何其他好处。你有什么想法? - alphazero
2
@alphazero,说存储不重要是有道理的,因为缓存以行粒度工作(因此您只会在行内未使用的块上浪费空间)。但是,即使在页面粒度上,数据碎片化也绝对是一个坏主意 - 您将需要更多的TLB条目(并且有更高的机会被页面遍历序列化),HW预取在物理页面边界上无效,并且您可能会增加低地址位上的冲突率,这可能会对内存单元产生负面影响。我认为L2在这里没有任何特殊作用,这适用于整个系统。 - Leeor
@leeor 谢谢。顺便说一句,如果你有博客的话,应该把它放在你的个人资料里 :) - alphazero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接