大多数在线示例使用类似于此的配置来解释一致性:每个单核连接到单个私有缓存(每个核没有多个缓存级别),然后所有这样的核连接到一个公共共享内存。如果我对每个核心都有这样的配置,coherence是如何工作的:私有l1 -->私有l2 -->共享内存。现在,如果我必须使proc2的L1中的一个块无效,并在proc1的L2中获得一个修改过的副本,那么它是如何工作的?
如果有人能指出好的资源,那就太好了。
发布于 2021-01-02 07:38:30
这是特定于实现的。
从SoC / uncore的角度来看,核心的行为就像一个单一的实体,所以它可以被窥探,并将返回一个单一的答案(如果需要,还会返回一行的更新副本)。
在核心内,每个高速缓存可以根据其设计来运行-对于其较高级别具有包容性的高速缓存(例如,具有L1中的所有数据的包容性L2 )可以通过知道是否需要对L1进行进一步的探听来充当探听过滤器。如果该行位于较高级别,或者如果不能保证L2缓存是包含的,那么CPU将需要创建到这些级别的另一个监听。或者,您可以从并行侦听所有级别开始,这在某些情况下可能更快,但更浪费(在功率和缓存访问插槽方面)。最后,对于一些较高级别的缓存,在不等待响应的情况下发送一个snoop可能就足够了(例如,指令缓存通常不能有修改过的行来写回),而其他缓存则需要整个响应协议。
请记住,大多数无序设计不仅需要探听缓存,还需要某些缓冲区,这些缓冲区保存正在进行的操作,以防需要刷新它们。例如,x86及其TSO策略通常还需要探听加载缓冲区以刷新正在进行的加载(因为在提交时不能保证数据是正确的)。一些存储缓冲区设计可能也需要被窥探,如果它们持有应该可观察到的数据。
如果L2 (或核心中最低级别的私有高速缓存)正在管理此内部侦听,则最终它将需要收集所有响应,并决定发送到外部共享高速缓存的总体响应。
更糟糕的是,当MESI状态具有多个缓存级别时,这些状态不必一致。例如,您可以在L1中有一个经过修改的行,而它的一个较旧的副本仍然驻留在L2中。监听本身也可以具有不同的类型,例如用于共享数据的监听与用于在一个核获得所有权时使共享副本无效的监听。不同的监听类型可能对不同高速缓存级别上的不同MESI状态具有不同的影响。当然,这不能打破这些窥探的基本前提(无效窥探将保证使一行的所有副本无效),但是一些窥探可能比严格要求的更具侵略性。
https://stackoverflow.com/questions/65502394
复制相似问题