MESI-当读取当前正在修改的数据时会发生什么?

时间:2015-09-06 14:53:19

标签: cpu-architecture mesi

如果我有一个缓存行数据并且第一个字节被原子修改,我是否仍然可以同时从该缓存行读取不同字节的数据?或者我试图阅读有关原子更新的信息并等待它?

我试图了解上述场景的性能影响。

1 个答案:

答案 0 :(得分:2)

高速缓存一致性保持在线粒度上,如今在大多数CPU中通常为64B。 执行修改的核心将首先请求拥有整条生产线,这意味着所有其他核心必须使其副本无效(如果有的话)。尝试读取的任何其他核心都必须请求该行,这将导致监听被发送到修改核心。从那里你有两个选择:

  1. 修改核心完成了读取 - 修改 - 写入序列,并且该行在其缓存中包含最新修改的数据 - 在这种情况下,snoop将启动WB序列,更新后的行将可用于所有,第二个核心可以从中读取任何字节。

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

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

相关问题