CacheCoherency产生的原因是在一个处理器系统中,不同的Cache和Memory可能具有同一个数据的多个副本,在仅有一个数据副本的处理器系统中不存在Coherency问题。维护Cache Coherency的关键在于跟踪每一个Cache Block的状态,并根据CPU Core的读写操作及总线上的相应Transaction,更新Cache Block的状态,借此维护Cache Coherency。Cache Coherency可以使用软件或者硬件方式保证。
在使用软件方式维护时,CPU需要提供专门的显式操作Cache的指令,包括Cache Block Copy,Move,Eviction和Invalidate等指令,多数微架构都提供了这样的指令,如PowerPC处理器设置的dcbt,dcbf,dcba等指令[43]。
程序员可以使用这些指令,维护处理器系统的Cache Coherency。在进行DMA操作之前,可以将数据区域与主存储器通过软件指令保证Cache Coherency,进行DMA操作时,不需要硬件来维护Cache Coherency。在某种情况下,使用这种方式可以提高数据传送效率。
软件维护CacheCoherency的优点是硬件开销小,缺点在多数情况下对性能有较大影响,而且需要程序员的介入。多数情况下Cache Coherency由硬件维护。不同的处理器使用不同的Cache Coherency Protocol实现Cache Coherency。这些Protocol维护一个有限状态机FSM(Finite State Machine),根据存储器读写指令或者Bus Transaction,进行状态迁移和相应的Cache Block操作,隐式保证Cache Coherency,不需要程序员的介入。
根据Cache CoherencyProtocol维护Cache Block状态方法的不同,处理器可以使用Bus Snooping和Directory这两大类机制。这两类机制的主要区别在于Directory机制全局统一管理不同Cache的状态;而在Bus Snooping机制中,每个Cache分别管理自身Cache Block的状态,并通过Interconnection进行不同Cache间的状态同步。
无论采用哪种机制,CoherencyProtocol所要求的Cache Block操作都可以通过Invalidate,Update或者Read Snarfing策略完成。Update和Read Snarfing策略需要更多的总线操作,对带宽和延迟都有很大影响,多数Cache Coherency Protocol采用了Invalidate策略。
最为经典的总线监听协议Write-Once[60]由James Goodman于1983年提出,是在x86,ARM和Power处理器中大行其道的MESI Protocol(也叫Illinois Protocol)的前身和一种变体,或者说是一种具体实现。
Write-OnceProtocol的实现关键在于其使用的特殊的Cache回写机制,即Write Once。Write-Once是Write-Back和Write-Through的综合。当使用这种机制时,对一个Cache Block进行第一次回写时,采用Write-Through策略将数据同时回写到Cache和主存储器,之后的写操作采用Write-Back,只回写到Cache而不回写到主存储器。
这种设计有利于在带宽和CoherencyProtocol的复杂度之间取得均衡。Write-Back机制能够有效节约带宽,但是由于主存储器中并没有最新的数据副本,增加了维护Cache Coherency的开销。Write-Through则相反。有关Write-Back和Write-Through的详细信息可以继续阅读本篇的后续章节。
通过之前的描述可以发现,在任何一种CacheCoherency Protocol中,每个Cache Block都有自己的一个状态字段。而维护Cache Coherency的关键在于维护每个Cache Block的状态域。Cache Controller通常使用一个状态机来维护这些状态域。
使用Write-Once回写机制实现Cache Coherency时,每一个CPU Core中的Cache Block需要设置4个状态位,用以识别当前Cache Block的状态,处于这些状态的Cache Block在收到不同的输入后,将进行状态迁移,以保证Cache Coherency。
- Invalid