shmem_perftest
【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库,基于OpenSHMEM 标准协议,实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem
示例概述
shmem_perftest是一个用于测试shmem MTE(Memory Transfer Engine)性能的参数化测试示例,支持多种测试类型、多种数据类型和灵活的参数配置。该示例通过SHMEMI_PROF_START/END宏采集性能数据,测试不同核数和数据量下的MTE传输带宽,帮助用户评估MTE数据传输性能。该脚本测试结果仅做参考,性能以实际场景为准
测试目的
本示例主要用于测试以下MTE数据传输操作的性能:
- 单向Put: 仅PE0执行put操作,将数据传输到远端PE
- 双向Put: 两个PE同时执行put操作,互相传输数据
- 单向Get: 仅PE0执行get操作,从远端PE读取数据
- 双向Get: 两个PE同时执行get操作,互相读取数据
通过测试结果,用户可以了解MTE接口在不同场景下的性能表现。
功能特性
支持的测试类型
- put: 单向put操作,仅环境变量
SHMEM_CYCLE_PROF_PE指定的PE执行数据搬运,未指定时默认PE0 - bi_put: 双向put操作,两个PE都执行数据搬运
- get: 单向get操作,仅环境变量
SHMEM_CYCLE_PROF_PE指定的PE执行数据搬运,未指定时默认PE0 - bi_get: 双向get操作,两个PE都执行数据搬运
- all: 运行所有测试类型
支持的数据类型
- 浮点型:
float - 有符号整型:
int8,int16,int32,int64 - 无符号整型:
uint8,uint16,uint32,uint64 - 字符型:
char - all: 测试所有数据类型
其他特性
- ✅ 可配置核数范围(默认32核)
- ✅ 可配置数据量范围(支持2的幂次方)
- ✅ 可设置循环次数以获得稳定性能数据
- ✅ 使用SHMEMI_PROF采集各核性能数据
- ✅ 生成CSV格式性能报告
- ✅ 支持批量测试("all"选项)
编译说明
在shmem根目录下编译示例:
source /usr/local/Ascend/ascend-toolkit/set_env.sh bash scripts/build.sh -examples使用方法
基本用法
# 进入示例目录 cd examples/mte_perftest/shmem_perftest/ # 运行测试脚本 ./run.sh [选项]命令行参数
| 参数 | 缩写 | 描述 | 默认值 |
|---|---|---|---|
--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 |
--exponent <exponent> | -e <exponent> | 设置数据量的幂数 (2^exponent) | - |
--exponent-range <min> <max> | - | 设置数据量的幂数范围 | 3-17 |
--loop-count <count> | - | 设置循环次数 | 1000 |
-pes <size> | - | 设置PE数量,暂不支持修改 | 2 |
-ipport <ip:port> | - | 设置通信地址 | tcp://127.0.0.1:8764 |
-gnpus <num> | - | 设置NPU数量,暂不支持修改 | 2 |
-fnpu <id> | - | 设置首个NPU ID,控制起始NPU | 0 |
-fpe <id> | - | 设置首个PE ID,暂不支持修改 | 0 |
使用示例
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. 使用默认参数运行
# 使用默认参数运行put测试 ./run.sh # 运行所有测试类型 ./run.sh -t all6. 图形化数据
# 使用perf_data_process.py -d 传入csv数据存储路径,图形化结果将存储在csv存储路径下picture文件夹下。 python ../utils/perf_data_process.py -d output输出说明
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文件包含以下字段:
| 字段 | 描述 |
|---|---|
DataSize/B | 数据大小(字节) |
Npus | 使用的NPU数量 |
Blocks | 核数 |
Bandwidth/GBps | 带宽大小(GB/s) |
CoreMaxTime/us | 最大核时间(微秒) |
SingleCoreTime/us | 单核时间(微秒),每个核一列 |
性能采集说明
本示例使用SHMEMI_PROF_START/END宏进行性能数据采集:
- 采集PE: 通过环境变量
SHMEM_CYCLE_PROF_PE指定,默认为0 - 最大记录核数:
ACLSHMEM_CYCLE_PROF_MAX_BLOCK(32核) - 最大记录帧数:
ACLSHMEM_CYCLE_PROF_FRAME_CNT(32帧)
只有环境变量指定的PE会输出CSV文件,其他PE的数据不会被采集。
注意事项
环境配置: 运行前请确保已正确设置Ascend环境变量:
source /usr/local/Ascend/ascend-toolkit/set_env.sh数据量计算: 测试数据量的计算方式为:
2^exponent字节参数范围:
- 核数范围超过
ACLSHMEM_CYCLE_PROF_MAX_BLOCK(32核)不做记录 - 帧数不能超过
ACLSHMEM_CYCLE_PROF_FRAME_CNT(32帧)
- 核数范围超过
内存要求: 大数据量测试需要足够的设备内存
性能稳定性: 建议使用较大的循环次数(如1000次)以获得稳定的性能数据
单向/双向区别:
- 单向操作(put/get):只有
SHMEM_CYCLE_PROF_PE指定的PE执行搬运 - 双向操作(bi_put/bi_get):两个PE都执行搬运
- 单向操作(put/get):只有
常见问题
内存分配失败
错误: aclrtMalloc failed解决方案:减小数据量范围或核数,确保设备有足够内存
CSV文件无数据解决方案:检查
SHMEM_CYCLE_PROF_PE环境变量是否正确设置,确保指定的PE有执行测试frame_id超过最大值
警告: frame_id 超过最大值 32, 停止测试解决方案:减小测试范围,确保测试帧数不超过32。
测试帧数计算公式:
测试帧数 = (max_block_size - min_block_size + 1) × (max_exponent - min_exponent + 1)例如:
--block-range 16 32 --exponent-range 10 20的测试帧数为:(32 - 16 + 1) × (20 - 10 + 1) = 17 × 11 = 187 > 32(超出限制)
【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库,基于OpenSHMEM 标准协议,实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考