【问题标题】:MSI: Why do we need to write the line back when other CPU is going to override it?MSI:当其他 CPU 将要覆盖它时,为什么我们需要写回该行?
【发布时间】:2014-01-17 19:45:27
【问题描述】:

在 Hennessy/Patterson 第 5 版第 360 页的“计算机体系结构”一书中,他们描述了 MSI 协议,并写了如下内容:

如果线路处于“独占”状态(已修改),则在从总线接收到“Write Miss”时,当前 CPU 1) 将线路写回总线,然后 2) 进入“无效”状态。

如果它会被其他 CPU 的连续写入覆盖,为什么我们需要回写该行?

这是否与每个 CPU 应该看到相同的写入有关? (但我不明白为什么看不到其他 CPU 的这个特定写入是个问题)

这是他们书中的协议(绿色的问题,紫色的很清楚:我们需要回写以便向请求 CPU 提供线路):

【问题讨论】:

    标签: cpu-architecture cpu-cache


    【解决方案1】:

    在 MSI 协议中,将修改后的数据写回内存并不是绝对必要的。状态图似乎还假设系统具有低成本的内存访问(即使在另一个缓存中发现处于共享状态时,数据也由内存提供)和连接到内存接口的共享总线。

    但是,修改后的数据不能像共享状态那样简单地被删除,因为请求的处理器可能只修改缓存块的一部分(例如,只有一个字节)。块中未被请求处理器修改的任何部分都必须在内存中或在请求处理器处仍然可用(其他处理器已经使其副本无效)。使用共享总线和低成本内存访问,添加回写到内存与仅将数据通信到其他处理器的成本差异很小。

    此外,即使在具有字大小缓存块的字寻址系统上,保持旧数据可用也可以推测性地发送写未命中请求(如乱序执行或预取写)没有正确性问题。

    (对已修改[或作为已修改超集的有效]状态的每字节跟踪将允许以额外的状态位和更复杂的通信系统为代价来避免某些数据通信。)

    【讨论】:

    • 太棒了。这不是书上写的。谢谢!请注意:“即使在另一个缓存中的共享状态中找到数据,数据也是由内存提供的”——这种情况下的图表不清楚。但是在书中他们有一个table 并在那里:if ReadMiss on the bus and state is Shared/Modified then _attempt to _share data: place cache block on bus——看起来数据是由缓存提供的,而不是由内存提供的。
    • @Ayrat 教科书作者必须在准确性和完整性与易于沟通和简单性(以及上市时间)之间进行权衡,因此省略一些信息是正常的。可悲的是,一些简化可能会使理解更加变得困难。 (顺便说一句,对于一些基于目录的一致性系统,source-from-memory 可能是可取的,特别是当目录与内存中的数据共存时,内存访问是免费的。这样可以将跳数 [延迟] 减少到请求者并减少对互连带宽的使用。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2021-10-20
    • 2019-06-09
    • 1970-01-01
    • 2020-02-04
    • 2022-01-07
    • 2011-12-12
    相关资源
    最近更新 更多