缓存一致性关注的是同一个数据在多个高速缓存和内存之间的一致性。对于系统级别的缓存一致性,即CPU簇与簇之间、CPU和GPU之间的缓存一致性,可以通过CCI、CCN等控制器实现,不过如果没有这些控制器,则需要软件实现。我们重点关注CPU簇之内缓存一致性的实现。

通过MESI协议可以解决同簇多核CPU的高速缓存一致性问题。其实现方式基于,多核处理器系统中,cache维护指令会通过总线广播机制发给所有CPU内核。只有当本CPU收到其他CPU内核的所有广播应答信号后,才会对cache line进行读写操作。

MESI协议规定每个cache line的状态为:修改M、独占E、共享S、无效I 4个状态中的一个。通过cache line上的标志——脏、有效和共享3位组合可以表示这4个状态。每个cache都会监听其他高速缓存的总线活动,从而实现缓存一致性。

  • 高速缓存伪共享

若多个处理器反复读写一个cache line上的不同数据,例如数组中两个相邻的元素,那么根据MESI协议会不断地使对方的cache line失效,不断地将数据写入内存,导致性能大大下降,这种现象叫做高速缓存伪共享。

解决办法:让多线程操作的数据处在不同的高速缓存行,这可以通过cache line对齐和填充实现。