FPGA PCIe P2P通讯 实现 GPU Direct RDMA

[复制链接]
发表于 2026-7-8 07:57:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
FPGA PCIe P2P通讯 实现 GPU Direct RDMA

星测电子的FPGA PCIe 装备全面支持GPU DIRECT DMA,支持P2P方式绕过CPU实现FPGA缓存到GPU缓存,全面提升体系性能、低沉传输耽误,实用于量子盘算、半导体量检测等对耽误敏感的场景。
本文专注于FPGA与GPU 之间的P2P传输,没有关注FPGA与FPGA,GPU与GPU之间的P2P,请连续关注。
1. 方案概述

1.1 什么是 GPU Direct RDMA

GPU Direct RDMA 允许 FPGA 绕过 CPU 和体系内存,通过 PCIe 总线直接与 GPU 显存举行数据交换。
  1. 传统路径:  FPGA ──DMA──→ CPU内存 ──cudaMemcpy──→ GPU显存  (2次拷贝)
  2. GPU Direct: FPGA ──PCIe DMA──→ GPU显存                        (1次拷贝, 零CPU参与)
复制代码

1.2 焦点代价

代价结果耽误低沉 ~50%消除 CPU 中心拷贝,端到端耽误减半带宽提升 1.5x~3.2x数据直达 GPU,无内存总线争用CPU 完全开释DMA 传输期间 CPU 零开销,可处理惩罚推理/控制使命1.3 实用场景

场景保举方案预期收益FPGA 图像收罗 → GPU 推理GPU Direct (多缓冲轮转)2.0x 加快FPGA 信号处理惩罚 → GPU 盘算GPU Direct (单缓冲)1.5x~2.0x 加快FPGA ↔ CPU 数据交换传统 CPU DMA无需切换2. 验证平台

2.1 硬件与软件环境

已在 三大平台 完玉成面验证,覆盖嵌入式、服务器、工作站三类应用场景:
Tegra (Jetson Orin)Desktop (H100)Desktop (RTX A4000)定位嵌入式边沿盘算高性能服务器通用工作站CPUARM Cortex-A78AEIntel Xeon 8462Y+Intel Core (x86)GPU集成 Ampere GPUH100 PCIe (80GB HBM2e)RTX A4000 (16GB GDDR6)FPGA PCIeGen3 x4Gen3 x8Gen3 x4 (受主板插槽限定)FPGA 端内存DDR4 2GBDDR4 2GBDDR4 2GBOSUbuntu 22.04 (aarch64)Ubuntu 22.04 (x86_64)Ubuntu 18.04 (x86_64)CUDA12.612.49.1glibc2.352.352.27
兼容性亮点:三平台高出 aarch64 / x86_64 两种架构、CUDA 9.1~12.6 三个主版本、Ubuntu 18.04~22.04 两代 OS,验证覆盖面业界领先,国内首发。
此中Jetson 平台使用的硬件来自星测电子JetKU板卡 JetKU, Jetson orin + KU5P FPGA, Gen3x4

此中X86 平台使用的硬件来自星测电子PCIe1004板卡 PCIe1004, KU040 FPGA + CXP 收罗, Gen3x8

2.2 驱动架构
  1. 用户空间:  libHelloFPGACore.so (TransferMode API)
  2.                │
  3.                ├─ CPU 模式:  open → read/write (传统路径)
  4.                └─ GPU Direct: open → ioctl (Pin/Xfer/Unpin)
  5.                                     │
  6. 内核空间:  HelloFPGA.ko (XDMA + GPU Direct 扩展)
  7.                                     │
  8. 硬    件:  Xilinx FPGA XDMA IP ←──PCIe DMA──→ GPU BAR (物理地址直通)
复制代码
有客户现实使用PCIe AXI Bridge IP,现实上可以更轻易兼容P2P,也是一个不错的方案。
3. 测试结果

测试步调: gpu_direct_api_test.cu,支持快速测试 (~2分钟) 和 12小时长稳态两种模式。
3.1 功能验证:三平台全部 15/15 通过

