PCI总线cache一致性问题

缓存一致性模块(Cache Coherence Module)是计算机系统中用于确保多个处理器或核心的缓存中数据的一致性的重要组件。在多核处理器或多处理器系统中,每个处理器核心通常都有自己的高速缓存(Cache),这些缓存被用来加速对内存的访问,提高系统性能。然而,当多个处理器核心同时访问同一个内存位置时,可能会导致数据不一致的问题,这就需要通过缓存一致性协议和相应的硬件支持来解决。

主要功能和工作原理

  1. 保持数据一致性

    • 缓存一致性模块的主要功能是确保系统中所有处理器核心看到的共享数据是一致的。这意味着如果一个核心修改了内存中的某个数据,其他核心的缓存中的数据也必须随之更新,以保证系统的数据完整性和正确性。
  2. 缓存一致性协议

    • 缓存一致性模块实现了特定的缓存一致性协议,如MESI(Modified, Exclusive, Shared, Invalid)或MOESI(Modified, Owned, Exclusive, Shared, Invalid)等。这些协议定义了处理器如何在读写数据时与其他处理器进行通信,以确保缓存中的数据状态保持一致。
  3. 处理器间的通信

    • 当一个处理器核心修改了缓存中的数据时,它会向缓存一致性模块发送相应的写入请求。该模块负责更新其他核心的缓存,或者通知它们将相应的缓存行标记为失效(Invalid),从而保证其他核心访问相同内存位置时能获取到最新的数据。
  4. 硬件实现

    • 缓存一致性模块通常由硬件设计实现,在多核处理器芯片或者多处理器系统的芯片组中集成。它包括仲裁逻辑、缓存状态追踪、缓存数据的传输和更新机制等关键部件,以支持高效的缓存一致性管理。
  5. 性能影响

    • 缓存一致性模块的设计和实现会直接影响系统的性能和功耗。因此,现代处理器架构在设计时会考虑如何优化缓存一致性协议,以在保证数据一致性的同时,尽可能减少通信延迟和能耗。

应用场景

缓存一致性模块广泛应用于多核处理器、多处理器服务器和高性能计算系统中。它们确保了在并行计算和多任务处理中,所有处理器核心之间共享的数据能够保持一致性,从而避免了由于数据不一致而导致的程序错误和系统崩溃。

总之,缓存一致性模块在现代计算系统中扮演着关键角色,通过实现复杂的缓存一致性协议和相应的硬件支持,有效管理和维护多核处理器或多处理器系统中的数据一致性。

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协议时,状态机的转换原理类似,但是在处理上仍有细微区别。
在这里插入图片描述

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协议并没有太大意义,该协议由Boxboro-EX处理器系统[1]引入,目前Intel并没有公开Boxboro-EX处理器系统的详细设计文档。MESIF协议仅是解决该处理器系统中Cache一致性的一个功能,该功能的详细实现与QPI的Protocal Layer相关,QPI由多个层次组成,而Protocal Layer是QPI的最高层。
对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协议。

在处理器系统和总线协议中,HIT#和HITM#信号用于指示缓存中的命中情况和缓存行状态的变化,通常用于处理器和缓存之间的通信。下面分别解释这两个信号的含义:

  1. HIT#信号

    • 含义:HIT#信号表示缓存命中,即处理器在其缓存中找到了请求的数据或指令,无需从主存或其他处理器的缓存中获取。这意味着处理器能够立即访问所需的数据或指令,从而避免了额外的访存周期。
    • 应用:在处理器进行读取或写入操作时,如果在其缓存中命中了数据,处理器会通过HIT#信号通知总线或其他相关的设备,表示数据命中并已从缓存中读取或写入。
  2. HITM#信号

    • 含义:HITM#信号表示缓存中的数据命中且已被修改(Modified)。这种状态下,处理器的缓存中有最新的数据副本,并且该数据已经被修改,不同于主存中的数据副本。HITM#信号通常伴随着写操作,用于指示缓存中数据的修改状态。
    • 应用:当处理器执行写操作时,如果处理器的缓存中命中了数据且该数据已经被修改,处理器会通过HITM#信号通知总线或其他设备,表示数据已被修改并写回缓存。这对于处理器和其他设备之间的一致性和同步非常重要,确保缓存中的数据更新和主存中的数据一致性。

这些信号在多处理器系统中尤为重要,因为多个处理器可能会同时访问相同的内存位置或缓存行。通过HIT#和HITM#信号,系统可以准确地管理数据的一致性,避免数据的竞争和冲突,提高系统的性能和效率。

在计算机系统中,Agent(代理器)是指执行某种特定功能或任务的硬件或软件组件。在Cache一致性协议中,Agent通常指的是执行特定功能的硬件设备或模块,主要用于管理和维护缓存的一致性。

具体来说,在Cache一致性协议中,常见的Agents包括:

Request Agent:发起缓存访问请求的设备。这通常是处理器或其他设备,它们通过总线(如FSB,QPI等)向其他设备或内存发送读取或写入请求。

Snoop Agent:监听总线上的请求和响应,判断当前事务是否会影响本地缓存中的数据。在多处理器系统中,每个处理器通常都是一个Snoop Agent,它们通过监听其他处理器的访问来保持缓存一致性。

Response Agent:响应缓存访问请求的设备,通常是存储控制器或其他存储设备。当Snoop Agent检测到本地缓存未命中时,它们会向Response Agent请求数据,或者接收来自其他处理器的数据更新。

