在现代多核处理器系统中,缓存一致性协议扮演着至关重要的角色。作为ARM体系结构中的关键组成部分,CHI(Coherent Hub Interface)协议定义了一套完整的事务处理机制,用于管理处理器核心、缓存和内存控制器之间的数据交互。与传统的ACE协议相比,CHI采用了更加模块化和可扩展的设计,能够更好地适应从移动设备到数据中心服务器的各种应用场景。
CHI协议的核心价值在于它解决了多核系统中的"可见性"问题。当多个处理器核心同时访问共享数据时,如果没有适当的协调机制,就可能出现一个核心修改了数据而其他核心仍然使用旧值的情况。这种现象在专业领域被称为"缓存一致性问题",会导致程序执行结果的不确定性。
CHI协议采用了基于事务的通信模型,将系统组件划分为三种逻辑角色:
这种分层架构使得CHI协议能够高效地处理大规模系统中的缓存一致性需求。协议通过定义精确的事务类型和响应机制,确保所有参与组件对内存状态有一致的视图。
在深入CHI协议细节前,我们需要明确几个关键术语:
CHI协议的独特之处在于它采用了基于目录(Directory-based)和监听(Snooping)相结合的混合机制,能够在保持可扩展性的同时减少总线流量。这种设计特别适合现代多核SoC架构,其中可能包含数十甚至上百个处理器核心。
CHI协议定义了一套丰富的事务类型,每种类型都有特定的语义和使用场景。理解这些事务类型对于正确实现和使用CHI协议至关重要。
根据功能特性,CHI事务可以分为以下几大类:
这类事务不触发监听操作,适用于已知不会被多个核心共享的数据访问。典型例子包括:
这类事务会触发监听操作,确保所有缓存副本的一致性。包括:
用于将修改过的缓存行写回内存,包括:
提供原子内存操作支持,如:
CHI协议通过精细的内存属性控制,实现了对事务行为的灵活管理。其中两个关键属性是:
MemAttr定义了内存区域的基本特性,包括:
SnpAttr控制事务的监听行为:
在DVM(Distributed Virtual Memory)操作中,SnpAttr位被重新用作域标识符(Domain Identifier),这是CHI协议的一个巧妙设计,实现了多域环境下的高效内存管理。
关键提示:对于从Home到Subordinate的Write和Combined Write事务,SnpAttr字段的位置被重新用于DoDWT(Data-over-DWT)字段。这种字段复用设计减少了协议开销,但实现时需要特别注意。
在实际系统中,不同组件可能以不同的内存属性访问同一内存位置。CHI协议定义了一套完善的机制来处理这种不匹配情况,确保系统不会死锁且事务能够持续向前推进。
在某些设计场景中,不匹配的内存属性是预期的。例如,当RN-F(全一致性请求节点)的Nonshareable_Cache_Maint属性设置为True时,它必须将所有MemAttr.Cacheable设置为1的访问升级为SnpAttr=1。这种升级可能需要更新请求操作码:
当不同代理使用不匹配的监听性或缓存性属性进行内存访问时,可能产生软件协议错误。这类错误会导致一致性丢失和数据值损坏。CHI协议要求:
当RN-F收到对被认为是非监听位置的监听时,它必须:
这种保守的策略确保了即使存在属性不匹配,系统也能保持安全状态。
CAH是CHI协议中一项重要的优化特性,它通过减少冗余数据传输显著提高了系统性能,特别是在具有复杂缓存层次结构的系统中。
CAH是一个缓存行属性,用于指示Home节点是否保留了该行的副本。这个信息被用于优化回写操作:
Home节点在CompData或DataSepResp响应中设置CAH属性:
当Home收到CopyBack Write请求时,它会检查CAH属性以确定事务流程:
如果CAH=1且Home仍有该行副本:
如果CAH=0:
这种机制可以节省高达50%的回写带宽,对于写密集型工作负载尤为重要。
请求节点对CAH属性的处理遵循以下规则:
CHI协议定义了精细的数据传输规则和原子操作支持,确保各种内存访问场景下的正确性和效率。
CHI支持从1字节到64字节的数据传输,通过Size字段编码:
| Size[2:0] | 字节数 |
|---|---|
| 0b000 | 1 |
| 0b001 | 2 |
| 0b010 | 4 |
| 0b011 | 8 |
| 0b100 | 16 |
| 0b101 | 32 |
| 0b110 | 64 |
| 0b111 | 保留 |
对于普通内存(Normal memory),访问的字节范围从Aligned_Address到(Aligned_Address + Number_Bytes) - 1,其中:
code复制Start_Address = Addr字段值
Number_Bytes = 2^Size字段值
Aligned_Address = (INT(Start_Address / Number_Bytes)) × Number_Bytes
对于设备内存(Device memory),访问从Start_Address到(Aligned_Address + Number_Bytes) - 1。
BE位用于控制写入事务中哪些字节实际被更新:
在CopyBackWriteData_I和WriteDataCancel包中,所有BE值必须设为0。
CHI协议支持多种原子操作,每种都有特定的数据大小和对齐要求:
| 原子事务 | 出站(字节) | 入站 |
|---|---|---|
| AtomicStore | 1,2,4,8 | - |
| AtomicLoad | 1,2,4,8 | 同出站 |
| AtomicSwap | 1,2,4,8 | 同出站 |
| AtomicCompare | 2,4,8,16,32 | 出站的一半 |
对于AtomicCompare事务,比较和交换数据值在数据字段中连接,并对齐到出站数据大小。比较数据始终位于寻址字节位置,交换数据始终位于有效数据的剩余部分。
在实际系统设计中,CHI协议的实现需要考虑多种因素以达到最佳性能和正确性。
这项可选特性可以减少DAT通道上传输的数据包数量,适用于以下情况:
通过NumDat字段指示省略的数据包数量,Replicate字段指示其字段值:
这种优化对于零数据或重复数据模式常见的工作负载(如内存初始化、特定计算模式)可以显著减少总线流量。
实现缓存维护操作时需要特别注意:
对于软件协议错误,建议实现以下保护措施:
在大规模数据中心应用中,CAH机制可以显著减少处理器节点与内存控制器之间的数据传输。例如,在一个典型的键值存储工作负载中:
对于实时系统,不匹配内存属性的处理尤为关键:
现代多核处理器设计中,CHI协议的正确实现面临诸多挑战:
在实现中我们发现,对CAH属性的合理预测和预取可以进一步提升性能。例如,对于顺序访问模式,可以预先将后续缓存行的CAH设为1,减少后续回写的延迟。