我使用的是Intel Core IvyBridge处理器,Intel(R)Core(TM)i7-3770 CPU @ 3.40GHz(L1-32KB,L2-256KB,L3-8MB)。我知道L3是包容性的,并且在多个核心之间共享。我想知道关于我的系统的以下内容
PART1:
PART2:
如果L1和L2都包含在内,那么为了找到L2的访问时间,我们首先声明一个大小超过L2缓存(256KB)的数组(1MB),然后开始访问整个数组以加载到L2缓存中。之后,我们从开始索引到结束索引访问数组元素,步长为64B,因为缓存行大小为64B。为了获得更准确的结果,我们重复这个过程(在索引,起始端访问数组元素)多次,比如100万次并取平均值。
我理解为什么这种方法给出了如下正确的结果 - 当我们访问大小超过L2缓存大小的数组时,整个数组从主内存加载到L3,然后从L3加载到L2,然后L2加载到L1。最近访问的是整个阵列的最后32KB在L1中。由于包含属性和高速缓存一致性,整个阵列也存在于L2和L3高速缓存中。现在,当我从启动索引再次开始访问阵列时,在L1缓存中不,但在L2缓存中,因此将出现缓存未命中,并且它将从L2缓存加载。这样整个阵列的所有元素都需要更长的访问时间,总的来说我将得到整个数组的总访问时间。为了获得单一访问权限,我将取总访问量的平均值。
我的问题是 - 我是否正确?
提前致谢。
答案 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来说似乎没有变化,它对上一代只有微小的架构变化)。
关于你的问题:
另请注意,如果您的基准测试访问的数据集大于L2,则可能无法进入L2(特别是如果您以串行方式访问它并超过L2超过单一大小的大小) ,你必须从L3获取它。