天天看点

3.3.1 Cache一致性的基本概念

pci设备对可cache的存储器空间进行dma读写的操作的过程较为复杂,有关cache一致性的话题可以独立成书。而不同的处理器系统使用的cache memory的层次结构和访问机制有较大的差异,这部分内容也是现代处理器系统设计的重中之重。

本节仅介绍在cache memory系统中与pci设备进行dma操作相关的,一些最为基础的概念。在多数处理器系统中,使用了以下概念描述cache一致性的实现过程。

多数smp处理器系统使用了mesi协议处理多个处理器之间的cache一致性。该协议也被称为illinois protocol,mesi协议在smp处理器系统中得到了广泛的应用。mesi协议使用四个状态位描述每一个cache行。

 m(modified)位。m 位为1 时表示当前cache 行中包含的数据与存储器中的数据不一致,而且它仅在本cpu的cache 中有效,不在其他cpu的cache 中存在拷贝,在这个cache行的数据是当前处理器系统中最新的数据拷贝。当cpu对这个cache行进行替换操作时,必然会引发系统总线的写周期,将cache行中数据与内存中的数据同步。

 e(exclusive)位。e 位为1 时表示当前cache行中包含的数据有效,而且该数据仅在当前cpu的cache中有效,而不在其他cpu的cache中存在拷贝。在该cache行中的数据是当前处理器系统中最新的数据拷贝,而且与存储器中的数据一致。

 s(shared)位。s 位为1 表示cache行中包含的数据有效,而且在当前cpu和至少在其他一个cpu中具有副本。在该cache行中的数据是当前处理器系统中最新的数据拷贝,而且与存储器中的数据一致。

i(invalid)位。i 位为1 表示当前cache 行中没有有效数据或者该cache行没有使能。mesi协议在进行cache行替换时,将优先使用i位为1的cache行。

mesi协议还存在一些变种,如moesi协议和mesif协议。基于moesi协议的cache一致性模型如图3?5所示,该模型基于amd处理器使用的moesi协议。不同的处理器在实现moesi协议时,状态机的转换原理类似,但是在处理上仍有细微区别。

<a target="_blank" href="http://photo.blog.sina.com.cn/showpic.html#blogid=6472c4cc0100qxcd&amp;url=http://s4.sinaimg.cn/orignal/6472c4ccga3729112ca33"></a>

moesi协议引入了一个o(owned)状态,并在mesi协议的基础上,进行了重新定义了s状态,而e、m和i状态和mesi协议的对应状态相同。

 o位。o位为1表示在当前cache 行中包含的数据是当前处理器系统最新的数据拷贝,而且在其他cpu中一定具有该cache行的副本,其他cpu的cache行状态为s。如果主存储器的数据在多个cpu的cache中都具有副本时,有且仅有一个cpu的cache行状态为o,其他cpu的cache行状态只能为s。与mesi协议中的s状态不同,状态为o的cache行中的数据与存储器中的数据并不一致。

 s位。在moesi协议中,s状态的定义发生了细微的变化。当一个cache行状态为s时,其包含的数据并不一定与存储器一致。如果在其他cpu的cache中不存在状态为o的副本时,该cache行中的数据与存储器一致;如果在其他cpu的cache中存在状态为o的副本时,cache行中的数据与存储器不一致。

在一个处理器系统中,主设备(cpu或者外部设备)进行存储器访问时,将试图从存储器系统(主存储器或者其他cpu的cache)中获得最新的数据拷贝。如果该主设备访问的数据没有在本地命中时,将从其他cpu的cache中获取数据,如果这些数据仍然没有在其他cpu的cache中命中,主存储器将提供数据。外设设备进行存储器访问时,也需要进行cache共享一致性。

在moesi模型中,“probe read”表示主设备从其他cpu中获取数据拷贝的目的是为了读取数据;而“probe write”表示主设备从其他cpu中获取数据拷贝的目的是为了写入数据;“read hit”和“write hit”表示主设备在本地cache中获得数据副本;“read miss”和“write miss”表示主设备没有在本地cache中获得数据副本;“probe read hit”和“probe write hit”表示主设备在其他cpu的cache中获得数据副本。

本节为简便起见,仅介绍cpu进行存储器写和与o状态相关的cache行状态迁移,cpu进行存储器读的情况相对较为简单,请读者自行分析这个过程。

