我有 Intel Core IvyBridge 处理器、Intel(R) Core(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 缓存中。现在,当我开始从起始索引再次访问数组时,即not在L1缓存中,但在L2缓存中,因此会出现缓存未命中,并且将从L2缓存加载。这样,整个数组的所有元素都需要更高的访问时间,总共我将获得整个数组的总访问时间。为了获得单次访问,我将取总访问次数的平均值。
我的问题是 -我对么 ?
提前致谢 。
请参阅英特尔优化指南中的第 2.2.5 节 -
http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf 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 仅发生了微小的微架构变化)。
所以关于你的问题:
- 对于 L1 来说,不存在包容性问题,因为它没有上层缓存可供包容
- L2缓存是not包容性,这意味着不能保证驻留在 L1 中的线路也必须位于 L2 中。然而在大多数情况下它是likely在那里,因为它可能是在核心最初请求时被填充到 L2 中的,并且有很好的机会在 L2 中生存更长时间,因为它更大(因此驱逐可以更好地分布在更多组中),并且由 L1 过滤(通常意味着更少的驱逐)
另请注意,如果您的基准测试正在访问大于 L2 的数据集,则它可能无法位于 L2 中(特别是如果您连续访问它并超出 L2 超过单向的大小),并且您必须从 L3 获取它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)