这些Agents通过协议规定的信号和交互方式,确保在多处理器系统中各个缓存之间的数据一致性。Cache一致性协议的设计和实现,旨在避免数据不一致和冲突,提升系统的性能和可靠性。

在x86处理器中,PCI设备向不可Cache的存储器空间进行读操作时,CPU也必须进行Cache共享一致性操作,为什么?

“不可Cache的存储器空间”指的是一段内存区域,其数据不应被缓存在处理器的高速缓存中。这种情况通常发生在以下几种场景:

  1. 设备内存映射区域: 许多设备(如显卡、网络适配器、硬盘控制器等)在系统中都会有自己的内存映射区域,用于进行数据传输和控制。这些设备在进行DMA(直接内存访问)操作时,会直接与系统内存进行交互,但其访问的数据通常不应被处理器的缓存所缓存,因为这会引发数据一致性的问题。

  2. 外设寄存器区域: 外设(如IO设备)通常有特定的寄存器区域用于与设备进行通信和控制。这些寄存器区域中的数据变化对系统状态至关重要,因此这些数据通常不允许被处理器的缓存所保存,以确保处理器始终能够看到最新的设备状态。

  3. 共享内存区域: 在一些多处理器或多线程系统中,可能会有一些共享内存区域用于进程间或线程间的通信。为了避免缓存一致性问题,这些共享内存区域的数据可能被标记为不可Cache,以确保所有处理器核心或线程看到的数据是一致的。

对于处理器来说,MTRR(Memory Type Range Registers)是一种设置内存区域类型的机制。通过MTRR,可以将某些内存区域标记为不可Cache,从而告知处理器在访问这些区域时不要将其数据缓存到处理器的高速缓存中,避免可能引发的数据一致性问题。

在x86处理器中,当PCI设备向不可Cache的存储器空间进行读操作时,CPU必须进行Cache共享一致性操作的主要原因如下:

  1. 缓存一致性协议要求: x86处理器采用的缓存一致性协议(如MESI协议)要求在多处理器系统中,所有CPU的缓存必须保持一致。这意味着如果一个PCI设备修改了主存储器中的数据(无论这些数据是否是可Cache的),其他CPU必须能够及时感知到这些变化,以避免出现数据不一致的情况。

  2. Snoop机制: x86处理器通过总线上的Snoop机制来实现缓存一致性。当PCI设备向存储器空间进行读操作时,其他CPU会通过Snoop机制监视总线上的读取事务。如果某个CPU拥有被PCI设备读取的存储器空间的缓存行,并且该缓存行的状态为有效(不是无效状态),该CPU将收到一个Snoop信号,表明它需要确保自己的缓存中的数据是最新的。

  3. 避免数据不一致: 如果PCI设备进行了写操作,并且其他CPU的缓存中仍保存旧数据,可能会导致程序错误或者系统不稳定。通过Cache共享一致性操作,x86处理器可以保证所有CPU看到的数据都是最新的,从而避免了潜在的数据不一致问题。

  4. 性能与系统稳定性考量: 虽然在不可Cache的存储器空间进行DMA读取时,可能会引入额外的缓存一致性操作,但这是确保系统稳定性和数据完整性的必要措施。性能方面的影响可以通过合理的系统设计和硬件支持来减少,比如通过优化的总线控制器或者处理器技术来减少Snoop操作的影响。

因此,即使PCI设备访问的存储器空间被标记为不可Cache,x86处理器仍然需要进行Cache共享一致性操作,以确保系统的整体稳定性和数据的一致性。

在计算机系统中,特别是在多处理器系统或多核系统中,Snoop Phase(侦听阶段)是指在总线事务处理过程中,用于侦听(或监听)其他处理器核心或设备对系统总线上存储器读写操作的阶段。

功能和作用

  1. Cache一致性维护:

    • 当一个处理器核心或设备进行存储器读写操作时,其他处理器核心需要知道这些操作是否会影响到它们本地缓存中的数据。如果某个处理器核心的缓存中存在某个内存地址的副本,并且该地址被另一个核心或设备修改了,那么缓存一致性协议要求这些修改需要被通知到其他相关的缓存。
  2. HIT# 和 HITM# 信号:

    • 在Snoop Phase阶段,处理器核心或设备可以向总线发送HIT#和HITM#信号来指示缓存一致性的情况:
      • HIT#信号表示当前事务在总线上访问的地址命中了本地缓存,但是数据是共享的(即其他缓存也有该数据的副本)。
      • HITM#信号表示当前事务在总线上访问的地址命中了本地缓存,并且这个数据是独占的(即其他缓存没有该数据的副本)。
  3. 缓存行状态更新:

    • 根据Snoop Phase阶段的信号和信息,处理器核心或设备可能需要更新其缓存行的状态。例如,如果另一个核心对某个缓存行进行了写操作,本地核心的缓存行可能需要从Shared状态转换为Invalid状态,或者从Exclusive状态转换为Invalid状态。
  4. 回写操作:

    • 在某些情况下,Snoop Phase阶段还可能涉及到缓存行的回写操作。例如,如果某个核心的缓存行状态为Modified(已修改),并且另一个核心需要访问这个地址,那么先前的核心可能需要将数据回写到内存或者传输给请求的核心。

总结

Snoop Phase是多处理器系统中用于维护缓存一致性的重要阶段。在这个阶段,处理器核心或设备通过监听总线上的访问,确保系统中所有的缓存都能够看到最新的数据状态,从而避免因为多个缓存副本导致的数据不一致问题。这种机制对于确保系统的稳定性和数据完整性至关重要。

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值