假设核心A正在修改变量X而核心B正在读取该变量(X)。当然,在这种情况下,高速缓存一致性协议将更新核心B的高速缓存,因为X已被核心A修改,并且当然这种高速缓存一致性将减慢核心B上的执行。但是,这种高速缓存一致性是否也会影响核心A的性能,假设变量X驻留在其缓存中。
答案 0 :(得分:3)
是。有几种方法可以影响性能。人们使用的标准协议是MSI的一些变体(已修改,共享,无效),有时会使用O(所有者)并且通常将E(独占)添加到协议中。在您的示例中,核心A将以修改(或独占)状态启动,核心B的读取将强制核心A将其更改为共享状态。此操作占用缓存中的周期,因为核心可以在任何给定时间执行的操作非常多。虽然它不在关键路径中,但这对核心A的影响并不是很高。更大的影响是,如果核心A再次写入。由于高速缓存行处于共享(或无效)状态,因此它必须发出将其自身升级到M或E的请求。该请求必须转到核心B.此操作在关键路径上,并且写入无法完成,直到缓存块已升级。也就是说,写入通常是缓冲的,处理器通常不会在此操作中被阻止。
答案 1 :(得分:2)
是的,在目前使用ME(O)SI一致性协议的微体系结构中,它也会减慢A对X
的更新速度。这样做的原因是B的读取会在复制之前将包含X
的缓存行置于'共享'状态,然后A的写入必须使B的副本无效才能进入'独占'状态才能修改再一次。
所有人都说,A写给X
可能实际上并没有阻止A的执行管道。这取决于体系结构和编程语言的内存一致性模型,以及写入是作为原子操作还是后续写入围栏强制执行。