PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s

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 四架构实测(零):为什么要做这个实验------硬件平台、数据帧格式与测量口径》。

### 文章目录

  • [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. 写一路往上爬 ,1 MiB 之后进入平台 3190 ± 115 MB/s(±3.6 %) ,8 MiB 摸到 3387 ,是链路理论 4000 的 85 %。
  2. 读在 256 KiB 就封顶 ,从 256 KiB 到 8 MiB 共 9 个块长、11 次测量全部落在 2471 ± 60 MB/s(±2.4 %) 的平顶里,只用了链路的 62 %。
  3. 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 %。三个有用的推论:

  1. 4 KiB 的那 20.0 µs 里,真正在传数据的时间只有 1.2 µs。 也就是说这一档 94 % 的时间在等固定开销。所以 4 KiB 只有 204.8 MB/s ------ 这跟 DDR 的 12.8 GB/s、跟链路的 4.0 GB/s 都没有关系。
  2. 固定成本两个方向一样,都是 19 µs。 所以"读比写慢"不能用"读的往返更长"来解释------单笔的最小往返两向相同。
  3. 每字节成本比 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 得出的三条结论

  1. 并发不等于相加。 合计 2476 小于单向写的 3190 ⇒ 读写走的是同一条通路,不是各走各的。
  2. 合计几乎正好等于单向读的上限 (2476 对 2517,差 1.6 %)。只要掺进读,总吞吐就被拉到 62 % 那一档------与此前所有读数一致:读的效率就是整机效率的下限。
  3. 当大缓存用完全够。 并发 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

三个结论:

  1. 133 不是硬件能力,是帧式路径的产物。 同一条链路、同一块板,只把"一笔搬多少"从 4 KiB 换成 1 MiB,就把 133 变成 2517。前一篇文章里"272 是本器件天花板"这句话的适用范围,到这里要收窄为"帧式路径的天花板"。
  2. 三种架构分别适用于不同的应用场景。 架构二/四适合"边采边传":每帧到手就走,延迟 30 µs 量级。架构一适合"先攒后传":把数据先堆进 DDR,再整块上传,代价是多了 DDR 这一段延迟,收益是带宽高了近 20 倍。
  3. 架构一在并发下仍然最高。 即便读写互相抢,合计 2476 也还是架构四双通道 272 的 9.1 倍。所以"把 DDR 当缓存"这条路在本器件上是走得通的。

需要说一下。 这里测的是从主机发起的裸搬内存,不是框架式的帧流:FPGA 侧还没有接内部数据源与校验模块。所以本文能回答"这条链路的搬运能力有多大",还不能回答"接上数据源之后,端到端含校验的可用吞吐是多少"。后者需要把帧源接上再测一次,读者将会在下一篇文章中看到。



8 小结

四句话:

  1. 一笔 4 KiB 只有 204.8 MB/s,原因不在带宽:20.0 µs 里有 18.8 µs 在等固定开销,真正传数据只占 1.2 µs。
  2. 摊薄这个固定开销就是 15.5 / 12.4 倍:写 3387、读 2517 MB/s。
  3. 读封顶在 2.5 GB/s,是链路的 62 %,成因是"在飞窗口 ÷ 往返时延"这个比值固定,加大块长摊不动它。
  4. 并发合计 2476,不是相加,但也已经是另外两种架构的 9 倍以上。

下一篇做两件事:把数据源与帧校验接上,用与架构二/四同一套帧流口径再测一次,看端到端含校验时这个 2517 还能剩多少。


相关推荐
文慧的科技江湖2 小时前
贰号开源零碳园区管理平台
1024程序员节
小白起 v2 小时前
容器云平台的技术与实战
1024程序员节
ZWZhangYu2 小时前
Hermes Agent 接入 QQ Bot 的完整实战
1024程序员节
supabc1232 小时前
欧盟电子发票(XRechnung/Peppol/ZUGFeRD)踩坑记:用 Python 不装 Java 跑官方校验规则
xml·python·开源·电子发票·1024程序员节
热心网友俣先生2 小时前
2026年MathorCup大数据竞赛选题推荐
数学建模·1024程序员节
Zhu7582 小时前
供暖优化方案-济南市-2026
1024程序员节
abckingaa2 小时前
AI时代代码Review瓶颈分析
人工智能·ai编程·1024程序员节
活文字3 小时前
国家疾控局等部署2026—2027流感季:农村“一老一小”可免费接种
资讯·1024程序员节·商业·产业
Together_CZ3 小时前
Introducing Kimi K3.1 Pro——隆重推出 Kimi K3.1 Pro
llm·agent·强化学习·1024程序员节·kimi·kimi k3.1 pro·3t参数