Intel 中包含 L1/L2 缓存,并且 L1/L2 缓存是 8 路关联性,意味着一组中存在 8 个不同的缓存线。缓存行作为一个整体进行操作,这意味着如果我想从缓存行中删除几个字节,则整个缓存行将被删除,而不仅仅是我要删除的那些字节。我对吗 ?
现在,我的问题是每当一组缓存行被从缓存中删除/逐出,无论是通过其他进程还是通过使用 clflush(手动逐出缓存行/块),系统是否将该缓存行的逐出数据存储在某处(在任何缓冲区、寄存器中) ETC),这样下次就可以从该位置加载数据,与从主内存或更高级别的缓存加载数据相比,可以减少延迟,OR it 总是简单地无效缓存中的数据,下次加载更高级别的数据。
任何建议或文章的任何链接都将受到高度赞赏。提前致谢。
L1/L2 不一定是包容性的,只有最后一级缓存是包容性的,在 i7 上是 L3。
你说得对,缓存行是基本的缓存元素,你必须抛出整个缓存行才能填充新的缓存行(或者当使该行无效时)。您可以在这里阅读更多相关内容 -http://www.tomshardware.com/reviews/Intel-i7-nehalem-cpu,2041-10.html
当删除一行时,所采取的操作取决于其 MESI 状态(MESI 及其衍生协议是缓存一致性维护的协议)。如果该行被修改(“M”),则数据必须“写回”到下一级缓存(如果未命中,它可能会在那里分配,或者“直写”到下一级 - 取决于缓存维护的策略)。请注意,当您到达最后一级缓存时,您将必须命中,因为它是包容性的。当从最后一级缓存中逐出一行时,必须将其写入内存。无论哪种方式,未能写回修改后的行都会导致一致性丧失,这很可能导致错误的执行。
如果该行未被修改(无效、独占或共享),则 CPU 可能会默默地丢弃该行,而无需回写,从而节省带宽。顺便说一句,在更复杂的缓存协议(如 MESIF 或 MOESI)中还有其他几种状态。
您可以通过谷歌搜索“缓存一致性协议”找到很多解释。如果你喜欢更扎实的来源,你可以参考任何CPU架构或缓存设计教科书,我个人推荐Hennessy&Patterson的《计算机架构,一种定量方法》,有一整章关于缓存性能,但这有点偏离主题。
小更新:从 Skylake 开始,某些 CPU(服务器部分)不再具有包容性 L3,而是具有非包容性(以支持增加的 L2)。这意味着当 L2 老化时,干净的行也可能被写回,因为 L3 通常不保存它们的副本。
更多细节:https://www.anandtech.com/show/11550/the-intel-skylakex-review-core-i9-7900x-i7-7820x-and-i7-7800x-tested/4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)