Memory 缓存中的直写方案

Memory 缓存中的直写方案,memory,cpu-architecture,cpu-cache,Memory,Cpu Architecture,Cpu Cache,引用Hennessey和Patterson的话,“写操作的另一个关键方面是写操作失败时会发生什么 从内存中提取块的字。在提取块并将其放入 缓存,我们可以将导致未命中的单词覆盖到缓存块中。我们还可以 使用完整地址将单词写入主存储器。“ 我似乎不明白上面的说法。如果我们覆盖缓存中的单词,这意味着之前,地址的索引是匹配的,但标记值不同。因此,处理器暂停并命令从内存读取数据并写入缓存。这显然将替换块的先前内容(Take 1块包含1个单词)。那我们为什么还要把这个词重新写进记忆呢?我们不是刚从那里拿来的吗

引用Hennessey和Patterson的话,“写操作的另一个关键方面是写操作失败时会发生什么 从内存中提取块的字。在提取块并将其放入 缓存,我们可以将导致未命中的单词覆盖到缓存块中。我们还可以 使用完整地址将单词写入主存储器。“

我似乎不明白上面的说法。如果我们覆盖缓存中的单词,这意味着之前,地址的索引是匹配的,但标记值不同。因此,处理器暂停并命令从内存读取数据并写入缓存。这显然将替换块的先前内容(Take 1块包含1个单词)。那我们为什么还要把这个词重新写进记忆呢?我们不是刚从那里拿来的吗


有人能详细说明前一句话,以及一般的写作失误吗?写未命中是什么意思?

写未命中类似于读未命中(您要查找的条目不在缓存中),只是操作是写操作。当一个写作失误发生时,我们能做的事情很少。一种是将未命中视为读未命中,我们称之为写时提取,提取数据并修改需要更新的单词。您已经提到,如果要修改数据,那么从内存中获取数据是没有意义的。这是正确的,但缓存线由多个字组成,因此,如果后续操作是读操作,并且其目的地是所取缓存线的一个字,则获取整个缓存线是有益的。我相信主要的好处是设计的简单。如果您遵循
write allocate
的路径,将为丢失的条目分配新的缓存线,并存储新数据。现在我们必须小心,因为如果缓存线由多个字组成,比如4,那么只有一个字有正确的数据,而所有其他字都是垃圾。这需要在缓存线中维护每个字掩码,指示哪个字有效,哪个字无效

这里有一篇诺曼·p·茹皮(Norman p.Jouppi)撰写的关于书面政策的好文章。
写未命中与读未命中类似(您要查找的条目不在缓存中),只是操作是写操作。当一个写作失误发生时,我们能做的事情很少。一种是将未命中视为读未命中,我们称之为写时提取,提取数据并修改需要更新的单词。您已经提到,如果要修改数据,那么从内存中获取数据是没有意义的。这是正确的,但缓存线由多个字组成,因此,如果后续操作是读操作,并且其目的地是所取缓存线的一个字,则获取整个缓存线是有益的。我相信主要的好处是设计的简单。如果您遵循
write allocate
的路径,将为丢失的条目分配新的缓存线,并存储新数据。现在我们必须小心,因为如果缓存线由多个字组成,比如4,那么只有一个字有正确的数据,而所有其他字都是垃圾。这需要在缓存线中维护每个字掩码,指示哪个字有效,哪个字无效

这里有一篇诺曼·p·茹皮(Norman p.Jouppi)撰写的关于书面政策的好文章。

直写缓存通常仍会读取旧数据,不是吗?您可以像建议的那样保持子行粒度有效/无效信息,并避免读取,但这并不常见,不是吗?为了在多级缓存系统中保持缓存一致性,通常需要对所有权进行读取,以将行置于修改状态。直写缓存通常仍读取旧数据,不是吗?您可以像建议的那样保持子行粒度有效/无效信息,并避免读取,但这并不常见,不是吗?要在多级缓存系统中保持缓存一致性,通常需要对所有权进行读取,以将行置于修改状态。