一级/二级缓存在Intel中是包含的,一级/二级缓存是8路关联性,这意味着在一个集合中存在8条不同的缓存线。缓存线作为一个整体运行,这意味着如果我想从缓存线中删除几个字节,整个缓存线都将被删除,而不仅仅是我想删除的那些字节。我说得对吗?
现在,我的问题是,无论何时通过其他进程或使用clflush(手动逐出缓存线/块)从缓存中移除/逐出集合的缓存线,系统是否将该缓存线的逐出数据存储在某个位置(在任何缓冲区、寄存器等中),因此,与从主内存或更高级别的缓存加载数据相比,下次它可以从该位置加载数据以减少延迟,或者它总是简单地使缓存中的数据无效,然后下次从更高级别加载数据。
任何建议或文章的任何链接将高度赞赏。提前感谢。
Intel中包含一级/二级缓存
英特尔x86处理器的缓存包容性分为以下几类:
某些处理器具有L4缓存或内存侧缓存。这些储藏室有九个。在KNL和KNM中,如果MCDRAM完全或部分配置为在缓存模式下运行,则会对其进行修改,包括L2(因此包括L1),这意味着包容性仅适用于L2中的脏线(在M相干状态下)。在支持Optane DIMM的CSL处理器上,如果PMEM DIMM完全或部分配置为在缓存模式下运行,DRAM DIMM的工作方式如下:
级联湖处理器使用一种新颖的缓存管理方案,使用包容性和非包容性DRAM缓存的组合来减少写入的DRAM带宽开销,同时也消除了在从DRAM缓存中逐出包容行时管理处理器缓存无效的复杂性。
根据级联湖:下一代英特尔至强可扩展处理器。
KNL/KNM中的MCDRAM缓存和CSL中的DRAM缓存不属于三种传统包容性类别中的任何一种,即包容性、独占性和九种。我认为我们可以把它们描述为“混合包容性”
AMD处理器:
现有的AMD处理器没有L4缓存或L3之外的内存侧缓存。
VIA处理器:
这包括通过处理器的所有电流。
而L1/L2高速缓存是8路关联性的,意味着在一个集合中有8条不同的高速缓存线存在。
在大多数英特尔处理器上都是如此。唯一的例外是NetBurst微体系结构,其中一条二级缓存线包含两条相邻的缓存线,统称为扇区。
典型的关联性为8,但不同的关联性并不少见。例如,Sunny Cove中的L1D是12向关联的。请参阅:冰湖48KiB一级数据缓存的索引是如何工作的?。
缓存线作为一个整体运行,这意味着如果我想从缓存线中删除几个字节,整个缓存线都将被删除,而不仅仅是我想删除的那些字节。我说得对吗?
对,这是由于与每个缓存级别的每个缓存项相关联的一致性状态的限制。缓存线的所有字节只有一种状态。
系统是否将该缓存线的逐出数据存储在某个位置(在任何缓冲区、寄存器等中),以便下次可以从该位置加载数据以减少延迟
有几个因素会影响这个决定:(1)该行是否脏,(2)更高编号缓存级别的包容性属性,如果有的话,(3)该行是否预计在不久的将来被访问,以及(4)如果我记得正确地说,如果一行的内存类型在驻留在缓存中时从可缓存更改为不可缓存,则它将被逐出,而不会缓存在任何其他级别,而不考虑前面的因素。
因此,一个适用于所有处理器的懒惰回答是“可能”
L1/L2不一定是包含的,只有最后一级缓存是包含的,在i7上是L3。你说缓存线是基本缓存元素是对的,你必须抛出一整条缓存线来填充一条新的缓存线(或者在使这一行无效时)。你可以在这里读到更多关于这方面的内容-http://www.tomshardware.com/reviews/Intel-i7-nehalem-cpu,2041-10.html
删除一条线时,所采取的操作取决于其MESI状态(MESI及其派生协议是缓存一致性维护的协议)。如果修改了行(“M”),则必须将数据“写回”到下一级缓存(如果未命中,它可能会分配到下一级缓存,或者“直写”到下一级缓存,具体取决于缓存维护的策略)。请注意,当您到达最后一级缓存时,您必须命中它,因为它包含所有缓存。从最后一级缓存中逐出一行时,它必须写入内存。无论哪种方式,如果无法写回修改过的行,都会导致一致性丧失,这很可能导致错误的执行。
如果线路未被修改(无效、独占或共享),CPU可能会在无需写回的情况下自动删除线路,从而节省带宽。顺便说一下,在更复杂的缓存协议(如MESIF或MOESI)中还有其他几种状态。
通过谷歌搜索“缓存一致性协议”,你可以找到很多解释。如果您喜欢更可靠的源代码,可以参考任何CPU体系结构或缓存设计教科书,我个人推荐轩尼诗
小更新:从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
我使用Spring缓存抽象,定义了多个缓存。有时,当数据更改时,我想逐出多个缓存。是否可以使用Spring的CacheExit注释逐出多个缓存?
这个问题和它的答案,最近被标记为史诗般的答案,让我产生了疑问;我可以根据CPU分支预测失败来衡量Windows中运行的应用程序的性能吗?我知道存在一些静态分析工具,这可能有助于优化代码以在分支预测情况下获得良好的性能,手动技术可以通过简单地进行更改和重新测试来提供帮助,但我正在寻找一种自动机制,它可以在一段时间内报告分支预测失败的总数,我希望一些Visual C的Profiler工具可以帮助我。
我试图使用和实现以下缓存逻辑: 如果过期时间已经过去,条件(需要计算和I/O)被评估为TRUE,然后强制获取数据并更新缓存。 如果过期时间已经过去,条件(需要计算和I/O)被计算为FALSE,那么不要使缓存数据无效,并从缓存中检索值。 如果过期时间未过,则从缓存中检索该值。 我按照这个指南工作:https://www.baeldung.com/spring-boot-caffeine-cache
我有一个要求,如果我从消息驱动bean调用的服务(Restful服务)关闭或没有返回成功,我需要将消息回滚到队列,等待一段时间(指数),然后再次从队列读取消息,并尝试连接到服务。 我正在尝试的是: 在方法中,如果我从调用Restful服务的服务接收到异常,我将使用我可以执行类似于; 但是如何确保以指数级增长? 也许我需要保持豆子的状态,但有人能建议我怎么做吗?
问题内容: 我将实体添加到数据库中,并且工作正常。但是,当我检索列表时,会得到旧实体,直到取消取消部署应用程序并再次重新部署它之后,才会显示添加的新实体。这意味着默认情况下会缓存我的实体吗?但是,我没有在persistence.xml或任何此类文件中进行任何用于缓存实体的设置。 我什至尝试调用flush(),refresh()和merge()。但它仍然仅显示旧实体。我想念什么吗?请帮我。 问题答案
嗨,我在执行方法时遇到清理缓存的问题。这是我的配置和缓存方法: 我要缓存的这个方法: 在执行此方法时,我希望按类型清理缓存: 新闻消息对象看起来像: 缓存工作正常,第一次查询DB时,第二次从缓存中提取数据。问题是当我更新数据时,@CacheEvict不会清理缓存。我试图使用以下注释清理所有缓存:@cacheexit(cacheNames={CacheConfiguration.RSS\u NEWS