我拥有英特尔酷睿IvyBridge处理器,英特尔(R)酷睿(TM)i7-3770 CPU @ 3.40GHz(L1-32KB,L2-256KB,L3-8MB)。我知道L3是包容的且在多个核之间共享。针对我的系统,我想知道以下问题:
PART1 :
- L1是包容的还是独占的?
- 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缓存中加载。这样所有整个数组元素都需要更长的访问时间,并且总体上我将得到整个数组的总访问时间。要获取单个访问,我会取总访问次数的平均值。
我的问题是-我理解正确吗?
提前感谢您的回答。