首页 理论教育PCIe设备DMA读写延时-PCIExpress体系结构导读

PCIe设备DMA读写延时-PCIExpress体系结构导读

【摘要】:图12-11 Capric卡的DMA写过程首先处理器填写Capric卡的WR_DMA_ADR、WR_DMA_SIZE和DCSR2寄存器,经过延时D0之后,这些命令陆续到达Capric卡。Capric卡收到处理器的DMA写请求后,将向RC连续发送存储器写TLP,并由RC将数据写入到主存储器。处理器收到MSI报文后,将执行中断处理程序,Capric卡的中断处理例程通过RC读取中断控制状态寄存器INT_REG,并结束整个DMA写操作。首先处理器填写Capric卡的寄存器启动DMA读。

上节简要介绍了影响PCIe设备进行数据传递的因素,无论设计者采用什么样的设计方式,TLP在通过事务层、链路层和物理层时都会受到这些因素的影响。但是不同的设计方法依然会极大影响PCIe总线的使用效率

本文中出现的Capric卡是一个很糟糕的设计,在这个设计中,并没有使用流水线机制来掩盖PCIe总线的延时,因此该卡通过PCIe总线进行DMA读时的效率并不高。

1.Capric卡DMA写的效率

在Capric卡中,DMA写操作由多个步骤组成,并由Capric卡的硬件逻辑和处理器的中断处理机制协调完成,其步骤如图12-11所示。

978-7-111-29822-9-Part02-192.jpg

图12-11 Capric卡的DMA写过程

首先处理器填写Capric卡的WR_DMA_ADR、WR_DMA_SIZE和DCSR2寄存器,经过延时D0之后,这些命令陆续到达Capric卡。其中D0的大小与Capric卡连接在处理器系统中的位置相关,而与Capric卡的设计无关。如果Capric卡直接与RC相连接,则D0的值较小;如果Capric卡通过多级Switch之后再与RC连接,则D0较大。

Capric卡收到处理器的DMA写请求后,将向RC连续发送存储器写TLP,并由RC将数据写入到主存储器。Capric卡根据WR_DMA_SIZE寄存器的数值,将数据分解为多个存储器写请求TLP,其中每个存储器写请求TLP的有效负载不超过Max_Payload_Size参数,本节假设该参数的大小为128B。

假定Capric卡使用100MHz[105]的时钟,而内部总线宽度为64位,此时Capric卡内部总线的带宽可以达到800MB/s,该值非常接近×4PCIe链路所能提供的有效带宽;存储器写TLP使用3DW的报文头且不使用ECRC校验,而每个存储器写TLP的最大有效负载为128B(32DW)。因此在Capric卡中,一个存储器写TLP的最大长度为35DW,此时Capric卡需要使用18(实际值为17.5)个时钟周期才能将这个TLP发送出去,因此在Capric卡中D1的大小为180ns。

Capric卡将存储器写TLP发送完毕后,将向RC发送MSI报文,MSI报文也是一种存储器写TLP,Capric卡使用两个时钟周期,即20ns即可将该报文发送出去。RC在等待一段延时后,将陆续收到存储器写请求TLP1~N和MSI报文,这段延时为TLP从EP到RC的延时,约等于D0。

处理器收到MSI报文后,将执行中断处理程序,Capric卡的中断处理例程通过RC读取中断控制状态寄存器INT_REG,并结束整个DMA写操作。HOST处理器读取中断控制状态寄存器的开销绝对不能忽略,因为这个读取过程首先是RC发送存储器读请求TLP,当Cap-ric卡收到这个TLP后再向RC发送存储器读完成TLP,其访问延时为2×D0。

假设Capric卡一次DMA写的大小为X字节[106],则这次DMA写所需的时间Tdmaw如公式12-13所示。

Tdmaw=D0+D0+X/128×D1+20+2×D0 (12-13)

其中Tdmaw的值越小,Capric卡传送X字节的数据所需的时间也越短。但是以上公式并没有考虑Capric在DMA写过程中,因为数据缓冲不足而暂时中断存储器写TLP发送流水线的情况,而且忽略了中断处理例程所需的切换与执行时间。

由以上公式,可以发现当D0越大Tdmaw也越大。但是当X越大时,D0在Tdmaw中所占的比重越小,在一个处理器系统中,D0的大小是Capric卡无法控制的,该值的大小与Capric卡在处理器系统的位置和处理器系统的RC确定,属于系统延时,我们假设该值为250ns[107]。根据以上假设,可以利用公式12-13获得Capric卡DMA写的有效带宽,如表12-3所示。