且在2个平台完成了12小时连续测试,测试结果无显着退化,吞吐率颠簸5%以内。
测试项Tegra (Orin)H100RTX A4000GetStatus 平台辨认✅✅✅Pin GPU 显存✅✅✅ReadC2H (FPGA→GPU)✅✅✅WriteH2C (GPU→FPGA)✅✅✅Unpin 开释✅✅✅数据精确性 (逐字节比对)✅✅✅批量模式 10×ReadC2H✅✅✅2GB 地点空间 (7 点)✅✅✅2GB 压力测试 (6 偏移)✅✅✅2GB 界限测试 (6 点)✅✅✅
共计 15 项测试用例,三平台全部通过,功能可靠性得到充实行证。
3.2 性能亮点

3.2.1 峰值带宽

注意 RTX A4000测试环境, 受限于测试主板插槽的限定,速率低沉到了Gen3x4
平台PCIe 链路GPU Direct 峰值带宽理论极限使用率Tegra (Orin)Gen3 x42.84 GB/s~3.94 GB/s72%H100Gen3 x87.37 GB/s~7.88 GB/s93.5%RTX A4000Gen3 x43.51 GB/s~3.94 GB/s89%
H100 平台 GPU Direct 带宽达 PCIe Gen3 x8 理论极限的 93.5%,RTX A4000 达 Gen3 x4 的 89%,传输服从业界领先。
3.2.2 加快比(相比传统 FPGA→CPU→GPU 全路径)

平台Read 加快Write 加快测试条件Tegra (Orin)1.97x2.49x4MB 块, 12h 匀称H1002.78x3.17x4MB 块, 12h 匀称RTX A40001.40x1.44x8MB 块, 单次
GPU Direct 相比传统全路径,消除 cudaMemcpy 中心拷贝是重要收益泉源,加快比 1.4x~3.2x。
3.2.3 多尺寸性能(RTX A4000 示例)

数据巨细GPU Direct ReadGPU Direct Write加快比 (vs 全路径)4KB41.2 μs19.8 μs1.32x / 2.81x64KB30.2 μs39.8 μs1.60x / 1.49x1MB318.6 μs336.6 μs1.43x / 1.50x4MB1219.4 μs1236.0 μs1.40x / 1.44x8MB2390.6 μs2430.8 μs1.42x / 1.44x
从 64KB 起 GPU Direct 全面领先,大包场景稳固保持 1.4x 加快比。Tegra 和 H100 平台数据详见附录。
3.2.4 等效帧率 (1MB/帧)

平台多缓冲区帧率单缓冲区帧率差别Tegra (Orin)1993 fps2033 fps0.98xH1006661 fps6658 fps1.00xRTX A40003136 fps3127 fps1.00x
多缓冲区轮转无性能丧失,4 帧轮转与单帧性能完全同等,完善适配图像收罗流水线场景。
3.3 TransferMode:零代码改造升级

用户仅需新增 2 行设置代码,已有的 HelloFPGA_DMA_MM_* 调用即可主动切换为 GPU Direct 路径:
  1. HelloFPGA_SetGPUBuffer(hDev, gpuAddr, size);                    // 新增: 注册 GPU 缓冲
  2. HelloFPGA_SetTransferMode(hDev, HELLOFPGA_XFER_MODE_GPU_PINNED); // 新增: 切换模式
  3. HelloFPGA_DMA_MM_ReadC2H(hDev, ch, buf, offset, len, &actual);   // 原有代码不变!
复制代码
TransferMode 加快比(三平台对比)

数据巨细Tegra (Wr/Rd)H100 (Wr/Rd)RTX A4000 (Wr/Rd)4KB1.26x / 1.38x1.08x / 1.25x1.93x / 1.85x1MB1.39x / 1.45x1.10x / 1.14x1.14x / 1.12x4MB1.41x / 1.46x1.11x / 1.15x1.07x / 1.09x
RTX A4000 在 4KB 小包场景加快比达 1.93x,尤为显着。H100 因 Gen3 x8 带宽充裕,CPU DMA 自己已靠近峰值,加快比 ~1.1x 属正常。
3.4 12 小时长稳态测试

