在这种情况下,缓存一致性如何影响性能

pyt*_*nic 6 c multithreading multicore x86-64 multiprocessing

假设核心A正在修改变量X而核心B正在读取该变量(X).当然,在这种情况下,高速缓存一致性协议将更新核心B的高速缓存,因为X已被核心A修改,并且当然这种高速缓存一致性将减慢核心B上的执行.但是,这种高速缓存一致性是否也会影响核心A的性能,假设变量X驻留在其缓存中.

Nat*_*ert 4

是的。它可以通过多种方式影响性能。人们使用的标准协议是 MSI(修改、共享、无效)的某些变体,有时会在协议中添加 O(所有者)和 E(独占)。在您的示例中,核心 A 将以修改(或独占)状态启动,而核心 B 的读取将强制核心 A 将其更改为共享状态。此操作会占用缓存中的周期,因为内核在任何给定时间只能执行这么多操作。不过,这对核心 A 的影响不是很大,因为它不在关键路径中。更大的影响是核心 A 是否再次写入。由于缓存行处于共享(或无效)状态,因此它必须发出将自身升级到 M 或 E 的请求。该请求必须发送到 Core B。此操作位于关键路径上,写入无法完成,直到缓存块已升级。也就是说,写入通常会被缓冲,并且处理器通常不会在此操作上被阻止。

  • 如果核心 a 所做的大部分工作是写入,而核心 b 所做的大部分工作是读取,那么是的,您可能会遇到问题。这通常称为乒乓球。您想进行什么样的沟通?关于这方面的论文有很多。例如,如果您在核心 A 上生成某些内容并希望在核心 B 上使用它,那么您应该使用可缓存的无锁队列数据结构,以尽可能避免乒乓操作。(它应该有像影子头和影子尾这样的概念。) (2认同)