FPGA PCIe P2P通讯 实现 GPU Direct RDMA
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 显存进行数据交换。
传统路径: FPGA ──DMA──→ CPU内存 ──cudaMemcpy──→ GPU显存 (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) | |
|---|---|---|---|
| 定位 | 嵌入式边缘计算 | 高性能服务器 | 通用工作站 |
| CPU | ARM Cortex-A78AE | Intel Xeon 8462Y+ | Intel Core (x86) |
| GPU | 集成 Ampere GPU | H100 PCIe (80GB HBM2e) | RTX A4000 (16GB GDDR6) |
| FPGA PCIe | Gen3 x4 | Gen3 x8 | Gen3 x4 (受主板插槽限制) |
| FPGA 端内存 | DDR4 2GB | DDR4 2GB | DDR4 2GB |
| OS | Ubuntu 22.04 (aarch64) | Ubuntu 22.04 (x86_64) | Ubuntu 18.04 (x86_64) |
| CUDA | 12.6 | 12.4 | 9.1 |
| glibc | 2.35 | 2.35 | 2.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 驱动架构
用户空间: libHelloFPGACore.so (TransferMode API)
│
├─ CPU 模式: open → read/write (传统路径)
└─ GPU Direct: open → ioctl (Pin/Xfer/Unpin)
│
内核空间: HelloFPGA.ko (XDMA + GPU Direct 扩展)
│
硬 件: 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) | H100 | RTX A4000 |
|---|---|---|---|
| GetStatus 平台识别 | ✅ | ✅ | ✅ |
| 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 x4 | 2.84 GB/s | ~3.94 GB/s | 72% |
| H100 | Gen3 x8 | 7.37 GB/s | ~7.88 GB/s | 93.5% |
| RTX A4000 | Gen3 x4 | 3.51 GB/s | ~3.94 GB/s | 89% |
H100 平台 GPU Direct 带宽达 PCIe Gen3 x8 理论极限的 93.5%,RTX A4000 达 Gen3 x4 的 89%,传输效率业界领先。
3.2.2 加速比(相比传统 FPGA→CPU→GPU 全路径)
| 平台 | Read 加速 | Write 加速 | 测试条件 |
|---|---|---|---|
| Tegra (Orin) | 1.97x | 2.49x | 4MB 块, 12h 平均 |
| H100 | 2.78x | 3.17x | 4MB 块, 12h 平均 |
| RTX A4000 | 1.40x | 1.44x | 8MB 块, 单次 |
GPU Direct 相比传统全路径,消除 cudaMemcpy 中间拷贝是主要收益来源,加速比 1.4x~3.2x。
3.2.3 多尺寸性能(RTX A4000 示例)
| 数据大小 | GPU Direct Read | GPU Direct Write | 加速比 (vs 全路径) |
|---|---|---|---|
| 4KB | 41.2 μs | 19.8 μs | 1.32x / 2.81x |
| 64KB | 30.2 μs | 39.8 μs | 1.60x / 1.49x |
| 1MB | 318.6 μs | 336.6 μs | 1.43x / 1.50x |
| 4MB | 1219.4 μs | 1236.0 μs | 1.40x / 1.44x |
| 8MB | 2390.6 μs | 2430.8 μs | 1.42x / 1.44x |
从 64KB 起 GPU Direct 全面领先,大包场景稳定保持 1.4x 加速比。Tegra 和 H100 平台数据详见附录。
3.2.4 等效帧率 (1MB/帧)
| 平台 | 多缓冲区帧率 | 单缓冲区帧率 | 差异 |
|---|---|---|---|
| Tegra (Orin) | 1993 fps | 2033 fps | 0.98x |
| H100 | 6661 fps | 6658 fps | 1.00x |
| RTX A4000 | 3136 fps | 3127 fps | 1.00x |
多缓冲区轮转无性能损失,4 帧轮转与单帧性能完全一致,完美适配图像采集流水线场景。
3.3 TransferMode:零代码改造升级
用户仅需新增 2 行配置代码,已有的 HelloFPGA_DMA_MM_* 调用即可自动切换为 GPU Direct 路径:
HelloFPGA_SetGPUBuffer(hDev, gpuAddr, size); // 新增: 注册 GPU 缓冲
HelloFPGA_SetTransferMode(hDev, HELLOFPGA_XFER_MODE_GPU_PINNED); // 新增: 切换模式
HelloFPGA_DMA_MM_ReadC2H(hDev, ch, buf, offset, len, &actual); // 原有代码不变!
TransferMode 加速比(三平台对比)
| 数据大小 | Tegra (Wr/Rd) | H100 (Wr/Rd) | RTX A4000 (Wr/Rd) |
|---|---|---|---|
| 4KB | 1.26x / 1.38x | 1.08x / 1.25x | 1.93x / 1.85x |
| 1MB | 1.39x / 1.45x | 1.10x / 1.14x | 1.14x / 1.12x |
| 4MB | 1.41x / 1.46x | 1.11x / 1.15x | 1.07x / 1.09x |
RTX A4000 在 4KB 小包场景加速比达 1.93x,尤为显著。H100 因 Gen3 x8 带宽充裕,CPU DMA 本身已接近峰值,加速比 ~1.1x 属正常。
3.4 12 小时长稳态测试
Tegra 平台 (4MB, 72 次采样)
| 指标 | Read | Write |
|---|---|---|
| 平均时延 | 1785.1 μs | 1489.0 μs |
| 平均带宽 | 2.35 GB/s | 2.82 GB/s |
| 0~4h → 8~12h 漂移 | < 0.3% | < 0.3% |
| 功耗 | 18.2~18.9W (稳定) | 无热节流 |
H100 平台 (4MB, 72 次采样)
| 指标 | Read | Write |
|---|---|---|
| 平均时延 | 601.0 μs | 620.4 μs |
| 平均带宽 | 6.98 GB/s | 6.76 GB/s |
| 0~4h → 8~12h 漂移 | < 0.4% | < 0.4% |
双平台 12 小时连续运行无性能退化,GPU Direct 方案具备生产级稳定性。
3.5 三平台对比总览
| 指标 | Tegra (Orin) | H100 | RTX A4000 |
|---|---|---|---|
| PCIe 链路 | Gen3 x4 | Gen3 x8 | Gen3 x4 |
| 峰值带宽 | 2.84 GB/s | 7.37 GB/s | 3.51 GB/s |
| 1MB Read | 521.2 μs | 152.2 μs | 318.6 μs |
| 1MB Write | 412.6 μs | 159.2 μs | 336.6 μs |
| 帧率 (1MB) | 1993 fps | 6661 fps | 3136 fps |
| 12h 稳定性 | ✅ 无退化 | ✅ 无退化 | — |
| 2GB 地址覆盖 | ✅ | ✅ | ✅ |
| 数据正确性 | ✅ | ✅ | ✅ |
| OS / CUDA | Ubuntu 22.04 / 12.6 | Ubuntu 22.04 / 12.4 | Ubuntu 18.04 / 9.1 |
PCIe 链路差异说明:Tegra 与 RTX A4000 受载板/主板 PCIe 插槽限制均为 Gen3 x4,峰值带宽处于同一量级。H100 所在服务器提供 Gen3 x8 插槽,带宽约为前两者的 2 倍。
4. 接入指南
4.1 四步接入 GPU Direct
// 1. 分配 GPU 缓冲区
cudaMalloc(&gpuBuf, size);
// 2. Pin 锁定 (仅需一次,初始化阶段完成)
HelloFPGA_GPUDirect_Pin(hDev, gpuBuf, size, &handle);
// 3. DMA 传输 (可无限复用 handle)
HelloFPGA_GPUDirect_ReadC2H(hDev, ch, handle, fpgaAddr, size, timeout);
HelloFPGA_GPUDirect_WriteH2C(hDev, ch, handle, fpgaAddr, size, timeout);
// 4. 释放 (程序退出时)
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),用户代码无需条件编译:
HelloFPGA_GetGPUStatus(&status);
// status.platform: 1 = Tegra (cudaHostAlloc), 2 = Desktop (cudaMalloc)
// 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 行代码,老接口自动加速 |
| 生产级 | 多缓冲、多设备、进程互斥、错误恢复 |

浙公网安备 33010602011771号