微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当有多个级别的私有缓存然后共享内存时,缓存一致性如何工作?

如何解决当有多个级别的私有缓存然后共享内存时,缓存一致性如何工作?

大多数在线示例使用与此类似的配置来解释一致性:每个内核连接到单个私有缓存(每个内核没有多个缓存级别),然后所有这些内核连接到公共共享内存。如果每个核心都有这样的配置,那么一致性如何工作:私有 l1 --> 私有 l2 --> 共享内存。现在,如果我必须使 proc2 的 L1 中的块无效并在 proc1 的 L2 中获得修改后的副本,那么它是如何工作的?

如果有人能指出好的资源,那就太好了。

解决方法

这是特定于实现的。

从 SoC / 非核心的角度来看,核心表现为单个实体,因此它可以被窥探并返回一个答案(如果需要,还会返回该行的更新副本)。

在内核中,每个缓存都可以根据其设计运行 - 包含在其上层的缓存(例如,包含 L1 中的所有数据的包含 L2)可以通过知道是否进一步L1 需要监听。如果该行在上层,或者如果 L2 缓存不能保证包含在内,则 CPU 将需要创建另一个对这些级别的监听。或者,您可以通过并行侦听所有级别开始,这在某些情况下可能更快,但更浪费(在电源和缓存访问插槽方面)。最后,对于一些上层缓存来说,发送监听而不等待响应可能就足够了(例如指令缓存通常不能有修改的行来回写),而其他缓存则需要完整的响应协议。

请记住,大多数乱序设计不仅需要监听缓存,还需要某些缓冲区来保存进行中的操作,以防它们需要被刷新。例如,带有 TSO 策略的 x86 通常还需要监听加载缓冲区以刷新正在进行的加载(因为在它们的提交点数据不再保证正确)。如果某些存储缓冲区设计包含应该可观察的数据,则它们也可能需要被监听。

如果 L2(或核心中的最低级别私有缓存)正在管理这种内部监听,那么最终它需要收集所有响应并决定将整体响应发送到外部共享缓存。

更糟糕的是,当有多个缓存级别和 MESI 状态时,这些状态不必一致。例如,您可以在 L1 中有一个修改过的行,而它的旧副本仍然驻留在 L2 中。窥探本身也可能有不同的类型,例如用于共享数据的窥探与在一个核心获得所有权时使共享副本无效的窥探。不同的侦听类型可能对不同缓存级别上的不同 MESI 状态产生不同的影响。这当然不能打破这些窥探的基本前提(无效的窥探将保证使一行的所有副本无效),但有些窥探可能比严格要求的更激进。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。