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

gke*_*nel 4 architecture caching

具有回写高速缓存的高速缓存,对高速缓冲存储器执行写操作并立即返回.仅当数据已存在于缓存中时才会这样.如果数据不存在于高速缓存中,则首先从较低存储器中取出数据,然后将其写入高速缓存中.

我不明白为什么在写入之前首先从内存中获取数据很重要.如果要写入数据,则无论如何都将变为无效.

我确实知道基本概念,但想知道在写入地址之前必须读取数据的原因.

我有以下猜测,

这是针对多处理器环境中的Cache Coherency完成的.其他处理器窥探总线以保持Cache Coherency.写入地址的处理器需要获得独占访问权限,其他处理器必须了解这一点.但是,这是否意味着,单处理器计算机不需要这样做?

谢谢

chu*_*hus 5

简短的回答

高速缓存中未命中的写入可能会也可能不会取出正在写入的块,具体取决于高速缓存的写入未命中策略(写入时取指错误写入时取消取消).它不依赖于写入命中策略(直写).

说明

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

-----     ------     -------------
|CPU| <-> | L1 | <-> |main memory|
-----     ------     -------------
Run Code Online (Sandbox Code Playgroud)

L1写策略是fetch-on-write-miss.

缓存存储数据.典型的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