恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

CANN SHMEM 之 mte_perftest 参数化性能测试指南:基于 MTE 的 put/get 带宽评测

  • 首页
  • 资讯中心
  • /
  • CANN SHMEM 之 mte_perftest 参数化性能测试指南:基于 MTE 的 put/get 带宽评测

相关资讯

Front-End-Checklist 空链接与失效链接修复指南:为每个 `<a>` 提供可访问名称 2026/9/19 20:29:17
在 OpenDesign 中復刻 GitHub 風格的工程化設計系統:Primer 色彩、14px 資訊密度與 tokens.css 實作剖析 2026/9/19 20:29:17
DeskcommCRM落地实战:化解客户信息孤岛,构建高效客户管理 2026/9/19 20:29:17

最新资讯

125kHz RFID读卡器设计:U2270B与AT89C52完整链路
Windows用户必看:如何用ide-eval-resetter的VBS脚本一键重置10款JetBrains IDE的试用期
Spacedrive 的 WASM 扩展系统:基于 Wasmer 的沙箱插件架构与实战指南
STC89C52RC智能停车系统工程实践:抗干扰、RS485组网与断电保护
车联网平台建设:从MQTT接入层到5G调测的完整技术指南
self-llm 教程实战:用 SGLang 部署 MiniMax-M3,完成 512K 长上下文推理、图片输入与工具调用

今日推荐

oh-my-hermes:打造跨工具的命令编排与插件化工作流
OpenClaw.NET 用 /goal start 跑长任务,模型 Base URL 改到 TaoToken
SYB创业计划书财务逻辑拆解:从销售收入预测到现金流量计划

本周热门

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

CANN SHMEM 之 mte_perftest 参数化性能测试指南:基于 MTE 的 put/get 带宽评测

