再次回顾与CacheCoherency相关的MOESIF状态位,却不知从何说起。MOESIF这些状态位似曾相识,已物是人非。在CMP处理器系统中使用的多级Cache层次结构和CMP间的Cache Coherency,改变了MOEIF这些状态位的原始形态。
在一个由多个CMP组成的ccNUMA处理器系统中,Cache Coherency包含两方面内容,首先是Intra-CMP Coherence,其次是Inter-CMP Coherence。其中Intra-CMP Coherence指一个CMP内部的Cache Coherency,而Inter-CMP Coherence指CMP间的Cache Coherency,两者之间的关系如图4‑8所示。
在一个ccNUMA处理器系统中,Intra-CMP Coherence需要与Inter-CMP Coherence协调工作,完成Cache的全局Coherency。不同的CMP处理器采用了不同的Intra-CMP Coherence策略,可以是Share Bus,Ring Bus或者Directory,这些策略各有利弊。Inter-CMP Coherence甚至可以通过软件交换Message的方式实现,而为了提高软件的Programmability,多数系统使用了硬件实现这些Message交换。在一个ccNUMA处理器系统中使用的CMP超过4个时,多使用Directory结构。
在串行总线替代并行总线的大趋势下,ccNUMA处理器的数据以及Coherence Message通过Packet的方式进行传递,会涉及在Internet中出现的Router,NI(Networking Interface),Flow Control,QoS,Routing Algorithm等概念。在ccNUMA处理器系统中使用的Interconnection不但不比Internet简单而且复杂得多。K Computer使用的6D Mesh/Torus Interconnect[92]结构目前尚无用于Internet的可能。
Supercomputer使用的Interconnect超出了本篇的讨论范围,但是仅从Cache的Coherency层面进行分析,Inter-CMP Coherence的设计没有难于Intra-CMP Coherence,Cache Coherency依然是越接近CPU Core越复杂,Cache间的互联总线也是越接近CPU Core越复杂。这是本节重点介绍Intra-CMP Coherence的主要原因。
Intra-CMPCoherence的复杂程度超过了初学者的想象。其中各级Cache之间的关系,及为了处理这些关系而使用的Cache Block状态和总线协议均较为复杂。仅是其中使用的Cache Coherency Protocol也复杂到了需要使用专门的语言才能将其简约地进行描述。这个语言即SLICC(Specification Language for Implementing CacheCoherence),这个语言是有志于深入了解Cache Coherency Protocol所需要了解的基础知识。
对于多数人而言,学习CacheCoherency Protocol最好的工具是Simulator和使用SLICC语言书写的这些源代码。虽然在模拟舱中很难学会开飞机,但是如果连模拟舱都没有呆过,很难有人让你开真飞机。学术领域提供了这样的模拟舱学习Cache Coherency Protocol。
与CMP处理器相关的模拟器主要有SESC,Simics,M5和GEMS。Simics最初由Virtutech开发。当时的Virtutech和飞思卡尔在多核处理器上进行了一些合作,虽然Simics是商业产品,我们当时却有机会获得无需付费的License。如获至宝。Intel后来收购了Virtutech。
M5和GEMS主要用于教学与科研,是一个免费而且代码公开的模拟器。M5侧重CPU Model,ISAs等方面;GEMS最重要的组成部件是Cache Coherency Protocol和Ruby Memory Hierarchy。M5和GEMS具有很强的互补性,也正是因为这个原因,这两个Simulator逐步融合为GEM5 Simulator[93]。
GEM5是我目光所及范围内,由脚本语言书写的最复杂的系统。GEM5吸纳了M5和GEMS的主要优点,支持Alpha,ARM,SPARC和x86处理器,支持Functional和Timing Simulation,提供FS(Full-System)和SE(Syscall Emulation)两种方式。即便是Android这样复杂的系统也可以运行在GEM5 Simulator之上。在GEM5 Simulator中包含许多内容,本节重点关注使用SLICC语言实现的Cache Coherence Protocol。
GEM5Simulator的源代码可在http://www.gem5.org/Download中下载。在这些源代码中,我们重点关注./src/mem/protocol目录。这个目录包含GEM5支持的所有Cache Coherence Protocol,包括MI_example,MOESI_hammer,MOESI_CMP_token,MOESI_CMP_directory和MESI_CMP_directory,由.slicc和.sm两类文件组成。其中xyz.slicc文件包含实现xyz protocol所需要的所有.sm文件,而在.sm文件中包含各级Cache Controller的具体实现。
在每一个.sm文件中,首先包含一个machine(L1Cache, "MSI Directory L1 CacheCMP"),