假设核心 A 正在修改变量 X,而核心 B 正在读取该变量 (X)。当然在这种情况下,缓存一致性协议会更新核心 B 的缓存,因为 X 已被核心 A 修改,这种缓存一致性当然会减慢核心 B 上的执行速度。但是,这种缓存一致性也会影响核心 A 的性能吗?假设变量 X 驻留在其缓存中。
问问题
794 次
2 回答
4
是的。它可以通过多种方式影响性能。人们使用的标准协议是 MSI(修改、共享、无效)的一些变体,有时会在协议中添加 O(所有者)和通常 E(独占)。在您的示例中,核心 A 将以修改(或独占)状态开始,核心 B 的读取将强制核心 A 将其更改为共享状态。此操作会占用缓存中的周期,因为在任何给定时间内核可以执行的操作非常多。这对核心 A 的影响不是很大,因为它不在关键路径中。更大的影响是 Core A 是否再次写入。由于缓存行处于共享(或无效)状态,它必须发出请求将自身升级到 M 或 E。该请求必须转到 Core B。此操作在关键路径上,写入可以' t 完成,直到缓存块升级。也就是说,写入通常会被缓冲,并且处理器通常不会在此操作上被阻塞。
于 2012-04-07T16:53:22.817 回答
2
是的,在当今使用 ME(O)SI 一致性协议的微架构上,它也会减慢 A 的更新速度X
。这样做的原因是 B 的读取将X
在复制之前将包含缓存行的缓存线置于“共享”状态,然后 A 的写入必须使 B 的副本无效才能进入“独占”状态,然后才能再次修改它。
综上所述,A 的写入X
实际上可能不会停止 A 的执行管道。这取决于架构和编程语言的内存一致性模型,以及写入是作为原子操作还是作为后续的写入栅栏被强制退出。
于 2012-04-07T16:48:28.140 回答