PCIe + DDR架构(一):实测------块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s
本篇给出架构一(把 DDR3 当大缓存,XDMA 以 AXI 内存映射模式直接读写)的完整测量结果:块长从 4 KiB 到 8 MiB 的吞吐曲线、一笔 DMA 的耗时构成、读写两个方向的成本差异,以及读写并发。
这是四架构对比里的第三套。前面讲过 AXI-Stream 架构 (架构二,5 篇)和多通道架构 (架构四,3 篇),两者都停在 133 MB/s 附近,结论都是"这是每通道上限,解法是加通道"。本篇换一个方向:不加通道,把每一笔搬大。
### 文章目录
- [PCIe + DDR架构(一):实测------块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [@toc](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [0 主要结论](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [1 要回答的问题与工程搭建](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少?](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [1.2 工程搭建](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [1.3 三个术语与测量口径](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [2 不同块长下的吞吐对比结果](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [3 同样 4 KiB、三种口径的对比结果](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [4 一笔 DMA 的耗时构成](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [5 不同方向上的成本对比结果](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [6 读写并发的对比结果](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [6.1 得出的三条结论](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [6.2 另外三条反向结论](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [6.3 最可能的归因与一条便宜的判别](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [7 与另外两种架构的对比结果](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
- [8 小结](#文章目录 PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s @[toc] 0 主要结论 1 要回答的问题与工程搭建 1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少? 1.2 工程搭建 1.3 三个术语与测量口径 2 不同块长下的吞吐对比结果 3 同样 4 KiB、三种口径的对比结果 4 一笔 DMA 的耗时构成 5 不同方向上的成本对比结果 6 读写并发的对比结果 6.1 得出的三条结论 6.2 另外三条反向结论 6.3 最可能的归因与一条便宜的判别 7 与另外两种架构的对比结果 8 小结)
0 主要结论
| 问题 | 架构一上的实测结论 |
|---|---|
| 一笔 4 KiB 能跑多快? | 写 204.8 MB/s 、读 203.8 MB/s ;一笔耗时 20.0 µs,其中真正在传数据只有 1.2 µs,94 % 的时间在等固定开销 |
| 把块长换大能到多少? | 写 3387 MB/s (8 MiB)、读 2517 MB/s (1 MiB)⇒ 比 4 KiB 高 15.5 倍 / 12.4 倍 |
| 每一笔的固定开销是多少? | 19 µs,且读写相同 (写 18.8 / 读 18.5)。模型 t = 19 µs + N / B 在 1 到 8 MiB 全段偏差 ≤6 % |
| 读为什么到不了写那么高? | 不是固定开销,而是每字节成本 :读 0.398 ns/B、写 0.293 ns/B,差 1.36 倍,且不随块长变化 |
| 读有天花板吗? | 有,而且很低:256 KiB 就封顶 2471 ± 60 MB/s(链路理论 4000 的 62 %),到 8 MiB 一分不涨;写同期是 85 % |
| 读写同时跑呢? | 合计 2476 MB/s ,约等于单向读的上限,不是相加。写降到单向的 52 %、读降到 33 %,但数据仍然全对 |
| 与另外两种架构比呢? | 单向读 2517 是架构二 133 的 18.9 倍 ;并发 2476 是架构四双通道 272 的 9.1 倍 |
结论:限制吞吐的不是带宽,是每一笔都要重新付一次的固定开销。 同一块板、同一套链路,只把一笔从 4 KiB 换成 1 MiB,写从 204.8 涨到 3387、读从 203.8 涨到 2517。
1 要回答的问题与工程搭建
1.1 如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少?
架构二 走一条 C2H 通道,实测 115.94 MB/s 。架构四 把通道拆成两条,每条各自跑到 135.6 / 136.6 MB/s ,两条聚合 232 MB/s (只搬数据不校验时是 **272 MB/s **)。也就是说:133 MB/s 是"每一条通道"的上限,而 272 MB/s 是"多加一条通道之后整机"的上限 ------ 后者只是前者的两倍,并没有跳出这个数量级。
前两篇给出的结论是:这 133 MB/s 与链路无关,因为 4000 MB/s 的链路只用了 6.8 %;要往上走得加通道。
但还有一个方向没试过:不加通道,把每一笔搬得更大,会怎样? 架构二与架构四都是"一帧 4096 字节就发一笔",那么如果一笔 DMA 搬的不是 4 KiB 而是 1 MiB,那个 133 MB/s 会变成多少?
1.2 工程搭建

| 项 | 值 |
|---|---|
| 器件 | XC7K325T |
| 工具 | Vivado 2023.1 |
| PCIe | Gen2 ×8,8b/10b 之后理论 4.0 GB/s |
| DDR3 | 2 GB,64 bit,800 MHz(tCK 1.25 ns) |
| MIG 配置 | PHY 与 ui_clk 比 4:1,ui_clk 200 MHz,应用侧 512 bit |
| XDMA | AXI Memory Mapped,1 条 H2C + 1 条 C2H,数据宽度 128 bit |
| 上位机 | Windows,Python + ctypes,直接调 Win32 的 ReadFile / WriteFile |
数据通路只有一条,还没有加入RTL:
text
上位机 → XDMA(M_AXI 128 bit @250 MHz)→ axi_smc_1 → MIG(S_AXI 512 bit @200 MHz)→ DDR3
1.3 三个术语与测量口径
本文所有测量都是"从 DDR 偏移 0 开始的一段连续地址"。
计时有两种口径,后面全靠这个区分:
| 口径 | 谁等谁 | 用来回答 |
|---|---|---|
| 同向连发 | 后一笔在前一笔完成前就已经进了驱动队列,固定开销被部分重叠 | 这条链路能跑多快 |
| 串行单笔 | 写完立刻读,每一笔都要等完整的一次往返 | 一笔 DMA 的最短往返是多少 |
★ 怎么测的 :每档先跑一次暖机(不计入统计),再连跑 5 次(4 MiB 以上跑 8 次)取最好。取最好而不是取平均,是因为要量的是硬件的可达上限,不是含系统抖动的平均表现。冷启动第一笔明显偏慢(4 KiB 冷启动 0.196 ms),不能当稳态值。
2 不同块长下的吞吐对比结果

| 块长 | 写 MB/s | 读 MB/s | 读 Gbit/s | 读耗时 µs | 校验 |
|---|---|---|---|---|---|
| 4 KiB | 204.8 | 203.8 | 1.6 | 20.1 | OK |
| 8 KiB | 386.4 | 407.6 | 3.3 | 20.1 | OK |
| 16 KiB | 697.2 | 685.5 | 5.5 | 23.9 | OK |
| 32 KiB | 1141.7 | 1118.4 | 8.9 | 29.3 | OK |
| 64 KiB | 1776.0 | 1729.2 | 13.8 | 37.9 | OK |
| 128 KiB | 2336.4 | 2263.8 | 18.1 | 57.9 | OK |
| 256 KiB | 2788.8 | 2542.6 | 20.3 | 103.1 | OK |
| 512 KiB | 3080.4 | 2345.8 | 18.8 | 223.5 | OK |
| 1 MiB | 3179.4 | 2517.0 | 20.1 | 416.6 | OK |
| 2 MiB ※ | 3134.3 | 2475.4 | 19.8 | 847.2 | OK |
| 3 MiB | 2961.8 | 2440.2 | 19.5 | 1289.1 | OK |
| 4 MiB ※ | 3194.2 | 2510.7 | 20.1 | 1670.6 | OK |
| 5 MiB | 3271.7 | 2517.2 | 20.1 | 2082.8 | OK |
| 6 MiB | 3292.4 | 2521.3 | 20.2 | 2495.3 | OK |
| 8 MiB | 3387.0 | 2496.5 | 20.0 | 3360.1 | OK |
※ 这一档测过两轮(每轮内部先取最好),表中取两轮中较好的一次。
三个读数要点:
- 写一路往上爬 ,1 MiB 之后进入平台 3190 ± 115 MB/s(±3.6 %) ,8 MiB 摸到 3387 ,是链路理论 4000 的 85 %。
- 读在 256 KiB 就封顶 ,从 256 KiB 到 8 MiB 共 9 个块长、11 次测量全部落在 2471 ± 60 MB/s(±2.4 %) 的平顶里,只用了链路的 62 %。
- 4 KiB 这一档读写几乎一样(204.8 / 203.8),因为两个方向都在等同一个固定开销。
3 同样 4 KiB、三种口径的对比结果

同样搬 4096 字节,手上有三个数:204.8 / 124.5 / 133。它们都对,回答的是不同问题。
| 口径 | 4 KiB 耗时 | 吞吐 | 谁在等 |
|---|---|---|---|
| 同向连发 | 20.0 µs | 204.8 MB/s | 几乎不用等,固定开销被后一笔重叠掉一部分 |
| 串行单笔 | 33.0 µs | 124.5 MB/s | 写完成后才发读,每笔都吃满一次完整往返 |
| 架构二帧流 | 30.8 µs | 133 MB/s | 逐帧等 tready,一帧收完才发下一帧 |
133 与 124.5 只差 6.8 %,这不是巧合。 架构二的帧流是一帧一等,等价于串行单笔;它的 133 正好等于 4096 B ÷ 30.8 µs,落在串行那条线上,比串行单笔还快一点点(因为它的固定开销略小)。
所以拿哪个数做对比,取决于要说哪件事:
- 要说"同样搬 4 KiB,架构一是不是比架构二强" ⇒ 用 205 对 133,那 54 % 的差距就是帧式路径的额外成本。
- 要说"一笔 DMA 的最短往返是多少" ⇒ 用 32 µs(串行口径),这是硬件加驱动的真实下限。
- 要说"架构一能做到多少" ⇒ 用大块长的 3179 / 2517,那才是链路的实际能力。
4 一笔 DMA 的耗时构成

把耗时看作是块长的线性函数,可以写成公式 t(N) = t0 + N / B,用 4 KiB 和 8 MiB 两端点解:
| 方向 | 固定成本 t0 | 每字节成本 | 折算带宽 B | 1 MiB 校验 | 4 MiB 校验 |
|---|---|---|---|---|---|
| 写 | 18.8 µs | 0.293 ns/B | 3413 MB/s | 模型 326 / 实测 330(−1 %) | 模型 1248 / 实测 1313(−5 %) |
| 读 | 18.5 µs | 0.398 ns/B | 2510 MB/s | 模型 436 / 实测 417(+5 %) | 模型 1690 / 实测 1740(−3 %) |
模型在 1~8 MiB 全段偏差 ≤6 %。三个有用的推论:
- 4 KiB 的那 20.0 µs 里,真正在传数据的时间只有 1.2 µs。 也就是说这一档 94 % 的时间在等固定开销。所以 4 KiB 只有 204.8 MB/s ------ 这跟 DDR 的 12.8 GB/s、跟链路的 4.0 GB/s 都没有关系。
- 固定成本两个方向一样,都是 19 µs。 所以"读比写慢"不能用"读的往返更长"来解释------单笔的最小往返两向相同。
- 每字节成本比 0.398 / 0.293 = 1.36,是一个常数。 它在 128 KiB 就已经成立,到 8 MiB 都没变过,不随块长动。
★ 怎么测的 :用 4 KiB 和 8 MiB 两端点解这两个未知数。选这两个点是因为它们相距 2048 倍,计时量化误差(±0.5 µs)在 8 MiB 那一端只占 0.02 %,斜率几乎不受污染。
注意:只用两个点解两个未知数是有风险的,任何一端的系统误差都会直接变成"结论"。所以下面每一节的结论都另有交叉验证------1 MiB 与 4 MiB 的模型校验、以及 §5 的边际带宽中位数都与这个拟合一致。
5 不同方向上的成本对比结果
§4 把问题缩小成一句:固定成本相同,每字节成本读是写的 1.36 倍。 剩下的就是这 1.36 从哪来。
| 环节 | 写(H2C) | 读(C2H) |
|---|---|---|
| TLP 语义 | posted,主机发完就走,不等板卡回话 | non-posted,每一笔都要等 completion 回来 |
| 板卡内部时序 | 数据到 → 写进 DDR → 完事 | 收到 MRd → 发 AXI AR → 等 DDR 读延迟 → 收 R 数据 → 组 completion TLP 回主机 |
| 掩盖手段 | 不需要,链路自己就是流水 | 只能靠同时在传的字节数去摊薄这个往返 |
| 上限估计 | 受 TLP 效率限制 ⇒ 4000 × 0.85 ≈ 3400 | 受 在传字节 ÷ RTT 限制 |
把读当成一个"在传窗口"问题算一下就自洽了。 稳态吞吐等于在传字节除以往返时延:
text
B_读 = 在传字节 / RTT
2510 MB/s = 在传字节 / RTT ⇒ 这个比值 = 2.51 KB/µs
两种组合都能对上已知量:
| 假设 RTT | 反推在飞字节 | 与已知量的关系 |
|---|---|---|
| 1.0 µs | 2.5 KB | 与 XDMA 片上读缓冲同量级 |
| 1.6 µs | 4.0 KB | 正好等于架构四那轮量到的 ≈4 KiB 片上缓冲 |
这一步只能定出比值,定不出两个数(在传字节和RTT)各自是多少。 RTT 并没有实测过,1 µs 是量级假设;真实的 RTT 由 PCIe 一次 MRd/completion 往返(约 0.4 到 0.6 µs)、AXI 跨域加互连(约 0.1 µs)、DDR3 读延迟(约 0.04 µs)加起来,落在 0.5 到 0.8 µs,反推窗口在 1.3~2.0 KB。所以可以说"读带宽受在传窗口限制、因此是常数比例"这个形状 (它解释了为什么加大块长摊不动这 1.36 倍),仍然不知道"窗口究竟是 2.5 KB 还是 4 KB"。
DDR 侧不是瓶颈,这一点是确定的: MIG 的应用侧是 512 bit × 200 MHz = 12.8 GB/s,实测读只有 2.5 GB/s,用掉 20 %;写 3.4 GB/s 用掉 27 %。读写共享这 12.8 GB/s,双向加起来也没到 5 GB/s。所以读的 62 % 换 DDR 配置救不了,换 RTL 也救不了------瓶颈在 XDMA 内部的读缓冲与请求条目数,不在我们的 AXI 通路上。
★ 怎么测的 :每字节成本由 §4 的两端点拟合给出;再逐段算边际带宽(相邻两点的
Δt / Δn)做交叉验证------写在 64 KiB~8 MiB 的边际中位数是 3413 ,读是 2421,与拟合值分别差 0 % 和 3.5 %。读的边际中位数与平台均值 2471 几乎相等,说明这个区间里已经摊不出任何固定成本,剩下的全是每字节成本。
6 读写并发的对比结果

一条 1 MiB 的写线程和一条 1 MiB 的读线程同时跑 10 s:
| 相位 | 带宽 | 相对单向 |
|---|---|---|
| 写(H2C) | 1656.3 MB/s | 单向写 3179 的 52.1 % |
| 读(C2H) | 819.8 MB/s | 单向读 2517 的 32.6 % |
| 合计 | 2476.1 MB/s | 单向写的 77.6 % ,单向读的 98.4 % |
6.1 得出的三条结论
- 并发不等于相加。 合计 2476 小于单向写的 3190 ⇒ 读写走的是同一条通路,不是各走各的。
- 合计几乎正好等于单向读的上限 (2476 对 2517,差 1.6 %)。只要掺进读,总吞吐就被拉到 62 % 那一档------与此前所有读数一致:读的效率就是整机效率的下限。
- 当大缓存用完全够。 并发 2476 是架构四双通道 272 的 9.1 倍 、架构二 133 的 18.6 倍。而且真实采集里"攒"和"传"在时间上本来就分得开,分时用法能各拿满速;并发这一档是"边采边传"时的保底值。
6.2 另外三条反向结论
| 不能这么说 | 为什么 |
|---|---|
| ❌ 瓶颈在 DDR / MIG | MIG 应用侧 12.8 GB/s,实测合计只用到 19 %。而且 1 MiB 块长下读写各持续约 0.6 ms,切换频率极低,行切换代价摊不出来 |
| ❌ 瓶颈在 PCIe 链路 | Gen2 ×8 是全双工 ,每个方向各 4.0 GB/s、双向合计 8.0 GB/s,实测 2476 只用了 31 % |
| ❌ 瓶颈在主机 CPU | 单向读 2517 时 CPU 尚有富余;两个方向的固定开销都是 19 µs,CPU 不是这 1.36 倍的来源 |
6.3 最可能的归因与一条便宜的判别
唯一处在 4.0 GB/s 量级的共享资源,是 XDMA 那个 128 bit @250 MHz 的 AXI 主口:写和读走的是同一个口。数字上对得很齐:
text
单向写 3190 = 4000 × 85 %
单向读 2517 = 4000 × 63 %
读写并发 2476 = 4000 × 62 % ← 混合时的效率等于读单独跑时的效率
判别办法不改任何 RTL,只换读写比例再跑 10 s:若合计仍约 2476,说明是那个共享主口的固定上限,与比例无关;若合计随写占比升高而上升(趋近 3190),说明是"读把通路效率拉低",混合比例可以调优。
7 与另外两种架构的对比结果
| 架构 | 路径 | 参考带宽 | 相对架构二 |
|---|---|---|---|
| 架构二 AXI-Stream | 帧流 C2H,逐帧等 | 115.9 MB/s | ×1 |
| 架构四 多通道 | 2×C2H 帧流,2 核 | 232 MB/s(仅搬运 272) | ×2.0 |
| 架构一 大缓存 | MM 直接读写 DDR | 写 3387 / 读 2517 / 并发 2476 | ×21.7 |
三个结论:
- 133 不是硬件能力,是帧式路径的产物。 同一条链路、同一块板,只把"一笔搬多少"从 4 KiB 换成 1 MiB,就把 133 变成 2517。前一篇文章里"272 是本器件天花板"这句话的适用范围,到这里要收窄为"帧式路径的天花板"。
- 三种架构分别适用于不同的应用场景。 架构二/四适合"边采边传":每帧到手就走,延迟 30 µs 量级。架构一适合"先攒后传":把数据先堆进 DDR,再整块上传,代价是多了 DDR 这一段延迟,收益是带宽高了近 20 倍。
- 架构一在并发下仍然最高。 即便读写互相抢,合计 2476 也还是架构四双通道 272 的 9.1 倍。所以"把 DDR 当缓存"这条路在本器件上是走得通的。
需要说一下。 这里测的是从主机发起的裸搬内存,不是框架式的帧流:FPGA 侧还没有接内部数据源与校验模块。所以本文能回答"这条链路的搬运能力有多大",还不能回答"接上数据源之后,端到端含校验的可用吞吐是多少"。后者需要把帧源接上再测一次,读者将会在下一篇文章中看到。
8 小结
四句话:
- 一笔 4 KiB 只有 204.8 MB/s,原因不在带宽:20.0 µs 里有 18.8 µs 在等固定开销,真正传数据只占 1.2 µs。
- 摊薄这个固定开销就是 15.5 / 12.4 倍:写 3387、读 2517 MB/s。
- 读封顶在 2.5 GB/s,是链路的 62 %,成因是"在飞窗口 ÷ 往返时延"这个比值固定,加大块长摊不动它。
- 并发合计 2476,不是相加,但也已经是另外两种架构的 9 倍以上。
下一篇做两件事:把数据源与帧校验接上,用与架构二/四同一套帧流口径再测一次,看端到端含校验时这个 2517 还能剩多少。