【问题标题】:MESI- what happens when reading data currently being modified?MESI-读取当前正在修改的数据时会发生什么?
【发布时间】:2015-09-06 14:53:19
【问题描述】:

如果我有一个数据缓存行并且第一个字节正在被原子修改,我是否仍然可以同时从该缓存行读取不同字节的数据?或者我是否会尝试阅读了解正在发生的原子更新并等待它?

我正在尝试了解上述场景的性能影响。

【问题讨论】:

    标签: cpu-architecture mesi


    【解决方案1】:

    缓存一致性以行粒度维护,如今大多数 CPU 中通常为 64B。 进行修改的核心将首先请求整行的所有权,这意味着所有其他核心必须使它们的副本无效(如果它们有的话)。任何其他尝试读取的核心都必须请求该行,这将导致窥探被发送到修改核心。从那里你有两个选择:

    1. 修改内核完成了读取-修改-写入序列,并且该行与最新修改的数据一起位于其缓存中 - 在这种情况下,窥探将启动 WB 序列,更新后的行将可用于全部,第二个内核可以从中读取任何字节。

    2. 修改核心通过加载获取了线路,但它的存储仍未进行更改(这是可能的,因为存储通常在管道中执行得更晚,而加载通常是推测性的)。在这种情况下,核心必须保护线路不被窥探,通常通过对此类操作实施内部锁定。请注意,例如在 x86 上,大多数原子读取-修改-写入操作都需要锁定前缀。另请注意,读取 + 写入(非原子)的正常顺序只会在该点丢失该行,并稍后再次获取它以供存储,从而失去连贯性。

    编辑: 按照 Paul 的评论,设计一个允许子行粒度跟踪的缓存系统确实是可能的。这基本上意味着将 MESI 协议的基本块与用于缓存的基本块大小解耦,您需要为每个子集添加状态位(但仍可以对所有子集使用单个标签),仅使本地子集无效,并最终执行以某种方式合并以重新获得全线。但是,开销会使它变得非常罕见,而且我不熟悉商业 CPU 这样做只是为了避免错误共享。无论哪种方式,由于这样的子块可能不是字节大小的,因此原始问题仍然适用于同一块中的字节。

    【讨论】:

    • “失去连贯性”可能应该是“失去相对于其他读取器/写入器的原子性”(即,非 LOCK x86 读取-修改-写入指令仅对于中断是原子性的)。此外,没有什么本质上阻止实现以更精细的粒度跟踪有效性推测潜在的陈旧数据不会被更改。当然,潜在实现的这些细节对于回答问题并不是必不可少的(直到有人决定实际实现这些功能)。
    猜你喜欢
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2020-07-18
    相关资源
    最近更新 更多