2.3. 指令说明
2.3.1. 使用说明
执行以下命令启动工具:
Linux / Android 系统:
./pcie_test [device_id] <options>
Windows 系统:
pcie_test.exe [device_id] <options>
指令参数说明如下:
device_id:必选参数。指定逻辑 ID 为<device_id>的后摩设备的信息。可通过后摩 SMI工具查询可用的设备 ID,详情参看《后摩大道® SMI 工具使用指南》。options:可选参数。$LENGTH:指定工具测试的数据块大小,单位为Byte(字节)。如果不设置该参数,工具默认会分别测试传输 1MB、10MB和100MB数据块时的传输速率。该参数最大值为 4294967296(4GB)。工具仅测试指定数据块大小,但仍会遍历默认线程数组合。注意
该参数表示一次测试中所有线程的数据传输总量,并非每个线程分别传输的数据大小。例如,当测试数据块大小为100MB、线程数为4时,工具会将100MB数据划分给4个线程并行传输,而不是每个线程各自传输100MB数据。
用户也可通过 -h 参数查看指令帮助信息。
2.3.2. 测试机制与统计说明
下面对数据传输机制、带宽统计方式及测试结果影响因素进行说明,便于用户正确理解和分析测试结果:
工具默认会对不同线程数和数据块大小组合进行带宽测试,支持的最大线程数为8,默认测试线程数组合包括:1、2、4、8。
带宽统计采用端到端计时方式,计时范围包括:
线程创建。
多线程并行数据传输。
等待所有线程完成数据传输。
因此,测试结果除数据传输时间外,还包含线程创建与等待等多线程管理开销,以及首次数据传输时的初始化开销,反映的是端到端实际传输吞吐率,而非仅统计DMA数据搬运时间的理论峰值带宽。
多线程场景下,工具会将总数据按线程数划分后,由多个线程并行完成数据传输。最后一个线程会负责处理未均分的剩余数据。
测试过程中,工具会依次执行以下操作:
将数据从主机内存传输至后摩设备DDR内存(H2D)。
在后摩设备DDR内部执行数据拷贝(D2D)。
将数据从后摩设备DDR内存传输回主机内存(D2H)。
传输结果数据一致性校验。
工具会输出H2D、D2D、D2H的带宽(MB/s)结果,以及数据一致性校验阶段的处理速率。
H2D、D2D 和 D2H 阶段的带宽计算公式如下:

