对于写回缓存策略,为什么在写入缓存之前应该先从内存中读取数据?

4
具有写回缓存的高速缓存会将写操作执行到高速缓存中并立即返回。这仅在数据已经存在于高速缓存中时才发生。如果数据不在高速缓存中,则首先从较低的内存中获取数据,然后将其写入高速缓存。
我不明白为什么在写入数据之前必须先从内存中读取数据。如果数据要被写入,那么无论如何它都将变得无效。
我了解基本概念,但想知道在写入地址之前必须读取数据的原因。
我有以下猜测,
这是为了在多处理器环境下维护高速缓存一致性。其他处理器通过总线窥视来维护高速缓存一致性。写入地址的处理器需要获得独占访问权,其他处理器必须了解此情况。 但是,这是否意味着单处理器计算机上不需要这样做?

请参阅为什么在写分配高速缓存策略中从主内存获取数据 - 在修改之前获取独占所有权的读取对于MESI一致性也很重要。此外,还有MESI协议。写入高速缓存未命中。为什么需要获取主内存值? - Peter Cordes
2个回答

6

简短回答

缓存中的写入未命中可能会根据缓存的写入未命中策略(读取写入未命中 vs. 不读取写入未命中)来获取或不获取正在被写入的块。这与缓存的写入命中策略(写回 vs. 写直通)无关。

解释

为了简化,让我们假设我们有一个一级缓存层次结构:

-----     ------     -------------
|CPU| <-> | L1 | <-> |main memory|
-----     ------     -------------

L1写入策略为在未命中时进行获取。

缓存存储数据的块。典型的L1块宽度为32字节,即包含多个字(例如,8个4字节字)。

缓存与主内存之间的传输单位是一个块,但CPU和缓存之间的传输可以是不同大小(1、2、4或8字节)。

假设CPU执行4字节的单词写入。

  1. 如果包含该单词的块未存储在缓存中,则发生缓存未命中。整个块(32字节)从主内存传输到缓存中,然后相应的单词(4字节)存储在缓存中。

    1. 回写缓存将把该块标记为脏(而不是无效,如您所述)。
    2. 直写缓存将更新的单词发送到主内存。
  2. 如果包含该单词的块存储在缓存中,则发生缓存命中。相应的单词将被更新。

更多信息:缓存写入策略与性能。Norman P. Jouppi。 http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-91-12.pdf

1

您的猜测几乎正确。然而,在多核单处理器系统中也必须执行此操作。

您的处理器可能具有多个核心,因此在写入缓存行(在WB缓存中)时,发出写入请求的核心需要独占访问该行。如果要写入的行被标记为脏行,则会在写入新信息之前将其“刷新”到较低层次的内存中。

在多核CPU中,每个核心都有自己的L1缓存,并且每个核心都可以存储共享L2线路的副本。因此,您需要进行这种缓存一致性的实现。

您应该通过阅读MESI协议及其派生来了解更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接