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 行代码,老接口自动加速
生产级 多缓冲、多设备、进程互斥、错误恢复

参考 :
https://docs.nvidia.com/cuda/gpudirect-rdma/index.html

posted @ 2026-07-08 09:47  Hello-FPGA  阅读(9)  评论(0)    收藏  举报