一级缓存中的缓存无效



假设一个变量为X的缓存行同时上传到CPU0的L1d和CPU1的L1d。在更改了CPU0中X的值后,当CPU1的L1d缓存行无效时,如果CPU0有一个带X的缓存行,CPU1是否不可能从CPU0的L1d高速缓存中复制变量X?即使不是这样,我也想知道是否有CPU0引入CPU1’的情况

所描述的情况是不允许的。当处理器核心执行对地址的存储时;存储缓冲器";以便稍后传输到高速缓存。在从存储缓冲区传输数据之前,缓存需要对该行进行独占访问,这种状态一次只能存在于一个缓存中。

三个简单的案例:

  1. 如果核心的缓存已经具有独占访问权限(即,行处于独占或修改状态(,则存储缓冲区可以随时将数据写入缓存
  2. 如果核心的高速缓存具有没有排他访问的行的有效副本(例如"共享"状态(,则存储缓冲器中新数据的存在将导致高速缓存生成"共享";升级";请求该线路。在所有其他缓存(或目录(确认它们已使该地址的任何副本无效之前,不会授予升级到E或M状态的权限
  3. 如果核心的高速缓存没有该行的有效副本(或者没有地址匹配或者地址匹配处于无效状态(;Read With Intent To Modify";要求这将导致缓存行的当前数据(无论是在内存中还是从另一个核心缓存中的修改副本(传输到请求核心的缓存,并导致系统中其他每个缓存中的缓存行无效

如果两个核心执行存储指令";同时";,实现的细节将导致两个核心中的一个获得独占访问。另一个核心将具有其请求";被拒绝";(NACK'd(,并且它将重试该请求,直到第一个核心+缓存完成其缓存线状态的升级和数据的更新。此机制强制对单个地址的所有存储进行顺序处理,即使它们是同时发布

一般来说,用户不可能可靠地使某些事情发生;同时";在两个核心中(或者检测它是否同时发生(,但实现必须通过上述序列化过程来解释它。

如何从副本已失效的L1进行复制?它不再有该行的副本。

但无论如何,可以肯定的是,在L1d未命中后,首先检查的地方是本地L2,然后是共享L3。

在Skylake服务器或更高版本(因此不包括L3(上,我认为L3未命中将从DRAM重新加载,除非该行在另一个核心中处于修改状态。

否则,在客户端芯片和早期的Xeons上,如果任何核心都有有效的副本,那么L3缺失是不可能的,因为它是包容性的。(Nehalem之前的旧芯片也没有包含的最后一级缓存,例如Core2的L2(

另请参阅英特尔酷睿i7处理器中使用了哪种缓存映射技术?


当你说";如果我们使一个核心中的高速缓存无效";,我不确定你的意思是把它从缓存中逐出,例如为其他东西腾出空间,还是运行clflush这样的指令。或者,如果你的意思是核心进行了存储,因此必须进行所有权读取(RFO(以获得该行的MESI独占所有权(即使所有其他副本无效(,这样它就可以将存储从存储缓冲区提交到L1d。

最新更新