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[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 µs94 % 的时间在等固定开销把块长换大能到多少写3387 MB/s8 MiB、读2517 MB/s1 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.1PCIeGen2 ×88b/10b 之后理论 4.0 GB/sDDR32 GB64 bit800 MHztCK 1.25 nsMIG 配置PHY 与 ui_clk 比 4:1ui_clk 200 MHz应用侧 512 bitXDMAAXI Memory Mapped1 条 H2C 1 条 C2H数据宽度 128 bit上位机WindowsPython ctypes直接调 Win32 的 ReadFile / WriteFile数据通路只有一条还没有加入RTL上位机 → XDMAM_AXI 128 bit 250 MHz→ axi_smc_1 → MIGS_AXI 512 bit 200 MHz→ DDR31.3 三个术语与测量口径本文所有测量都是从 DDR 偏移 0 开始的一段连续地址。计时有两种口径后面全靠这个区分口径谁等谁用来回答同向连发后一笔在前一笔完成前就已经进了驱动队列固定开销被部分重叠这条链路能跑多快串行单笔写完立刻读每一笔都要等完整的一次往返一笔 DMA 的最短往返是多少★怎么测的每档先跑一次暖机不计入统计再连跑 5 次4 MiB 以上跑 8 次取最好。取最好而不是取平均是因为要量的是硬件的可达上限不是含系统抖动的平均表现。冷启动第一笔明显偏慢4 KiB 冷启动 0.196 ms不能当稳态值。2 不同块长下的吞吐对比结果块长写 MB/s读 MB/s读 Gbit/s读耗时 µs校验4 KiB204.8203.81.620.1OK8 KiB386.4407.63.320.1OK16 KiB697.2685.55.523.9OK32 KiB1141.71118.48.929.3OK64 KiB1776.01729.213.837.9OK128 KiB2336.42263.818.157.9OK256 KiB2788.82542.620.3103.1OK512 KiB3080.42345.818.8223.5OK1 MiB3179.42517.020.1416.6OK2 MiB ※3134.32475.419.8847.2OK3 MiB2961.82440.219.51289.1OK4 MiB ※3194.22510.720.11670.6OK5 MiB3271.72517.220.12082.8OK6 MiB3292.42521.320.22495.3OK8 MiB3387.02496.520.03360.1OK※ 这一档测过两轮每轮内部先取最好表中取两轮中较好的一次。三个读数要点写一路往上爬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 µs204.8 MB/s几乎不用等固定开销被后一笔重叠掉一部分串行单笔33.0 µs124.5 MB/s写完成后才发读每笔都吃满一次完整往返架构二帧流30.8 µs133 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每字节成本折算带宽 B1 MiB 校验4 MiB 校验写18.8 µs0.293 ns/B3413 MB/s模型 326 / 实测 330−1 %模型 1248 / 实测 1313−5 %读18.5 µs0.398 ns/B2510 MB/s模型 436 / 实测 4175 %模型 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读C2HTLP 语义posted主机发完就走不等板卡回话non-posted每一笔都要等 completion 回来板卡内部时序数据到 → 写进 DDR → 完事收到 MRd → 发 AXI AR →等 DDR 读延迟→ 收 R 数据 → 组 completion TLP 回主机掩盖手段不需要链路自己就是流水只能靠同时在传的字节数去摊薄这个往返上限估计受 TLP 效率限制 ⇒ 4000 × 0.85 ≈ 3400受在传字节 ÷ RTT限制把读当成一个在传窗口问题算一下就自洽了。稳态吞吐等于在传字节除以往返时延B_读 在传字节 / RTT 2510 MB/s 在传字节 / RTT ⇒ 这个比值 2.51 KB/µs两种组合都能对上已知量假设 RTT反推在飞字节与已知量的关系1.0 µs2.5 KB与 XDMA 片上读缓冲同量级1.6 µs4.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相位带宽相对单向写H2C1656.3 MB/s单向写 3179 的52.1 %读C2H819.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 / MIGMIG 应用侧 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 µsCPU 不是这 1.36 倍的来源6.3 最可能的归因与一条便宜的判别唯一处在 4.0 GB/s 量级的共享资源是XDMA 那个 128 bit 250 MHz 的 AXI 主口写和读走的是同一个口。数字上对得很齐单向写 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 倍以上。下一篇《PCIe DDR架构二实测——更改上位机数据处理方式带宽从1051.4 MB/s 涨到 1926.3 MB/s》
阅读完成 · 觉得有帮助?