表12-3 X的大小与DMA写有效带宽的关系

978-7-111-29822-9-Part02-193.jpg

由表12-3所示,X越大,Capric卡的有效带宽也越高,因此适当提高X的大小将有效提高Capric卡DMA写的传送效率。

2.Capric卡DMA读的效率

在Capric卡中,DMA读的过程比DMA写过程略微复杂一些。因为DMA读是由两部分组成的,首先Capric卡向RC发起存储器读请求TLP;当RC从存储器获得数据后,再向Capric卡发送存储器读完成TLP,其实现过程如图12-12所示。(www.chuimin.cn)

978-7-111-29822-9-Part02-194.jpg

图12-12 Capric卡的DMA读过程

如上图所示,Capric卡的DMA读过程如下所示。

(1)首先处理器填写Capric卡的寄存器启动DMA读。

(2)Capric卡在等待D0这段延时后,收到这个命令,之后向RC提交存储器读请求TLP。假设Capric卡一共需要N个存储器读请求TLP才能发送完成整个请求,而且需要Dn这段时间才能将完成这些操作。而且存储器读请求TLP到达RC的延时也为D0。

(3)处理器在等待D0+D0这段延时后,将开始接收存储器读请求TLP,并从主存储器获得相应的数据,并组织存储器读完成报文发向Capric卡。RC从开始接收存储器读请求TLP到接收最后一个存储器读请求TLP的时间延时为Dn。其中Dn也与Capric卡发送全部存储器读请求的延时相同。

(4)RC收到来自Capric卡的存储器读请求TLP后,开始发送存储器读完成报文,其中Capric卡接收存储器读请求TLP与Capric卡发送存储器读完成TLP可以同步进行,因此Dn这段延时并不会被重复计算,而仅计算发送存储器读完成报文的流水准备时间,这段时间由两部分组成,Capric卡发送一个存储器读请求TLP的延时,和RC从主存储器中读取数据的延时。我们假定这两段延时都为20ns,因此流水准备时间为40ns。

(5)Capric卡经过D0这段延时后开始接收存储器读完成TLP,并经过Dm这段延时后将接收完毕所有来自RC的存储器读,并获得DMA读的所有数据。

(6)Capric卡发送MSI报文通知处理器DMA读完成。

(7)处理器经过D0这段延时后,收到MSI报文,并开始执行中断处理程序。如果这个中断处理程序仍然需要读取中断控制状态寄存器,则处理器需要2×D0这段延时时间之后才能完成Capric卡的DMA读。

其中D3延时为RC发送存储器读完成TLP所需要的时间,D3延时与RC的RCB参数相关。我们假设RC的RCB参数为64B,存储器读完成中的Payload为64B,而读完成报文头为12B;同时假设RC使用128b的数据总线,而且其总线频率为667MHz,此时RC发送的数据报文已经超过了Capric卡接收存储器读完成报文的速度,因此在分析中我们使用D2延时,其中D2为Capric接收存储器读完成报文的延时。Capric卡接收一个长度为84B的报文时间约为110ns(实际需要10.5个时钟周期)。因此Dm的计算方法如公式12-14所示。

Dm=DX/64=110×X/64 (12-14)

由以上分析,可以发现在PCIe总线中,Capric卡DMA读比DMA写的过程略微复杂。假设Capric卡一次DMA读的大小为X[108]字节,则这次DMA读所需的时间Tdmar如公式12-15所示。

Tdmar=2×D0+40+110×X/64+2×D0+2×D0 (12-15)

由以上公式,可以发现当D0越大时Tdmar也越大,但是当X越大时,D0在Tdmar中所占的比重越小。假设D0为250ns时,可以根据公式12-13获得Capric卡DMA读的有效带宽,如表12-4所示。

表12-4 X的大小与DMA读有效带宽的关系

978-7-111-29822-9-Part02-195.jpg

由表12-3和表12-4可以发现,Capric卡的DMA写的效率略高于DMA读的效率。以上有关Capric卡DMA读写效率是一个粗粒度的分析,其分析结果并没有考虑数据链路层、物理层和流量控制的开销,也没有考虑发送接收流水线中断的情况,是一个较为理想的结果。笔者的实测结果与表12-3和表12-4有些差距,因为在x86处理器系统中,D0延时时间远大于250ns。