Tegra 平台 (4MB, 72 次采样)

指标ReadWrite匀称时延1785.1 μs1489.0 μs匀称带宽2.35 GB/s2.82 GB/s0~4h → 8~12h 漂移< 0.3%< 0.3%功耗18.2~18.9W (稳固)无热节流H100 平台 (4MB, 72 次采样)

指标ReadWrite匀称时延601.0 μs620.4 μs匀称带宽6.98 GB/s6.76 GB/s0~4h → 8~12h 漂移< 0.4%< 0.4%
双平台 12 小时一连运行无性能退化,GPU Direct 方案具备生产级稳固性。
3.5 三平台对比总览

指标Tegra (Orin)H100RTX A4000PCIe 链路Gen3 x4Gen3 x8Gen3 x4峰值带宽2.84 GB/s7.37 GB/s3.51 GB/s1MB Read521.2 μs152.2 μs318.6 μs1MB Write412.6 μs159.2 μs336.6 μs帧率 (1MB)1993 fps6661 fps3136 fps12h 稳固性✅ 无退化✅ 无退化—2GB 地点覆盖✅✅✅数据精确性✅✅✅OS / CUDAUbuntu 22.04 / 12.6Ubuntu 22.04 / 12.4Ubuntu 18.04 / 9.1
PCIe 链路差别分析:Tegra 与 RTX A4000 受载板/主板 PCIe 插槽限定均为 Gen3 x4,峰值带宽处于同一量级。H100 地点服务器提供 Gen3 x8 插槽,带宽约为前两者的 2 倍。
4. 接入指南

4.1 四步接入 GPU Direct
  1. // 1. 分配 GPU 缓冲区
  2. cudaMalloc(&gpuBuf, size);
  3. // 2. Pin 锁定 (仅需一次,初始化阶段完成)
  4. HelloFPGA_GPUDirect_Pin(hDev, gpuBuf, size, &handle);
  5. // 3. DMA 传输 (可无限复用 handle)
  6. HelloFPGA_GPUDirect_ReadC2H(hDev, ch, handle, fpgaAddr, size, timeout);
  7. HelloFPGA_GPUDirect_WriteH2C(hDev, ch, handle, fpgaAddr, size, timeout);
  8. // 4. 释放 (程序退出时)
  9. HelloFPGA_GPUDirect_Unpin(hDev, handle);
复制代码
4.2 关键束缚

束缚分析4K 对齐GPU 缓冲地点和巨细必须 4096 字节对齐Pin 仅一次初始化时 Pin,后续复用 Handle,制止循环中频仍 Pin/Unpin最小传输块 ≥ 64KB小包 (< 4KB) 中 DMA 创建开销占比大,上风有限需 root 权限GPU Direct ioctl 需特权访问装备文件4.3 主动平台适配

API 内部主动检测平台范例(Tegra / Desktop),用户代码无需条件编译:
  1. HelloFPGA_GetGPUStatus(&status);
  2. // status.platform: 1 = Tegra (cudaHostAlloc), 2 = Desktop (cudaMalloc)
  3. // status.supported: 1 = GPU Direct 可用
复制代码
5. 总结

HelloFPGA GPU Direct RDMA 方案的焦点上风:
上风数据支持高性能H100 峰值 7.37 GB/s (达 PCIe 极限 93.5%),帧率 6600+ fps高可靠三平台 15/15 全通过,12 小时无退化广兼容aarch64 + x86_64 / CUDA 9.1~12.6 / Ubuntu 18.04~22.04零改造TransferMode 仅需 2 行代码,老接口主动加快生产级多缓冲、多装备、历程互斥、错误规复参考 :
https://docs.nvidia.com/cuda/gpudirect-rdma/index.html
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表