caching - 当存在多级私有(private)缓存和共享内存时,缓存一致性如何工作?

标签 caching cpu cpu-architecture cpu-cache

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

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

最佳答案

这是特定于实现的。

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

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

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

如果 L2(或核心中的最低级别私有(private)缓存)正在管理此内部窥​​探,那么最终它需要收集所有响应并决定发送到外部共享缓存的总体响应。

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

关于caching - 当存在多级私有(private)缓存和共享内存时,缓存一致性如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65502394/

相关文章:

python - Python 虚拟机是否需要 CPU 来执行字节码?

llvm - 为什么没有处理器具有非对称寄存器?

内存段和物理 RAM

php - 我们如何清除 Laravel 中的 Controller 和模型缓存

php - 提供数千张动态加水印的图像?

caching - mmap 是直接访问页面缓存,还是页面缓存的副本?

openCL 麻烦同时保存 CPU 和 GPU 的编译二进制文件

windows - 时钟在 Windows 7 中如何工作?

c++ - 在 L3 缓存未命中发生之前, vector 中有多少个可迭代对象?

asp.net-mvc - 如何在ASP.NET应用程序中设置S-MaxAge CacheControl值?