当cpu对一段存储器进行写操作时,如果这些数据在本地cache中命中时,其状态可能为e、s、m或者o。

 状态为e或者m时,数据将直接写入到cache中,并将状态改为m。

 状态为s时,数据将直接写入到cache中,并将状态改为m,同时其他cpu保存该数据副本的cache行状态将从s或者o迁移到i(probe write hit)。

 状态为o时,数据将直接写入到cache中,并将状态改为m,同时其他cpu保存该数据副本的cache行状态将从s迁移到i(probe write hit)。

当cpu a对一段存储器进行写操作时,如果这些数据没有在本地cache中命中时,而在其他cpu,如cpu b的cache中命中时,其状态可能为e、s、m或者o。其中cpu a使用cpu b在同一个cache共享域中。

 cache行状态为e时,cpu b将该cache行状态改为i;而cpu a将从本地申请一新的个cache行,将数据写入,并该cache行状态更新为m。

 cache行状态为s时,cpu b将该cache行状态改为i,而且具有同样副本的其他cpu的cache行也需要将状态改为i;而cpu a将从本地申请一个cache行,将数据写入,并该cache行状态更新为m。

 cache行状态为m时,cpu b将原cache行中的数据回写到主存储器,并将该cache行状态改为i;而cpu a将从本地申请一个cache行,将数据写入,并该cache行状态更新为m。

 cache行状态为o时,cpu b将原cache行中的数据回写到主存储器,并将该cache行状态改为i,具有同样数据副本的其他cpu的cache行也需要将状态从s更改为i;cpu a将从本地申请一个cache行,将数据写入,并该cache行状态更新为m。

cache行状态可以从m迁移到o。例如当cpu a读取的数据从cpu b中命中时,如果在cpu b中cache行的状态为m时,将迁移到o,同时cpu b将数据传送给cpu a新申请的cache行中,而且cpu a的cache行状态将被更改为s。

当cpu读取的数据在本地cache中命中,而且cache行状态为o时,数据将从本地cache获得,并不会改变cache行状态。如果cpu a读取的数据在其他cache中命中,如在cpu b的cache中命中而且其状态为o时,cpu b将该cache行状态保持为o,同时cpu b将数据传送给cpu a新申请的cache行中,而且cpu a的cache行状态将被更改为s。

在某些应用场合,使用moesi协议将极大提高cache的利用率,因为该协议引入了o状态,从而在发送read hit的情况时,不必将状态为m的cache回写到主存储器,而是直接从一个cpu的cache将数据传递到另外一个cpu。目前moesi协议在amd和rmi公司的处理器中得到了广泛的应用。

intel提出了另外一种mesi协议的变种,即mesif协议,该协议与moesi协议有较大的不同,也远比moesi协议复杂,该协议由intel的qpi(quickpath interconnect)技术引入,其主要目的是解决“基于点到点的全互连处理器系统”的cache共享一致性问题,而不是“基于共享总线的处理器系统”的cache共享一致性问题。

在基于点到点互连的numa(non-uniform memroy architecture)处理器系统中,包含多个子处理器系统,这些子处理器系统由多个cpu组成。如果这个处理器系统需要进行全机cache共享一致性,该处理器系统也被称为ccnuma(cache cohenrent numa)处理器系统。mesif协议主要解决ccnuma处理器结构的cache共享一致性问题,这种结构通常使用目录表,而不使用总线监听处理cache的共享一致性。

mesif协议引入了一个f(forware)状态。在ccnuma处理器系统中,可能在多个处理器的cache中存在相同的数据副本,在这些数据副本中,只有一个cache行的状态为f,其他cache行的状态都为s。cache行的状态位为f时,cache中的数据与存储器一致。

当一个数据请求方读取这个数据副本时,只有状态为f的cache行,可以将数据副本转发给数据请求方,而状态位为s的cache不能转发数据副本。从而mesif协议有效解决了在ccnuma处理器结构中,所有状态位为s的cache同时转发数据副本给数据请求方,而造成的数据拥塞。

在ccnuma处理器系统中,如果状态位为f的数据副本,被其他cpu拷贝时,f状态位将会被迁移,新建的数据副本的状态位将为f,而老的数据副本的状态位将改变为s。当状态位为f的cache行被改写后,ccnuma处理器系统需要首先invalidate状态位为s其他的cache行,之后将cache行的状态更新为m。