其中:
size表示当前阶段的总传输数据量,单位为 Byte;Δt表示当前阶段的总耗时,单位为秒(s)。
数据一致性校验阶段用于比较传输前后的数据内容是否一致,以验证数据传输正确性。
该阶段采用独立计时与统计,输出的
memcmp结果表示主机侧数据比较操作的处理速率,不属于 PCIe 或 DMA 数据传输带宽。工具默认不执行链路预热。首次数据传输可能受到缓存初始化或设备初始化等一次性开销影响,因此首次测试结果可能低于后续稳定状态下的测试结果。
在小数据块或低线程数场景下,多线程管理开销与一次性初始化开销占比更高,因此不同轮次测试结果可能存在一定波动。
多线程场景下,测试结果还可能受到主机 CPU 负载和系统运行环境影响。
2.3.3. 使用示例
下面示例展示如何在Linux系统下,检测逻辑设备ID为0的后摩设备与主机间的通信带宽:
./pcie_test 0
2.4. 性能指标与结果解析
工具展示了在线程数为1、2、4、8时,分别传输 1MB、10MB和100MB数据块时的传输速率。
返回结果示例如下:
argc = 2, argv[0] = ./pcie_test
test pcie transfer speed for device 0
use 1 threads to transfer 1.00 MB.
direction: h2d + d2d + d2h, do memcmp to check.
transfer h2d, [->0x2008000000][0x100000]
transfer d2d, [0x2008000000->0x2008100000[0x100000]
transfer d2h, [0x2008100000->][0x100000]
----speed: h2d: 20.968317MB/s, d2d: 1215.066829MB/s, d2h: 1113.585746MB/s, memcmp: 4524.886878MB/s
use 2 threads to transfer 1.00 MB.
direction: h2d + d2d + d2h, do memcmp to check.
transfer h2d, [->0x2008000000][0x100000]
transfer d2d, [0x2008000000->0x2008100000[0x100000]
transfer d2h, [0x2008100000->][0x100000]
----speed: h2d: 1600.000000MB/s, d2d: 1400.560224MB/s, d2h: 1897.533207MB/s, memcmp: 4566.210046MB/s
use 4 threads to transfer 1.00 MB.
direction: h2d + d2d + d2h, do memcmp to check.
transfer h2d, [->0x2008000000][0x100000]
transfer d2d, [0x2008000000->0x2008100000[0x100000]
transfer d2h, [0x2008100000->][0x100000]
----speed: h2d: 1420.454545MB/s, d2d: 1703.577513MB/s, d2h: 1818.181818MB/s, memcmp: 4545.454545MB/s
use 8 threads to transfer 1.00 MB.
direction: h2d + d2d + d2h, do memcmp to check.
transfer h2d, [->0x2008000000][0x100000]
transfer d2d, [0x2008000000->0x2008100000[0x100000]
transfer d2h, [0x2008100000->][0x100000]
----speed: h2d: 1811.594203MB/s, d2d: 1050.420168MB/s, d2h: 1890.359168MB/s, memcmp: 4761.904762MB/s
use 1 threads to transfer 10.00 MB.
direction: h2d + d2d + d2h, do memcmp to check.
transfer h2d, [->0x2008000000][0xA00000]
transfer d2d, [0x2008000000->0x2008A00000[0xA00000]
transfer d2h, [0x2008A00000->][0xA00000]
----speed: h2d: 2452.783910MB/s, d2d: 4185.851821MB/s, d2h: 1685.772084MB/s, memcmp: 6127.450980MB/s
use 2 threads to transfer 10.00 MB.
direction: h2d + d2d + d2h, do memcmp to check.
transfer h2d, [->0x2008000000][0xA00000]
transfer d2d, [0x2008000000->0x2008A00000[0xA00000]
transfer d2h, [0x2008A00000->][0xA00000]
----speed: h2d: 3542.330854MB/s, d2d: 2763.194253MB/s, d2h: 3202.049312MB/s, memcmp: 6211.180124MB/s
use 4 threads to transfer 10.00 MB.
direction: h2d + d2d + d2h, do memcmp to check.
transfer h2d, [->0x2008000000][0xA00000]
transfer d2d, [0x2008000000->0x2008A00000[0xA00000]
transfer d2h, [0x2008A00000->][0xA00000]
----speed: h2d: 4909.180167MB/s, d2d: 4038.772213MB/s, d2h: 4688.232536MB/s, memcmp: 11520.737327MB/s
use 8 threads to transfer 10.00 MB.
direction: h2d + d2d + d2h, do memcmp to check.
transfer h2d, [->0x2008000000][0xA00000]
transfer d2d, [0x2008000000->0x2008A00000[0xA00000]
transfer d2h, [0x2008A00000->][0xA00000]
----speed: h2d: 5020.080321MB/s, d2d: 3901.677721MB/s, d2h: 4967.709886MB/s, memcmp: 14925.373134MB/s
use 1 threads to transfer 100.00 MB.
direction: h2d + d2d + d2h, do memcmp to check.
transfer h2d, [->0x2008000000][0x6400000]
transfer d2d, [0x2008000000->0x200E400000[0x6400000]
transfer d2h, [0x200E400000->][0x6400000]
----speed: h2d: 3863.241259MB/s, d2d: 4058.935747MB/s, d2h: 2282.792312MB/s, memcmp: 4856.254856MB/s
use 2 threads to transfer 100.00 MB.
direction: h2d + d2d + d2h, do memcmp to check.
transfer h2d, [->0x2008000000][0x6400000]
transfer d2d, [0x2008000000->0x200E400000[0x6400000]
transfer d2h, [0x200E400000->][0x6400000]
----speed: h2d: 2984.094775MB/s, d2d: 2960.331557MB/s, d2h: 3062.599534MB/s, memcmp: 4801.920768MB/s
use 4 threads to transfer 100.00 MB.
direction: h2d + d2d + d2h, do memcmp to check.
transfer h2d, [->0x2008000000][0x6400000]
transfer d2d, [0x2008000000->0x200E400000[0x6400000]
transfer d2h, [0x200E400000->][0x6400000]
----speed: h2d: 4886.391400MB/s, d2d: 4175.365344MB/s, d2h: 3679.852806MB/s, memcmp: 8854.258899MB/s
use 8 threads to transfer 100.00 MB.
direction: h2d + d2d + d2h, do memcmp to check.
transfer h2d, [->0x2008000000][0x6400000]
transfer d2d, [0x2008000000->0x200E400000[0x6400000]
transfer d2h, [0x200E400000->][0x6400000]
----speed: h2d: 5814.967727MB/s, d2d: 4287.613086MB/s, d2h: 4661.352725MB/s, memcmp: 8614.748449MB/s
字段参数说明:
transfer h2d, [->ADDR][SIZE]:数据从主机内存(->)传输到M50设备DDR内存的起始地址ADDR。SIZE为传输的数据块大小。transfer d2d, [ADDR1->ADDR2][SIZE]:数据在M50设备芯片内存内部,由芯片内DMA负责数据移动,完成从源地址ADDR1到目标地址ADDR2的数据传输。transfer d2h, [ADDR->][SIZE]:数据从M50设备DDR内存地址ADDR传输回主机内存(->)。SIZE为传输的数据块大小。speed:实际测得的有效带宽。h2d:外部I/O写入吞吐量。衡量主机内存通过PCIe总线将数据流持续写入M50芯片DDR内存的效率。d2d:设备内部拷贝带宽。衡量M50芯片DDR内存子系统的极限访存吞吐量。该速度由芯片内部的DMA硬件负责数据移动,反映了数据在设备DDR内存内部从一个地址复制到另一个地址的效率。d2h:外部I/O读取吞吐量。衡量M50芯片DDR内存通过PCIe总线将数据流持续读取到主机内存的效率。memcmp:数据一致性校验处理速率,用于衡量主机侧对传输前后数据执行一致性比较操作时的处理效率,不属于 PCIe 或 DMA 数据传输带宽。