发布时间:2026/9/19 20:29:17
CANN SHMEM 之 mte_perftest 参数化性能测试指南:基于 MTE 的 put/get 带宽评测 CANN SHMEM 之 mte_perftest 参数化性能测试指南基于 MTE 的 put/get 带宽评测【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmemmte_perftest 是 CANN SHMEM 仓库examples/shmem_perftest下用于评测MTEMemory Transfer Engine数据传输性能的参数化测试示例支持单向/双向 put 与 get、10 种数据类型、可配置核数与数据量范围并通过 SHMEMI_PROF_START/END 宏按核采集 cycle 周期计数最终输出 CSV 格式的带宽报告。读完本文你将掌握该示例的编译方式、全部命令行参数语义、批量测试组合规则以及性能数据从内核插桩到 CSV 落盘的完整链路可直接上手评估 MTE 接口在不同核数和报文规模下的带宽表现。测试目的覆盖四种 MTE 数据传输场景本示例围绕 SHMEM 的 RMA 语义设计了四类传输模式用于模拟不同的数据搬运压力模型测试类型语义数据搬运执行方put单向 put 操作仅环境变量SHMEM_CYCLE_PROF_PE指定的 PE 执行数据搬运未指定时默认 PE0bi_put双向 put 操作两个 PE 同时执行 put互相向对方写入数据get单向 get 操作仅SHMEM_CYCLE_PROF_PE指定的 PE 执行数据搬运未指定时默认 PE0bi_get双向 get 操作两个 PE 同时执行 get互相从对方读取数据all批量模式依次运行以上全部四种类型单向模式模拟单侧发起的远距离内存访问对端 PE 只参与同步双向模式则最大化链路利用率模拟对等通信负载。从内核实现看单向判定逻辑位于 mte_perftest_kernel.cpp 的is_unilateral分支当test_mode为TEST_MODE_MTE_PUT或TEST_MODE_MTE_GET且当前 PE 不是采集 PE 时直接调用aclshmemx_sync_vec_all()参与同步后返回不做数据搬运而双向模式下所有 PE 均进入搬运循环。可以通过对比四类模式的带宽差异判断 MTE 在单向与双向压力下的吞吐表现。功能特性一览✅ 可配置核数范围默认 32 核支持连续区间与离散列表两种指定方式✅ 可配置数据量范围按 2 的幂次方步进即2^exponent字节✅ 可设置循环次数以获得稳定性能数据默认 1000 次✅ 使用 SHMEMI_PROF 按核采集各核性能数据✅ 生成 CSV 格式性能报告并可通过脚本图形化✅ 支持批量测试-t all/-d all/ 两者同时使用支持的数据类型覆盖常见标量类型共 10 种浮点型float有符号整型int8、int16、int32、int64无符号整型uint8、uint16、uint32、uint64字符型charall测试所有数据类型数据类型的解析与分派由 mte_perftest_common.h 中的DISPATCH_BY_TYPE宏完成将命令行字符串映射为 C 原生类型模板参数内核侧则通过 mte_perftest_kernel.cpp 中DEFINE_MTE_PERF_KERNEL_FOR_TYPE宏为每种类型生成独立的mte_perf_test_type_put/get内核入口。编译说明在 shmem 仓库根目录下编译示例示例由根目录 CMakeLists.txt 的USE_EXAMPLES选项控制examples/shmem_perftest/CMakeLists.txt 会将mte_perftest作为子目录加入构建source /usr/local/Ascend/ascend-toolkit/set_env.sh # A2/A3 平台 bash scripts/build.sh -examples # Ascend950 平台 bash scripts/build.sh -soc_type Ascend950 -examples # 如需运行 --memory-type dram需启用CANN模式编译 # A2/A3 平台 bash scripts/build.sh -examples -cann # Ascend950 平台 bash scripts/build.sh -soc_type Ascend950 -examples -cann构建完成后可执行文件位于build/bin/mte_perftest运行脚本 run.sh 会自动将build/lib与${ASCEND_HOME_PATH}/lib64加入LD_LIBRARY_PATH。若使用 Ascend950 平台需要注意其性能周期到微秒的换算系数不同见下文性能采集说明。使用方法基本用法# 进入示例目录 cd examples/shmem_perftest/mte_perftest/ # 运行测试脚本 ./run.sh [选项]run.sh会为每个 NPU 并行拉起一个mte_perftest进程--pe-id从 0 到gnpus-1并wait等待全部结束后统一进行后续处理。命令行参数run.sh透传给可执行文件的参数如下默认值以运行脚本 run.sh 为准可执行文件自身的默认值见 main.cpp参数缩写描述默认值--test-type type-t type测试类型 (put/bi_put/get/bi_get/all)put--datatype type-d type数据类型 (float/int8/int16/int32/int64/uint8/uint16/uint32/uint64/char/all)float--block-size size-b size设置单个核数32--block-range min max-设置连续核数范围32-32--block-list b1,b2,...-设置离散核数列表如2,4,6,8-未指定--exponent exponent-e exponent设置数据量的幂数数据量 2^exponent 字节---exponent-range min max-设置数据量的幂数范围3-17--loop-count count-设置循环次数1000--ub-size size-设置单核 UB 大小KB用于内核 DMA 搬运16--memory-type hbm\|dram-设置 SHMEM 内存类型dram 使用 Host 侧内存hbm-pes size-设置 PE 数量2-ipport ip:port-设置通信地址tcp://127.0.0.1:8764run.sh 内默认为 8767 端口-gnpus num-设置 NPU 数量2-fnpu id-设置首个 NPU ID控制起始 NPU0-fpe id-设置首个 PE ID0-a\|--analyse none\|plot\|md-分析模式none 不生成、plot 仅生成图、md 同时生成图和 mdnone参数使用要点依据 run.sh 与 main.cpp 的实现参数互斥与覆盖--block-size将最小/最大核数同时设为给定值并清空BLOCK_LIST--block-range设置连续区间--block-list指定离散列表三个选项后设置的会覆盖先前配置。核数范围校验block-range要求min 0且max min--block-list格式如2,4,6,8解析失败会直接报错退出。幂数范围校验要求0 min max且max必须小于 64uint64_t位数防止1ULL exponent溢出。PE/NPU 联动-pes与-gnpus相互约束当任一值大于 PE 数时会自动钳制为 PE 数并打印提示。运行前的合法性检查run.sh会对测试类型put/bi_put/get/bi_get/all、数据类型10 种 all、内存类型hbm/dram逐一校验非法值直接报错并打印完整用法。DRAM 内存测试约束--memory-type dram会使用aclshmemx_malloc(..., HOST_SIDE)分配 Host 侧 DRAM 内存。该功能依赖 CANN 模式编译时必须使用# A2/A3 平台 bash scripts/build.sh -examples -cann # Ascend950 平台 bash scripts/build.sh -soc_type Ascend950 -examples -cann从 main.cpp 的get_memory_type可以看到dram对应HOST_SIDE其余类型含hbm对应DEVICE_SIDE二者均通过aclshmemx_malloc/aclshmemx_free成对分配与释放。DRAM 测试需要运行环境支持 Host 侧 DRAM 内存访问相关硬件和可用内存约束可参考 rma_d2h_demo 的约束限制章节。mte_perftest 默认配置 1 GB 本地内存当测试参数需要更大本地内存时程序会按数据量自动上调单次上调单位为 1 GB上限 40 GB运行前需确保可用 DRAM 空间大于实际本地内存配置。使用示例1. 测试单个操作类型和数据类型# 测试单向PUT操作float类型32核数据量从2^8到2^20字节 ./run.sh -t put -d float --block-size 32 --exponent-range 8 20 --loop-count 1000 # 测试双向GET操作int32类型 ./run.sh -t bi_get -d int32 --block-size 32 --exponent-range 8 20 --loop-count 10002. 测试所有操作类型指定数据类型# 测试所有操作类型put/bi_put/get/bi_get使用float数据类型 ./run.sh -t all -d float --block-size 32 --exponent-range 8 20 --loop-count 10003. 测试所有数据类型指定操作类型# 测试PUT操作使用所有数据类型 ./run.sh -t put -d all --block-size 32 --exponent-range 8 20 --loop-count 10004. 测试所有操作类型和数据类型# 测试所有操作类型和所有数据类型 ./run.sh -t all -d all --block-size 32 --exponent-range 8 20 --loop-count 10005. 测试指定核数# 在指定核数2、4、6、8、16核测试所有操作类型和所有数据类型 ./run.sh -t all -d all --block-list 2,4,6,8,16 --exponent-range 8 20 --loop-count 10006. 使用默认参数运行# 使用默认参数运行put测试 ./run.sh # 运行所有测试类型 ./run.sh -t all7. 图形化数据# 使用perf_data_process.py -d 传入csv数据存储路径图形化结果将存储在csv存储路径下picture文件夹下 python ../utils/perf_data_process.py -d output需要说明的是批量组合示例 2/3/4/5由run.sh内置的ALL_TEST_TYPES与ALL_DATATYPES数组驱动当-t all -d all同时给出时脚本按测试类型 × 数据类型双重嵌套依次运行 4×10 40 个组合仅-t all或仅-d all时则按单一维度展开。每个组合内仍会对每个 NPU 各拉起一个进程因此全量测试耗时较长建议先小范围验证参数正确性再放大规模。此外run.sh还提供了-a/--analyse分析模式README 参数表未列出但脚本已实现plot模式下会在测试结束后自动调用perf_data_process.py -d output --no-markdown生成图表md模式则同时生成图表与 Markdown 报告。运行机制与源码级原理内核执行流程预热、插桩与搬运以 put 为例内核实现位于 mte_perftest_kernel.cpp 的mte_perf_test_put_impl其执行流水如下数据切分每个核计算block_elements elements / GetBlockNum()并根据报文大小决定核间偏移——当单核搬运字节数小于 512 时按每核 512 字节 stride 分配offset 512 / sizeof(T) * block_idx否则按block_elements * block_idx顺序切分保证小报文时各核缓冲区不重叠。预热warmup正式计时前先执行 100 次搬运通过AscendC::SetFlag/WaitFlag硬件事件同步保证 MTE 流水线稳定后再进入计时区。插桩计时在循环外调用SHMEMI_PROF_START(frame_id)与SHMEMI_PROF_END(frame_id)中间循环loop_count次调用aclshmemx_mte_put_nbi/aclshmemx_mte_get_nbi完成非阻塞搬运每次搬运后以MTE3_S事件等待完成。全局同步计时结束后调用aclshmemx_sync_vec_all()与其他 PE 汇合保证单向测试中未执行搬运的 PE 与搬运 PE 在同一帧内同步。性能插桩宏与采集 PESHMEMI_PROF_START/END 是设备侧周期级计时宏采集 PE通过环境变量SHMEM_CYCLE_PROF_PE指定默认为 0。主机侧 prof_util.cpp 在初始化时读取该环境变量并校验其范围必须小于ACLSHMEM_MAX_PES随后仅为指定 PE 分配 prof 内存并挂载到全局设备状态。最大记录核数ACLSHMEM_CYCLE_PROF_MAX_BLOCK定义为 64 核见 include/host_device/shmem_common_types.h。最大记录帧数ACLSHMEM_CYCLE_PROF_FRAME_CNT定义为 1024 帧。宏的实现原理是在START处以AscendC::GetSystemCycle()读取当前周期数并做减法cycles - cycle在END处再次读取并做加法cycles cycle且计数ccount 1从而按block_prof[block_idx].cycles[frame_id]累积同一帧内所有循环的总周期数。由于宏内同时校验pf_id FRAME_CNT与GetBlockIdx() FRAME_CNT超过 64 核的部分不会记录数据。周期到微秒的换算系数由 SoC 决定默认取 50即 50 cycle/usAscend950 平台取 1000见 prof_util.cpp 的prof_data_print。内存规划与自动上调main.cpp 在正式测试前会做一次整体内存预算单核 stride 取max(datasize, 512)单 buffer 分配大小为stride × block_size且校验其不超过int可表示的核内元素数上限按max_datasize × max_block_size × 2源、目的两个 buffer计算所需对称内存总量若超过默认的 1 GBlocal_mem_size 1024^3按 1 GB 粒度向上取整自动上调但上限 40 GB超出则报错并提示调整block-range/block-list或exponent-range。每次测试帧结束后程序还会做数据正确性校验put 场景校验目的端数据等于对端源数据源数据以pe_id 10填充get 场景校验本地源数据等于对端目的数据目的数据以pe_id 100填充通过aclrtMemcpy回读 Host 侧逐元素比对并在控制台打印[Verification] SUCCESS/FAILED。性能数据落盘每帧搬运完成后主机侧调用aclshmemx_get_prof(out_profs, false)将设备侧 prof 数据拷回并调用collect_prof_data_to_csv_v2汇总为 CSV 行。只有SHMEM_CYCLE_PROF_PE指定的 PE 会写 CSV 文件文件名拼接逻辑见 main.cppif (pe_id prof_pe) { std::string csv_filename output/ std::string(fuc_test_type) _ std::string(fuc_data_type) _ int_to_string(prof_pe) .csv; write_csv(csv_filename, csv_data); }输出说明CSV 文件格式测试运行后会在当前目录下生成output文件夹其中包含测试结果的 CSV 文件文件名格式为{test_type}_{data_type}_{prof_pe}.csv例如put_float_0.csv- 单向 PUT 操作float 类型bi_get_int32_0.csv- 双向 GET 操作int32 类型CSV 文件内容CSV 文件包含以下字段带宽列同时给出基于 1000 与 1024 两种换算的结果见 main.cpp 的 CSV 表头定义字段描述DataSize/B数据大小字节即2^exponentNpus使用的 NPU 数量Blocks核数UBsize/KB单核 UB 大小KBBandwidth/GBps (1000)带宽按 1000 进制换算的 GB/sBandwidth/GiB/s (1024)带宽按 1024 进制换算的 GiB/sCoreMaxTime/us最大核时间微秒SingleCoreTime/us单核时间微秒每个核一列性能采集说明采集 PE通过环境变量SHMEM_CYCLE_PROF_PE指定默认为 0。run.sh会显式export SHMEM_CYCLE_PROF_PE${SHMEM_CYCLE_PROF_PE:-0}保证该变量存在。最大记录核数ACLSHMEM_CYCLE_PROF_MAX_BLOCK64 核最大记录帧数ACLSHMEM_CYCLE_PROF_FRAME_CNT1024 帧只有环境变量指定的 PE 会输出 CSV 文件其他 PE 的数据不会被采集。注意事项与常见问题环境配置运行前请确保已正确设置 Ascend 环境变量source /usr/local/Ascend/ascend-toolkit/set_env.sh数据量计算测试数据量的计算方式为2^exponent字节例如--exponent-range 8 20表示从 256 B 到 1 MB。参数范围核数范围超过ACLSHMEM_CYCLE_PROF_MAX_BLOCK64 核的部分不做记录帧数不能超过ACLSHMEM_CYCLE_PROF_FRAME_CNT1024 帧内存要求大数据量测试需要足够的设备内存超过默认 1 GB 配置时程序会自动按 1 GB 粒度上调上限 40 GB请确保实际可用内存足够。性能稳定性建议使用较大的循环次数如 1000 次以获得稳定的性能数据。单向/双向区别单向操作put/get只有SHMEM_CYCLE_PROF_PE指定的 PE 执行搬运双向操作bi_put/bi_get两个 PE 都执行搬运注意该示例测试结果仅做参考性能以实际场景为准。常见问题内存分配失败错误: aclrtMalloc failed解决方案减小数据量范围或核数确保设备有足够内存同时注意自动上调上限为 40 GB若提示 Required memory exceeds 40GB需收窄block-range/block-list或exponent-range。CSV 文件无数据解决方案检查SHMEM_CYCLE_PROF_PE环境变量是否正确设置确保指定的 PE 有执行测试同时确认核数未超过 64 核的记录上限。frame_id 超过最大值警告: frame_id 超过最大值 1024, 停止测试解决方案减小测试范围确保测试帧数不超过 1024。测试帧数计算公式测试帧数 (max_block_size - min_block_size 1) × (max_exponent - min_exponent 1)例如--block-range 1 64 --exponent-range 10 30的测试帧数为(64 - 1 1) × (30 - 10 1) 64 × 21 1344 1024超出限制该限制由 main.cpp 的frame_id递增逻辑强制每完成一帧frame_id一旦达到ACLSHMEM_CYCLE_PROF_FRAME_CNT即打印警告并停止测试。因此规划批量参数时务必先按上述公式估算帧数避免长时间跑完后发现数据被截断。【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号