资讯动态

CANN shmem UDMA 低阶接口性能基准测试指南:udma_perftest 详解

发布时间:2026/9/19 13:25:30 来源:尧图企业网站定制
CANN shmem UDMA 低阶接口性能基准测试指南udma_perftest 详解【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem导读udma_perftest是 CANN shmem 项目中面向UDMAUnified Direct Memory Access引擎低阶接口的参数化性能测试示例位于 examples/shmem_perftest/udma_perftest。它通过SHMEMI_PROF_START/END性能打点宏采集aclshmemx_udma_put_nbi/aclshmemx_udma_get_nbi/aclshmemx_udma_put_signal_nbi三个低阶接口在不同数据量、QP 并发数、批量提交模式下的带宽与延时表现输出标准 CSV 并可复用 perf_data_process.py 直接出图。阅读本文后你将掌握该基准的编译运行方法、全部命令行参数的语义、带宽/延时两种口径的计时原理、defer/submit 聚合提交机制以及其与 MTE 版mte_perftest的核心差异并能结合源码理解测试结果的统计口径。注意该脚本测试结果仅做参考性能以实际场景为准。示例定位为什么需要单独测 UDMA 低阶接口CANN shmem 提供多种数据搬移引擎。同目录下的 mte_perftest 面向默认的 MTEMemory Transfer Engine路径而udma_perftest则显式指定ACLSHMEM_DATA_OP_UDMA引擎见 main.cpp 中对attributes.option_attr.data_op_engine_type的设置直接调用 UDMA 低阶接口进行传输从而评估 UDMA 引擎自身的原始性能。两者并行存在便于用户在同等测试维度下横向对比引擎差异。与mte_perftestMTE 版的差异维度mte_perftest(MTE)udma_perftest(UDMA)引擎默认 MTE显式ACLSHMEM_DATA_OP_UDMA多核并发同 peer 多核默认 32 核切分数据block_dimqp_count每个 block 独占一个 QP 和一份独立数据-b/--block-size、--block-range控制核数-b同时控制 QP 数--block-range当前不参与 UDMA 测试UB 缓冲MTE 必需影响传输本 perftest 显式测试 UDMA 低阶接口--ub-size仅用于低阶接口 UB 入参和 CSV高阶 UDMA RMA 默认 MTE staging 需要至少 128 B UB测试模式put / bi_put / get / bi_getput / bi_put / get / bi_get /put_signalSOC 限制通用仅 Ascend950非 950 上 device kernel 内置 abortCSV 文件名test_dtype_pe.csvudma_metric_test_dtype[_qpN]_pe.csv从 perftest_common_types.h 可以看出UDMA 测试模式枚举独立于 MTE 模式TEST_MODE_UDMA_PUT/TEST_MODE_UDMA_BI_PUT/TEST_MODE_UDMA_GET/TEST_MODE_UDMA_BI_GET/TEST_MODE_UDMA_PUT_SIGNAL这也解释了为什么put_signal是本示例独有的测试项。测试目的覆盖五种 UDMA 数据传输模式针对以下 UDMA 数据传输操作的性能单向 Putput仅SHMEM_CYCLE_PROF_PE指定的 PE 调用aclshmemx_udma_put_nbi将数据传输到对端 PE。双向 Putbi_put两个 PE 同时调用 put互相传输数据。单向 Getget仅 prof PE 调用aclshmemx_udma_get_nbi从对端 PE 拉取数据。双向 Getbi_get两个 PE 同时调用 get互相拉取数据。Put Signalput_signal仅 prof PE 调用aclshmemx_udma_put_signal_nbi传输数据后写一个远端信号测试结束做信号值校验。在 kernel 实现udma_perftest_kernel.cpp中单向模式put/get下非 prof PE 直接return退出只有 prof PE 执行搬运双向模式下每个 PE 都通过peer_pe (pe 1) % n_pes与相邻 PE 互传数据。编译说明Ascend950 CANN 9.1.0 是硬性前提UDMA 仅在 Ascend950 上可用需使用已提供 HCOMM 资源接口的 CANN 9.1.0 及以上版本。安装要求和 CANN 资源入口参见 UDMA 样例版本和平台支持说明HcommEndpointCreate、HcommMemReg、HcommChannelCreate、HcommChannelGetStatus等 HCOMM 资源接口由 CANN 9.1.0 提供初始化时会加载并检查所需 HCOMM 符号。source /usr/local/Ascend/ascend-toolkit/set_env.sh bash scripts/build.sh -examples -soc_type Ascend950编译产物为build/bin/udma_perftestrun.sh 会自动设置LD_LIBRARY_PATH包含${PROJECT_ROOT}/build/lib与ASCEND_HOME_PATH/lib64后拉起可执行文件。若 HCOMM 运行时库或符号不完整初始化会失败。使用方法基本用法cd examples/shmem_perftest/udma_perftest/ ./run.sh [选项]命令行参数参数缩写描述默认值--test-type type-t type测试类型 (put / bi_put / get / bi_get / put_signal / all)put--datatype type-d type数据类型 (float / int8 / int16 / int32 / int64 / uint8 / uint16 / uint32 / uint64 / char / all)float--block-size size-b sizeUDMA 使用的 block 数同时作为 QP 数一个 block 对应一个 QP1--block-range min max-UDMA 兼容解析但不参与测试使用-b指定 block/QP 数1 1--exponent exponent-e exponent单个 QP 的数据量幂数 (2^exponent 字节)多 QP 时总数据量为该值乘 QP 数---exponent-range min max-单个 QP 的数据量幂数范围3 17--loop-count count-循环次数1000--ub-size size-UB size (KB)本 perftest 传给低阶 UDMA 接口并写入 CSV。高阶 UDMA RMA 默认 MTE staging 的 UB 配置要求至少 128 B16--metric bw\|lat-性能口径bw测带宽lat测单次 put_nbi 下发延时仅-t put支持bw--batch N-BW 测试批大小0或1使用普通 NBIN 1时每批前N-1个操作使用defer最后一个使用submit随后调用quiet。每个 WQE 在 UB 中占用 64 B要求有效 batch 小于 32768 且N * 64 --ub-size * 1024lat模式忽略此参数。0-pes size-PE 数量2-ipport ip:port-通信地址tcp://127.0.0.1:8768-gnpus num-NPU 数量2-fnpu id-首个 NPU ID0-fpe id-首个 PE ID0-a/--analyse mode-分析模式 (none / plot / md)none脚本层的参数校验细节run.sh 在调用可执行文件前会做一系列合法性校验值得注意的有--block-size必须是[1, 32]内的整数-pes与-gnpus会互相钳制-pes设置后若大于当前GNPU_NUM则更新GNPU_NUM反之亦然多 QP 仅支持put/bi_put/get/bi_getput_signal保持单 QP-t all也不能配-b 1--metric lat仅支持-t put脚本会把SHMEM_CYCLE_PROF_PE环境变量默认导出为 0决定哪个 PE 作为性能采集点。底层二进制 main.cpp 还会额外校验--batch必须非负--block-size上限受ACLSHMEM_MAX_QP_NUM约束--exponent-range必须满足0 min max 62多 QP 场景要求ACLSHMEM_RELAY_SUPPORT未开启并检查多 QP 总数据量不溢出uint64_t、所需src/dst双份缓冲不超过 40 GB。DRAM / D2H 内存约束本示例仅测试 HBM (DEVICE_SIDE) 内存路径不支持 D2H /HOST_SIDE(DRAM)UDMA 引擎当前未对 Host 侧 DRAM 提供 RMA 路径相关测试不在本示例的覆盖范围。如需测 DRAM请改用 rma_d2h_demo。默认 1 GB 本地内存当数据量较大时程序会自动上调local_mem_size最多 40 GB。这一逻辑在 main.cpp默认local_mem_size 1 GB当max_datasize * 2src dst 两份缓冲超过该值时按 1 GB 向上取整超过 40 GB 直接报错退出。Metric 口径说明bw 与 lat 的计时差异UDMA 是异步 NBI 接口benchmark 把put_nbi/get_nbi提交与quiet等待分开计时。两种 metric 都是单窗口覆盖loop_count次提交区别只在quiet是否在窗口内。SHMEMI_PROF_START/END宏定义在 src/device/utils/prof/shmemi_prof.h宏体内自带pipe_barrier(PIPE_ALL)并通过AscendC::GetSystemCycle()记录系统周期数——如果每次循环都打点打点本身的 barrier 开销会叠加到延时数字上因此本示例把打点放在循环外、对总耗时除以loop_count从而摊薄测量开销。--metric bw默认计时结构为prof_start → loop(put_nbi) → quiet → prof_end窗口包含quietBandwidth/GB/sdatasize × qp_count / (window_us / loop_count)datasize是单个 QP 的数据量CoreMaxTime/SingleCoreTime列填window_us / loop_count适用于put / bi_put / get / bi_get / put_signal。--metric lat计时结构为prof_start → loop(put_nbi) → prof_end → quietquiet移出窗口只测下发本身对应 kernel 中PERF_METRIC_LAT分支见 udma_perftest_kernel.cppCoreMaxTime/SingleCoreTime列填window_us / loop_count即单次put_nbi平均下发耗时Bandwidth/GB/s填 0对延时口径无意义仅-t put支持其他-t与--metric lat组合会直接报错退出。CSV 文件名加 metric 前缀多 QP 场景追加 QP 数后缀output/udma_metric_test_type_dtype[_qpN]_pe.csv。带宽统计的源码实现examples/utils/utils.h 中的collect_prof_data_to_csv_v2展示了带宽与延时的实际换算周期转微秒系数cycle2us在 Ascend950 上取 1000即 1000 周期/微秒其余 SOC 取 50每个 block 的窗口时间 cycles / ccount / cycle2us单次迭代耗时 window_us / loop_count取所有 block 的最大值作为CoreMaxTime带宽 datasize × block_size / max_core_time × 1e6字节/秒再除以1e9得到 GB/s、除以1.024^3得到 GiB/s 列。Batch 提交仅--metric bw--metric bw路径默认是全异步loop_count次普通*_nbi提交完后仅在窗口末尾quiet一次。--batch N同时决定 BW 路径的批边界和提交方式--batch 0默认普通 NBI 全异步仅末尾一次quiet反映稳态吞吐。--batch 1每次普通 NBI 后立刻quiet等价于同步提交能反映提交完成的端到端开销。--batch NN 1每批前 N-1 个操作使用defer最后一个使用submit然后quiet当loop_count不能整除 N 时余数批次按实际操作数提交。SHMEMI_PROF_START/END仍只取一次同--metric bw原本的实现即窗口内总时间除以loop_count给出含 batched quiet 的平均单次耗时。--metric lat路径不受--batch影响。kernel 侧的分组逻辑在 udma_perftest_kernel.cpp先算full_groups loop_test / quiet_batch与remainder每个整组调用udma_perf_put_group内部按aggregate batch 1决定走udma_perf_put_aggregate聚合路径随后quiet余数组同样提交后quiet。聚合路径udma_perf_put_aggregate会构造一个aclshmemx_submit_state_t state{}前operation_count - 1次 NBI 挂aclshmemx_defer_t最后一次挂aclshmemx_submit_t。这与 include/device/gm2gm/engine/shmem_device_udma.h 中描述的 submit action 契约一致defer 调用要求CONFIG.cqe0且默认 ODRNOsubmit 调用要求CONFIG.cqe1以加入覆盖整个 batch 的完成检查点一个 batch 内所有调用必须使用相同的操作类型、PE 参数、UB base 与sync_id。适用范围put / bi_put / get / bi_get在--metric bw下的batch 1使用聚合 actionput_signal始终使用普通 NBI但支持按 batch 分组后调用quiet见 udma_perftest_kernel.cpp信号值从signal_base warmup起线性递增。使用示例# 单向 PUT 带宽float幂数 8-20 ./run.sh -t put -d float --exponent-range 8 20 --loop-count 1000 # 单向 PUT 单次下发延时 ./run.sh -t put -d float --exponent-range 8 20 --loop-count 1000 --metric lat # 双向 GET 带宽int32 ./run.sh -t bi_get -d int32 --exponent-range 8 20 --loop-count 1000 # put_signal 带宽 ./run.sh -t put_signal -d float -e 14 --loop-count 500 # 五种模式 × float 带宽 ./run.sh -t all -d float --exponent-range 8 20 --loop-count 1000 # 单一模式 × 全部数据类型 ./run.sh -t put -d all --exponent-range 8 20 # 同步提交 (batch1)每次 nbi 后 quiet ./run.sh -t put -d float --exponent-range 8 20 --loop-count 1000 --batch 1 # 半异步每 16 次 nbi 后 quiet ./run.sh -t get -d float --exponent-range 8 20 --loop-count 1000 --batch 16 # 单 QP 聚合提交batch8 ./run.sh -t put -d float -e 14 --batch 8 # 4 QP 并发核数与 QP 数相等 ./run.sh -t bi_put -d float -e 16 -b 4 # 4 QP 聚合提交每个 QP 的 batch8 ./run.sh -t bi_get -d float -e 16 -b 4 --batch 8多机场景下参照 udma_demo 的 run.sh 参数说明 设置-pes跨机全局 PE 总数、-gnpus本机 NPU 数、-ipportbootstrap 节点地址、-fpe本机起始 PE 号与-fnpu本机起始 NPU 卡号在各节点分别以不同-fpe启动即可。put_signal 行为说明put_signal模式由 perftest 自动管理信号测试启动时分配一段对称信号缓冲aclshmem_malloc(n_pes * sizeof(uint64_t))初始化为 0见 main.cpp。每个数据点循环warmup loop_count次每次调用aclshmemx_udma_put_signal_nbi(..., signal_base i, peer_pe)信号值线性递增以避开脏数据干扰。数据点结束后host 端读回对端信号槽校验是否等于signal_base (warmup loop_count - 1)。校验失败会打印 ERROR 但不终止后续数据点。其中warmup即 perftest_common_types.h 中定义的PERFTEST_WARMUP_ITERS 100signal_base由frame_id * 1000000 1生成确保不同数据点之间信号值不重叠。CSV 输出CSV 列与 MTE 版保持一致便于复用 examples/utils/perf_data_process.py 出图DataSize/B, Npus, Blocks, UBsize/KB, Bandwidth/GB/s, CoreMaxTime/us, SingleCoreTime/usput/bi_put/get/bi_get的Blocks列等于--block-sizeput_signal保持单 block。DataSize/B表示单个 QP 每次传输的数据量也就是-e指定的2^e字节多 QP 时总数据量为DataSize × Blocks。因此带宽统计会按所有 QP 的总流量计算可直接与单 QP 结果对比。与 MTE 版的列结构一致Bandwidth DataSize × Blocks / 时间表示总流量。跨引擎按同一-e对比时应结合Blocks判断总流量。文件名格式为output/udma_metric_test_type_dtype[_qpN]_pe.csv例如udma_bw_put_float_0.csv或udma_bw_put_float_qp4_0.csv。--metric lat时Bandwidth/GB/s列填 0CoreMaxTime/SingleCoreTime列填测量窗口内单次操作的平均下发耗时。仅 prof PESHMEM_CYCLE_PROF_PE默认 0会写 CSV 文件其他 PE 的数据不会被采集main.cpp。CSV 实际还包含Bandwidth/GiB/s(1024)列见 main.cpp 的表头定义便于同时查看 1000 进制与 1024 进制两种口径。若使用-a plot或-a mdrun.sh 会调用perf_data_process.py -d output生成图表plot 模式额外传--no-markdown。输出示例[INFO] udma_perftest start, pe0, tput, dfloat, exp10-10, loop100, ub16KB, metricbw, batch100 pe: 0 size(per QP): 1024B, total: 1024B frame_id: 0 [Verification] put: checking... [Verification] SUCCESS [SUCCESS] udma_perftest done in pe 0每跑完一个数据点host 端会把设备侧dst/src缓冲读回并与预期值逐元素比对put 模式校验对端数据等于prof_pe 10get/bi_put/bi_get 校验对端数据等于peer_pe 10校验通过打印[Verification] SUCCESS同时frame_id每数据点自增若达到ACLSHMEM_CYCLE_PROF_FRAME_CNT上限会告警停止。已知约束UDMA 头文件 include/device/gm2gm/engine/shmem_device_udma.h 注明concurrent RMA/AMO operations to the same PE are not supported。单 QP 模式保持block_dim1多 QP 模式由每个 block 独占一个显式 QPkernel 内以qp_idx GetBlockIdx()取 QP 号避免多个 block 争用同一个 SQ。UDMA 聚合 action 要求PIPE_MTE3。当batch 1时每批 WQE 数必须小于 32768SQ ring depth见 main.cpp 中的UDMA_SQ_RING_DEPTH常量UB scratch 至少需要64 * batch字节多 QP 依赖的 QP 专有接口要求ACLSHMEM_RELAY_SUPPORTOFF仅直连 UDMA build 支持。UDMA 仅在 Ascend950 编译期使能在其他 SOC 上 kernel 会通过aclshmemi_kernel_abort报错退出。不支持 D2H /HOST_SIDE(DRAM)UDMA 引擎当前未对 Host 侧 DRAM 提供 RMA 路径仅测 HBM。原子操作aclshmemx_udma_atomic_add等不在本 perftest 范围。高阶 UDMA RMA 接口默认通过PIPE_MTE3staging 下发 WQE默认 UB 配置为offset 189 * 1024、ub_size 128字节、sync_id 0。如果调用aclshmemx_set_udma_config修改配置ub_size必须不小于 128 字节。本 perftest 的低阶接口路径仍按显式入参使用本地 UBkernel 中通过AscendC::TBufAscendC::TPosition::VECOUT按ub_size_kb * 1024初始化 UB 缓冲。延伸阅读UDMA 引擎设备侧实现src/device/gm2gm/engine/shmem_device_udma.hpp、src/device/gm2gm/engine/shmemi_device_udma.h同系列基准examples/shmem_perftest/mte_perftest/README.mdMTE 引擎、examples/shmem_perftest/rdma_perftest/README.mdRDMA 引擎需开启 RDMA 编译、examples/shmem_perftest/sdma_perftest/README.mdSDMA 引擎UDMA 基础样例与平台支持说明examples/udma_demo/README.md性能采集宏定义src/device/utils/prof/shmemi_prof.h测试集合总览与 Python 依赖examples/shmem_perftest/README.md【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价