前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PCI Express 系列连载篇(十三)

PCI Express 系列连载篇(十三)

作者头像
FPGA技术江湖
发布2020-12-29 18:22:33
1.5K0
发布2020-12-29 18:22:33
举报
文章被收录于专栏:FPGA技术江湖

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

最近有很多大侠在交流群里讨论PCI总线,PCI作为高速接口之一,在当下的FPGA产品设计研发中,地位举足轻重,应用广泛,今天给大侠带来PCI Express 系列连载,今天带来第十三篇,与Cache相关的PCI总线事务,包括Cache一致性的基本概念(Cache一致性协议、HIT#和HITM#信号、Cache一致性协议中使用的Agent以及FSB的总线事务)相关内容。希望对各位大侠的学习有参考价值,话不多说,上货。

PCI总线规范定义了一系列与Cache相关的总线事务,以提高PCI设备与主存储器进行数据交换的效率,即DMA读写的效率。当PCI设备使用DMA方式向存储器进行读写操作时,一定需要经过HOST主桥,而HOST主桥通过FSB总线[1]向存储器控制器进行读写操作时,需要进行Cache共享一致性操作。

PCI设备与主存储器进行的Cache共享一致性增加了HOST主桥的设计复杂度。在高性能处理器中Cache状态机的转换模型十分复杂。而HOST主桥是FSB上的一个设备,需要按照FSB规定的协议处理这个Cache一致性,而多级Cache的一致性和状态转换模型一直是高性能处理器设计中的难点。

不同的HOST主桥处理PCI设备进行的DMA操作时,使用的Cache一致性的方法并不相同。因为Cache一致性操作不仅与HOST主桥的设计相关,而且主要与处理器和Cache Memory系统设计密切相关。

PowerPC和x86处理器可以对PCI设备所访问的存储器进行设置,其设置方法并不相同。其中PowerPC处理器,如MPC8548处理器,可以使用Inbound寄存器的RTT字段和WTT字段,设置在PCI设备进行DMA操作时,是否需要进行Cache一致性操作,是否可以将数据直接写入Cache中。RTT字段和WTT字段的详细说明见第2.2.3节。

而x86处理器可以使用MTRR(Memory Type Range Registers)设置物理存储器区间的属性,是否为可Cache空间。下文分别讨论在PowerPC与x86处理器中,PCI设备进行DMA写操作时,如何进行Cache一致性操作。

但是与PowerPC处理器相比,x86处理器在处理PCI设备的Cache一致性上略有不足,特别是网络设备与存储器系统进行数据交换的效率。因为x86处理器所重点优化的是PCIe设备,目前x86处理器使用的IOAT(I/O Acceleration Technology)技术,极大增强了PCIe设备与主存储器进行数据通信的效率,但是这种技术仍然不能与一些Data Plane处理器,如XLP832,P4080处理器优化I/O访问的技术相提并论。毕竟x86处理器所适用的领域依然是PC、服务器等计算和控制领域,并不是Data Plane处理器领域。

Cache一致性的基本概念

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

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

1 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协议。

2 HIT#和HITM#信号

在SMP处理器系统中,每一个CPU都使用HIT#和HITM#信号反映HOST主桥访问的地址是否在各自的Cache中命中。当HOST主桥访问存储器时,CPU将驱动HITM#和HIT#信号,其描述如表3-1所示。

表3-1 HITM#和HIT#信号的含义

HIT#和HITM#信号是FSB中非常重要的两个信号,各个CPU的HIT#和HITM#信号通过“线与方式”直接相连[2]。而在一个实际FSB中,还包括许多信号,本节并不会详细介绍这些信号。

3 Cache一致性协议中使用的Agent

在处理器系统中,与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中。
4 FSB的总线事务

一个FSB的总线事务由多个阶段组成,包括Request Phase、Snoop Phase、Response Phase和Data Phase。目前在多数高端处理器中,FSB支持流水操作,即在同一个时间段内,不同的阶段可以重叠,如图3-6所示。

在一个实际的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的操作流程。

[1] Boxboro-EX处理器系统由多个Nehalem EX处理器组成,而Nehalem EX处理器由两个SMP处理器系统组成,一个SMP处理器系统由4个CPU组成,而每一个CPU具有2个线程。其中SMP处理器系统之间使用QPI进行连接,而在一个SMP处理器内部的各个CPU仍然使用FSB连接。

[2] HIT#和HITM#信号是Open Drain(开漏)信号,Open Drain信号可以直接相连,而不用使用逻辑门。

PCI Express 系列连载篇(十三)就到这里结束,明天继续带来第十四篇,包括PCI设备对不可Cache的存储器空间进行DMA读写相关内容。各位大侠,明天见!

END

后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA技术江湖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 Cache一致性协议
  • 2 HIT#和HITM#信号
  • 3 Cache一致性协议中使用的Agent
  • 4 FSB的总线事务
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档