RDMA之GDR、GDRCopy、IBRC 与IBGDA (3)
一、GDR (GPUDirect RDMA)
在GDR(GPUDirect RDMA)技术出现前,由于GPU具备独立的内存空间,RDMA网卡无法直接访问GPU显存,所有数据必须通过CPU系统内存中转,路径为:RDMA 网卡 ↔ 系统内存 ↔ GPU 显存[2]。GDR通过使RDMA网卡直接读写GPU显存,消除了CPU拷贝开销,能够显著提升GPU数据传输效率。
支持GDR后,RDMA网卡在获得GPU地址指针后调用GPU驱动接口,将GPU虚拟地址转换为物理地址。完成地址查询与内存注册后,RDMA即可直接访问该GPU显存区域。
二、GDRCopy
GDRCopy是基于NVIDIA GPUDirect RDMA实现的低延迟GPU内存拷贝库[4]。它支持GPU与CPU间数据传输(D2H/H2D),由CPU驱动,具有低开销和低延迟的特点,尤其适用于小消息的高效搬运。下图[5]对CPU驱动的GDRCopy与GPU驱动的cudaMemcpy进行了性能对比:
三、IBRC(InfiniBand Reliable Connection)
IBRC使用CPU Proxy线程管理通信,其操作步骤如上图,具体如下:
- CUDA kernel生成数据;
- SM线程将通信的工作描述符写入CPU Proxy缓冲区;
- CPU Proxy检测工作描述符并启动相应的网络操作;
- CPU创建工作描述符并将其存入WQ队列,该描述符指示请求的操作(如RDMA写入),包含源地址、目的地址、大小和其他网络信息;
- CPU更新内存中的Doorbell record缓冲区(DBR),网卡丢失DB信息可用此缓冲区恢复;
- CPU通过写入DB(NIC中的寄存器)通知网卡进行数据传输;
- NIC从WQ缓冲区中读取工作描述符;
- NIC使用GDR(GPUDirect RDMA)直接从GPU内存读取复制数据;
- NIC将数据传输至远程节点;
- NIC通过向主机内存完成队列(CQ)缓冲区写入事件表示网络操作已完成;
- CPU轮训CQ缓冲区以检测网络操作是否完成;
- CPU通知GPU网络操作已完成。如果存在GDRCopy,CPU会直接将通知flag写入GPU内存,否则,它会将该标志写入Proxy缓冲区,由GPU轮询以获取工作请求的状态。
IBRC有两个主要缺点:
- 消耗CPU资源;
- 代理线程存在瓶颈,在高并发小消息传输时无法达到NIC的峰值吞吐。
四、IBGDA(InfiniBand GPUDirect Async)
IBGDA使SM能够直接与NIC交互,其操作步骤如上图,具体如下:
- CUDA kernel生成数据;
- SM创建NIC工作描述符,并将其直接写入WQ缓冲区。与CPU代理方法不同,此WQ缓冲区位于GPU内存中;
- SM更新DBR缓冲区(同样位于GPU内存);
- SM通过写入NIC的DB寄存器来通知NIC;
- NIC使用GDR读取WQ缓冲区中的工作描述符;
- NIC使用GDR读取GPU内存中的数据;
- NIC将数据传输至远程节点;
- NIC通过使用GDR向CQ缓冲区写入事件通知GPU网络操作已完成。
介绍IBRC时提到,代理线程存在瓶颈,在高并发小消息传输时无法达到NIC的峰值吞吐,而IBGDA不存在该问题。在小消息AlltoAll场景下,IBGDA具有更低的时延。
五、CPU-assisted IBGDA
在deepEP仓库的third-party/README.md中提到,想要使用NVSHMEM的IBGDA:
要么设置nvidia内核配置:
options nvidia NVreg_EnableStreamMemOPs=1 NVreg_RegistryDwords="PeerMappingOverride=1;"要么安装GDRCopy并加载gdrdrv内核模块。两种方式任一均可支持IBGDA。
在没有或者不支持PeerMappingOverride=1驱动程序设置的系统上,可采用基于 GDRCopy 的 CPU 辅助型 IBGDA 方案。该模式介于 IBRC 与 IBGDA 之间,将控制面任务拆分至 GPU 和 CPU 共同处理:由 GPU 生成工作请求,CPU 通过 GDRCopy 轮询获取这些请求并通知 NIC(Ring DB)。
与 IBRC 相比,CPU-assisted IBGDA 仅需 CPU 执行少量控制面操作,可避免或缓解 Proxy 瓶颈问题;与纯 IBGDA 相比,该方案降低了对系统配置的依赖,有助于提升 IBGDA 在不同平台上的适用性和部署率。
参考文章:
1、(3 封私信 / 80 条消息) GPUDirect RDMA 的演进与实现 - 知乎
