MSI / MESI:如何在共享状态下获得“读缺失”?

问题描述 投票:7回答:2

在Jim Handy的Cache Memory Book(以下是摘录)中,作者具有MESI协议的表说明。该表对我来说似乎很不清楚,很遗憾,该文本无济于事。

第一个问题(图片上的绿色):

Is this right? -- a data block is in the cache of a CPU,
and it is in the shared state, but when the CPU reads it, 
the CPU gets read miss. 
How is this possible?

第二个问题(紫色):

Who and when create all these messages "Read miss", etc.?
(afaik, the system bus just translates messages of others) 

最后,第三个问题(图片上没有):

Do all these cache coherency protocols 
(MSI,MESI,MOESI,Firefly,Dragon...)
maintain sequential consistency memory model?
Are there protocols that maintain other consistency models?

“

cpu-architecture cpu-cache
2个回答
5
投票

对于第一个问题,虽然缓存中有一个数据块(处于共享状态),但它是错误的块(即,标记不匹配),因此存在缓存未命中。如果发生高速缓存未命中,如果高速缓存处于修改状态,则仍然需要将数据写回内存。

对于第二个问题,每个总线都向高速缓存提供地址和请求信息(读或写);系统总线从远程处理器提供此功能。命中或未命中是提供的地址是否是缓存中的命中。系统总线上的请求由远程处理器的缓存过滤。

在处理器1(P1)读取时,如果P1的高速缓存命中,则无需将信号发送到系统总线。在P1的写操作中,如果P1的高速缓存具有命中并且状态为独占或已修改,则无需将任何信号发送到系统总线,但是如果P1的高速缓存中的状态是共享的,则另一个(P0)高速缓存必须告诉(通过系统总线)P1正在执行写操作,并且P0高速缓存中该地址的任何条目都必须无效。

((请注意,“共享”状态不一定意味着该内存块存在于某些其他缓存中。大多数基于监听的协议都允许在共享状态下静默[无系统总线通信]丢弃缓存块。]

(顺便说一下,这本书给出的MESI协议有点不寻常。更常见的是,通过未找到该块没有其他缓存的读取未命中进入互斥状态[这允许静默更新到稍后写入],并且对于处于共享状态的匹配,写入时不要使用写入存储器。)

对于第三个问题,缓存coherence协议仅解决一致性而不是一致性。硬件提供的一致性模型确定可以按顺序(以软件可见的方式)缓冲和完成哪些活动。例如,如果写入未命中不强制所有后续读取命中等待直到所有远程缓存均已看到写入通知,但这会提高顺序性能。

这里是一个示例,说明顺序一致性如何防止写缓冲:

P0在位置B读取“ B_old”(高速缓存命中),将“ A_new”写入位置A(高速缓存未命中,然后读取位置B。

P1在位置A(高速缓存命中)上读取“ A_old”,在位置B(高速缓存未命中)上写入“ B_new”,然后读取位置A。

[如果缓冲写操作并且允许进行读操作而无需等待其他高速缓存识别之前的写操作,则P0对B的第二次读操作可以读为“ B_old”(因为它仍然是高速缓存命中)< P1对A的第二次读取可以读取“ A_old”(因为尚未看到P0的写入)。无法构造这些内存访问的顺序,因此会违反顺序一致性。

但是,如果P0对B的第二次读取一直等到P1识别出P0对A的写入,并且P1对A的第二次读取等到P0对P1的对B的写入被识别,则可以进行顺序排序。

如果P1在将P0写入A之前看到了P0对A的写入,那么可以进行顺序排序,包括:

    P0.read“ B_old”,P1.read“ A_old”,P0.write“ A_new”,P1.write“ B_new”,P0.read“ B_new”,P1.read“ A_new”
  • P0.read“ B_old”,P1.read“ A_old”,P0.write“ A_new”,P0.read“ B_old”,P1.write“ B_new”,P1.read“ A_new”
  • 请注意,硬件可以推测未违反订购要求,并重新排列存储器访问的完成顺序;但是,它需要能够处理错误的推测(例如,通过还原到检查点)。 (有关此问题的经典早期文章是“ SC + ILP = RC吗?” [PDF]。)

  • 1
    投票
    在高速缓存行和主内存块之间存在一对多映射。共享的缓存行可能不是您的程序正在寻找的内存块。实际发生的是程序需要的内存块和存在于高速缓存中的内存块尽管不同,但具有相同的高速缓存行索引。连续的内存块被映射到连续的高速缓存行,直到高速缓存行结束,随后的内存块被映射到从第一条高速缓存行开始的高速缓存行。

    我在这里找到了直观的解释:https://medium.com/breaktheloop/direct-mapping-map-cache-and-main-memory-d5e4c1cbf73e

    © www.soinside.com 2019 - 2024. All rights reserved.