在英特尔酷睿i3/i7的情况下从高速缓存设置中逐出数据之后的数据

bho*_*ath 3 architecture operating-system processor cpu-architecture computer-architecture

L1/L2缓存包含在Intel和L1/L2缓存中是8路相关性,意味着在一组中存在8条不同的缓存线.缓存行作为一个整体操作,意味着如果我想从缓存行中删除几个字节,整个缓存行将被删除,而不是我想要删除的那些字节.我对吗 ?

现在,我的问题是,无论是通过某个其他进程还是使用clflush(手动逐出缓存行/块),从缓存中删除/逐出集合的缓存行,系统是否会将该缓存行的驱逐数据存储在某处(在任何缓冲区,寄存器等),以便下次它可以从该位置加载数据以减少延迟,与从主存储器或更高级别的缓存加载数据相比,或者总是使缓存中的数据无效并且下次加载下一个更高级别的数据.

任何建议或文章的任何链接将受到高度赞赏.提前致谢.

Lee*_*eor 5

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