对mesif协议qpi互连技术有兴趣的读者,可以在深入理解“基于目录表的cache一致性协议”的基础上,阅读robert a. maddox, gurbir singh and robert j. safranek合著的书籍“weaving high performance multiprocessor fabric”以了解该协议的实现过程和与qpi互连技术相关的背景知识。

值得注意的是,mesif协议解决主要的问题是ccnuma架构中smp子系统与smp子系统之间cache一致性。而在smp处理器系统中,依然需要使用传统的mesi协议。nehelem ex处理器也可以使用moesi协议进一步优化smp系统使用的cache一致性协议,但是并没有使用该协议。

为简化起见,本章假设处理器系统使用mesi协议进行cache共享一致性,而不是moesi协议或者mesif协议。

在smp处理器系统中,每一个cpu都使用hit#和hitm#信号反映host主桥访问的地址是否在各自的cache中命中。当host主桥访问存储器时,cpu将驱动hitm#和hit#信号,其描述如表3?1所示。

hitm#

hit#

描述

1

表示host主桥访问的地址没有在cpu的cache中命中。

表示host主桥访问的地址在cpu的cache中命中,而且cache的状态为s(shared)或者e(exclusive),即cache中的数据与存储器的数据一致。

表示host主桥访问的地址在cpu的cache中命中,而且cache的状态为m(modified),即cache中的数据与存储器的数据不一致,在cache中保存最新的数据拷贝。

mesi协议规定这种情况不允许出现,但是在有些处理器系统中仍然使用了这种状态,表示暂时没有获得是否在cache命中的信息,需要等待几拍后重试。

在处理器系统中,与cache一致性相关的agent如下所示。

 request agent。fsb总线事务的发起设备。在本节中,request agent特指host主桥。实际上在fsb总线上的其他设备也可以成为request agent,但这些request agent并不是本节的研究重点。request agent需要进行总线仲裁后,才能使用fsb,在多数处理器的fsb中,需要对地址总线与数据总线分别进行仲裁。

snoop agents。fsb总线事务的监听设备。snoop agents为cpu,在一个smp处理器系统中,有多个cpu共享同一个fsb,此时这些cpu都是这条fsb上的snoop agents。snoop agents监听fsb上的存储器读写事务,并判断这些总线事务访问的地址是否在cache中命中。snoop agents通过hit#和hitm#信号向fsb通知cache命中的结果。在某些情况下,snoop agents需要将cache中的数据回写到存储器,同时为request agent提供数据。

 response agent。fsb总线事务的目标设备。在本节中,response agent特指存储器控制器。response agent根据snoop agents提供的监听结果,决定如何接收数据或者向request agent设备提供数据。在多数情况下,当前数据访问没有在snoop agents中命中时,response agent需要提供数据,此外snoop agents有时需要将数据回写到response agent中。

一个fsb的总线事务由多个阶段组成,包括request phase、snoop phase、response phase和data phase。目前在多数高端处理器中,fsb支持流水操作,即在同一个时间段内,不同的阶段可以重叠,如图3?6所示。

3.3.1 Cache一致性的基本概念

在一个实际的fsb中,一个总线事务还可能包含arbitration phase和error phase。而本节仅讲述图3?6中所示的4个基本阶段。

 request phase。request agent在获得fsb的地址总线的使用权后,在该阶段将访问数据区域的地址和总线事务类型发送到fsb上。

snoop phase。snoop agents根据访问数据区域在cache中的命中情况,使用hit#和hitm#信号,向其他agents通知cache一致性的结果。有时snoop agent需要将数据回写到存储器。

reponse phase。response agent根据request和snoop phase提供的信号,可以要求request agent重试(retry),或者response agent延时处理(defer)当前总线事务。在fsb总线事务的各个阶段中,该步骤的处理过程最为复杂。本章将在下文结合pci设备的dma读写执行过程,说明该阶段的实现原理。

 data phase。一些不传递数据的fsb总线事务不包含该阶段。该阶段用来进行数据传递,包括request agent向response agent写入数据;response agent为request agent提供数据;和snoop agent将数据回写到response agent。

下文将使用本小节中的概念,描述在pci总线中,与cache相关的总线事务,并讲述相关的fsb的操作流程。