FPGA XDMA VS MMIO
PCIe XDMA vs BAR 直接映射(MMIO)速度结论
一句话总览
- 大块连续数据流(采集 / 回放 / 图像):XDMA 远快于 BAR 直接映射,带宽接近 PCIe 物理极限、CPU 占用极低;
- 极小数据包(寄存器读写、几字节控制指令):BAR MMIO 延迟更低、更快;
- 读操作差距极大:BAR 读往返延迟高,XDMA 批量读碾压 MMIO。
一、两种方式底层原理
1. BAR 直接映射(MMIO/PIO)
把 FPGA 内部寄存器 / 片上 RAM 映射到主机虚拟地址,CPU 主动发起读写:
- 写:CPU store → PCIe MemWr Posted TLP,无需回复;
- 读:CPU load → PCIe MemRd → FPGA 返回 CplD 完成包,CPU 阻塞等待往返;
- 本质:CPU 逐字节 / 逐 Burst 搬运数据,每一笔访问都占用 CPU 流水线;
- 内存属性:必须
nocache/wc写合并,CPU 缓存失效,单次访问开销大。
2. XDMA(SG-DMA)
FPGA 内置硬件 DMA 引擎,绕过 CPU 直接访问主机系统内存:
- CPU 仅下发描述符(源地址、长度、方向);
- FPGA 硬件自主发起 PCIe 读写大块数据;
- 传输完成仅发一次 MSI 中断通知 CPU;
- 支持分散聚集 SG,无需连续物理内存,大 Burst 打包,PCIe 链路利用率拉满。
二、核心性能对比(PCIe Gen3 x8 实测典型值)
表格
| 维度 | BAR 直接映射 (MMIO) | XDMA SG-DMA |
|---|---|---|
| 峰值带宽 | 300~800MB/s,CPU 瓶颈,无法跑满 PCIe | 3.2~3.6GB/s,逼近 PCIe 理论上限 (4GB/s 单向) |
| CPU 占用 | 极高(循环读写占用单核 100%) | 极低(<5%,仅下发描述符) |
| 单次延迟 (小包) | 写~200ns;读~800~1200ns(往返) | 初始化描述符开销~1~3μs,小包吃亏 |
| 大块吞吐量延迟 | 累积延迟极高,CPU 循环拖慢整体 | 硬件流水线搬运,稳定低抖动 |
| 读性能 | 极差,每笔读都等返回包,带宽暴跌 | 批量读硬件预取,读写对称带宽 |
| 适用传输长度 | ≤1KB 寄存器、少量控制命令 | ≥4KB,MB/GB 级连续数据流(雷达 / 图像 / 采集) |
| 零拷贝能力 | FPGA 侧内存有限,无法主机 DDR 直传 | 完全零拷贝,FPGA ↔ 主机 DDR 直连 |
三、分场景详细速度分析
场景 1:大数据块(1MB+,最常用采集场景)
XDMA 速度是 BAR 映射的 4~10 倍
- BAR 映射:CPU 循环 memcpy/AVX 写 MMIO 地址,每次写都触发 PCIe 小包 TLP,总线碎片化;CPU 持续占用,内存屏障、TLB 失效持续拖慢速度;
- XDMA:硬件自动组超大 Burst TLP,填满 PCIe 链路;CPU 只需要一次 ioctl 下发任务,后台 DMA 并行传输,无 CPU 拷贝开销。 实测:Gen3 x8 传输 1GB 数据
- BAR MMIO:约 1.2~1.8s
- XDMA:0.25~0.3s
场景 2:极小数据包(1~64 字节,寄存器控制)
BAR MMIO 更快XDMA 需要配置 DMA 描述符、队列、中断,初始化开销远大于直接 MMIO 单次访问; 比如读写 32bit 状态寄存器,MMIO 仅几百 ns,XDMA 要微秒级启动开销。
场景 3:读操作(FPGA→主机取数据)
差距被放大:
- BAR 读:每一次 load 都要等 PCIe 往返完成包,流水线阻塞,带宽甚至不足 100MB/s;
- XDMA 读:硬件批量预取,一次描述符拉取整段内存,读写带宽几乎持平。
场景 4:非连续内存(零散 buffer)
XDMA 优势巨大:支持 SG 分散聚集,多段内存一次传输; BAR 映射只能连续访问,多段数据需要 CPU 分段拷贝,额外开销。
四、优缺点总结
BAR 直接映射(MMIO)
✅ 优点:
- 小包控制延迟最低,驱动简单;
- 无需 DMA 描述符、中断管理,适合简单寄存器交互; ❌ 缺点:
- 大带宽完全拉胯,CPU 满载;
- 读性能极差;
- 只能访问 FPGA 片上 BAR 空间,不能直接操作主机大容量 DDR。
XDMA
✅ 优点:
- 大块数据带宽天花板,释放 PCIe 全部性能;
- CPU 占用极低,后台并行传输;
- 支持主机 DDR ↔ FPGA 高速互通,零拷贝;
- SG 支持碎片化内存,多通道并发; ❌ 缺点:
- 极小数据包有固定启动开销;
- FPGA 逻辑资源消耗更大,驱动逻辑复杂一点。
五、选型建议
- 高速采集、视频、雷达、大容量数据流→ 必选 XDMA;
- 仅寄存器读写、少量控制指令、小包交互→ 用 BAR MMIO;
- 混合系统:BAR 做命令控制,XDMA 走数据通路,两者配合最优。