#PCIE#《PCIE P2P 传输那点事儿》

1. PCIe P2P是什么

PCIe的peer to peer简称P2P,即点对点传输,用于一个EP设备访问另一个EP设备,而不需要使用主机RAM作为临时存储。

PCIe P2P特性带来的好处有:可以极大提升数据的传输效率,减少CPU的负载,并在特定场景下优化系统性能。

2. PCIe P2P传输原理

一般来说,PCIe P2P传输可以分为以下三大类。

第一种是:只经过Switch的P2P传输,EP1 → Switch → EP2。如下图所示。

如果EP端的ATC(Address Translation Cache)声称其发出的访问请求是经过转换后的地址,且该地址刚好落在PCIe Switch的BAR范围内,则该请求不会到达RC,而是被Switch路由到该地址所对应的EP。也就是说,该访问请求绕过了IOMMU的隔离,进行了P2P传输。

需要注意的是,这种只经过Switch的P2P传输需要关闭PCIe Switch的ACS(Access Control Service)的p2p重定向(redirect)功能,否则redirect会将请求发给RC。

简单说一下PCIe的ACS capability。ACS提供了一种机制,能够决定一个TLP被正常路由、阻塞或者redirect。通过在Switch上开启ACS,可以禁止P2P发送,强迫Switch将所有地址的访问请求发送到RC,从而避开P2P访问中的风险。

第二种是:经过RC的P2P传输,EP1 → RC → EP2。这个过程可能也会经过Switch。典型过程如下图所示。

图中的P2P传输经过了3个Switch和1个RC,绿色框为MRd事务,红色框为CplD事务。

第三种是经过片上网络NoC的P2P传输,EP1 → RC → NoC → RC → EP2。

这个过程可能也会经过Switch。当两个EP设备连接在芯片的不同位置或者不同die上时,P2P传输需要经过NoC。

以ARM CMN片上网络为例,其经过CMN路由的P2P路径为:EP1 → RC → RND → XP → HNP → RC → EP2。这种P2P传输需要依赖NoC的实现来完成。

3. PCIe P2P应用场景

PCIe P2P的一个典型应用场景就是GPUDirect。GPU Direct是 NVIDIA 开发的一项技术,可实现GPU与其他设备(例如NIC网卡、存储设备)之间的直接通信数据传输,而不涉及CPU。GPUDirect主要包括GPUDirect P2P、GPUDirect RDMA、GPUDirect Storage等。

GPUDirect P2P解决了节点内的GPU与GPU通信问题,两个GPU可以通过PCIe P2P直接进行数据搬移,避免了主机内存和CPU的参与,如下图所示。

GPUDirect RDMA使得GPU和网卡可以直接通过PCIe进行数据交互,也避免了跨节点通信过程中内存和CPU的参与。

GPUDirect RDMA结合了GPU加速计算和RDMA(Remote Direct Memory Access)技术,实现了在GPU和RDMA网络设备之间直接进行数据传输和通信。它允许GPU直接访问RDMA网络设备中的数据,无需通过主机内存或CPU。

GPUDirect Storage允许存储设备和GPU之间进行直接数据传输,绕过了CPU,减少数据传输的延迟和CPU开销。

通过GPUDirect Storage,GPU可以直接从存储设备(如固态硬盘SSD或NVMe驱动器)访问数据,而无需将数据先复制到CPU的内存中。这种直接访问能够实现更快的数据传输速度,并高效利用GPU资源。

此外,推荐一套学习PCIe协议的培训视频,里面对PCIe协议的总体架构和原理都做了非常详细的介绍。