CANN/asc-devkit LoadData性能测试样例

LoadData(L1->L0) 性能测试样例

【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 【免费下载链接】asc-devkit 项目地址: https://gitcode.com/cann/asc-devkit

概述

本样例用于 LoadData 相关接口的性能测试,覆盖矩阵 A/B 从 L1 搬运到 L0A/L0B 的数据搬运路径。 本样例为无业务测试,不包含矩阵计算指令。

本样例支持的产品及CANN软件版本

产品架构代号CANN软件版本
Ascend 950PR/Ascend 950DTdav-3510>= CANN 9.1.0
Atlas A3 训练系列产品/Atlas A3 推理系列产品dav-2201>= CANN 9.0.0
Atlas A2 训练系列产品/Atlas A2 推理系列产品dav-2201>= CANN 9.0.0

目录结构介绍

├── load_data_perf
│   ├── CMakeLists.txt                    // 编译工程文件
│   ├── load_data_perf.asc                // LoadData 性能测试实现与调用入口
│   ├── perf.sh                           // 性能测试脚本
│   ├── generate_roofline_with_latency.py // Roofline 生成脚本
│   └── README.md                         // 样例说明文档

样例描述

本样例通过运行参数 SCENARIO_NUM 选择不同搬运路径,矩阵规格通过 ./demo SCENARIO_NUM M K N 在运行时传入,核函数名为 load_data_perf_custom

根据平台架构,支持的测试场景如下:

平台架构支持场景说明
Atlas A3/A2 训练/推理平台(dav-2201)1-9Atlas A3/A2 训练/推理平台支持的 LoadData 接口场景
Ascend 950PR/950DT 平台(dav-3510)11-19Ascend 950PR/950DT 平台支持的 LoadData 接口场景

Atlas A3/A2 训练/推理平台场景(1-9)

SCENARIO_NUM输入数据类型数据源执行路径说明理论带宽(Byte/cycle)带宽延迟(cycle)
1bfloat16A矩阵L1 -> L0ALoad2D 从 L1 加载到 L0A25628
2bfloat16B矩阵L1 -> L0BLoad2D 从 L1 加载到 L0B12828
3bfloat16A矩阵L1 -> L0A(转置)LoadDataWithTranspose 从 L1 加载到 L0A(转置)25628
4bfloat16B矩阵L1 -> L0B(转置)LoadDataWithTranspose 从 L1 加载到 L0B(转置)12828
5bfloat16A矩阵L1 -> L0ALoad3Dv2 从 L1 加载到 L0A32-25650
6bfloat16B矩阵L1 -> L0BLoad3Dv2 从 L1 加载到 L0B28.4-12850
7int8_tB矩阵L1 -> L0BLoadDataWithSparse 从 L1 加载到 L0B(稀疏加载)12830
8floatBiasL1 -> BiasTable Buffer从 L1 加载到 BiasTable Buffer3220
9uint64_tFixPipeL1 -> Fixpipe Buffer从 L1 加载到 Fixpipe Buffer3220

Ascend 950PR/950DT 平台场景(11-19)

SCENARIO_NUM输入数据类型数据源执行路径说明理论带宽(Byte/cycle)带宽延迟(cycle)
11bfloat16A矩阵L1 -> L0ALoad2Dv2 从 L1 加载到 L0A25630
12bfloat16B矩阵L1 -> L0BLoad2Dv2 从 L1 加载到 L0B25630
13fp8_e4m3fnA矩阵 + ScaleAL1 -> L0A + L0A_MXLoad2DMx 从 L1 加载到 L0A 和 L0A_MX(带 scale)256/3230
14fp8_e4m3fnB矩阵 + ScaleBL1 -> L0B + L0B_MXLoad2DMx 从 L1 加载到 L0B 和 L0B_MX(带 scale)256/3230
15bfloat16A矩阵L1 -> L0ALoad3Dv2 从 L1 加载到 L0A32-25650
16bfloat16B矩阵L1 -> L0BLoad3Dv2 从 L1 加载到 L0B32-25650
17bfloat16B矩阵L1 -> L0B(转置)LoadDataWithTranspose 从 L1 加载到 L0B(转置)25628
18floatBiasL1 -> BiasTable Buffer从 L1 加载到 BiasTable Buffer3220
19uint64_tFixPipeL1 -> Fixpipe Buffer从 L1 加载到 Fixpipe Buffer3226

编译运行

在本样例根目录下执行如下步骤,编译并执行样例。

配置环境变量

请根据当前环境上CANN开发套件包的安装方式,配置环境变量。

source ${install_path}/cann/set_env.sh

${install_path} 为CANN包安装目录,未指定安装目录时默认安装至 /usr/local/Ascend 下。

编译样例

mkdir -p build && cd build
cmake -DCMAKE_ASC_ARCHITECTURES=dav-2201 ..
make -j

针对 Ascend 950PR/950DT 平台编译:

cmake -DCMAKE_ASC_ARCHITECTURES=dav-3510 ..
make -j

运行样例

# Atlas A3/A2 训练/推理平台示例(场景 1-9)
./demo 1 64 128 128
./demo 2 256 128 128

# Ascend 950PR/950DT 平台示例(场景 11-19)
./demo 11 64 128 128
./demo 13 256 128 128

运行参数顺序为 SCENARIO_NUM M K N

参数说明
SCENARIO_NUM测试场景编号,Atlas A3/A2 训练/推理平台使用 1-9,Ascend 950PR/950DT 平台使用 11-19
M矩阵 A 的行数
K矩阵 A 的列数(矩阵 B 的行数)
N矩阵 B 的列数

性能数据获取

使用 msprof 工具获取详细性能数据:

msprof op ./demo 1 128 128 128

💡 使用 msprof 工具需安装 CANN 商用/社区版,详细信息可参考msprof工具安装指南

命令完成后,会在默认目录下生成以OPPROF_{timestamp}_XXX命名的文件夹,性能数据文件夹结构示例如下:

├── dump                       # 原始性能数据
├── ArithmeticUtilization.csv  # cube/vector指令cycle占比
├── L2Cache.csv                # L2 Cache命中率,影响MTE2,建议合理规划数据搬运逻辑,增加命中率
├── Memory.csv                 # UB、L1和主存储器读写带宽速率
├── MemoryL0.csv               # L0A、L0B和L0C读写带宽速率
├── MemoryUB.csv               # Vector和Scalar到UB的读写带宽速率
├── OpBasicInfo.csv            # 算子基础信息
├── PipeUtilization.csv        # 计算单元和搬运单元耗时及占比
├── ResourceConflictRatio.csv  # UB bank group、bank conflict和资源冲突率占比
└── visualize_data.bin         # MindStudio Insight呈现文件

本样例主要关注L1->L0的性能数据,通过如下方法查看具体的性能数据结果:

cat ./OPPROF_*/PipeUtilization.csv

主要关注如下指标:

指标说明
aic_mte1_time(us)mte1 类型指令(L1 -> L0A/L0B 搬运以及L1 到 Bias Table Buffer 搬运)耗时
aic_fixpipe_time(us)fixpipe 类型指令(L1 到 Fixpipe Buffer 搬运)耗时

性能测试脚本

perf.sh 用于批量编译、执行 msprof op、提取性能指标并生成 CSV 汇总结果。

# 查看帮助
./perf.sh --help

# 测试场景 1,默认使用 dav-2201
./perf.sh 1

# 测试场景 11,默认使用 dav-3510
./perf.sh 11

# 明确指定平台
./perf.sh 1 dav-2201
./perf.sh 11 dav-3510

脚本默认测试 5 组 shape:

Test_IDMKN数据量说明
1323232小数据量
2646464中小数据量
36412864中小数据量
4128128128中等数据量
5256128256约 64KB,接近 L0 满载

其中,A矩阵搬运数据量为M * K,B矩阵搬运数据量为K * N,Bias Table Buffer和Fixpipe Buffer搬运数据量为N,可以按需调整。

测试完成后,结果保存在 perf_data_${timestamp}_scenario${SCENARIO}/perf_result_scenario${SCENARIO}.csv,原始 msprof 数据保存在同目录下的 test_${id}_${M}_${K}_${N} 子目录。

性能指标说明

perf.sh 根据场景自动选择性能指标:

场景指标说明
9、19aic_fixpipe_time(us)FixPipe (L1 到 Fixpipe Buffer 搬运)执行时间
其他场景aic_mte1_time(us)MTE1(L1 到 L0A/L0B 搬运或 L1 到 Bias Table Buffer 搬运)执行时间

CSV 中的计算列如下:

列名计算方式说明
CycleTime(us) * Frequency(MHz)根据平台主频折算的 Cycle 数
Bandwidth(GB/s)DataSize(bytes) / Time(us) / 1e3数据搬运带宽

性能指标计算方法

msprofPipeUtilization.csv 中采集到的 aic_mte1_time(us)aic_fixpipe_time(us) 均为微秒(us)单位的耗时。perf.sh 会读取对应时间列,并结合平台主频和测试数据量计算 Cycle 数与实测带宽。

Time(us) 转换为 Cycle

主频单位为 MHz,含义是每微秒的周期数。因此 Time(us) 转换为 Cycle 时不需要额外换算:

Cycle = Time(us) * Frequency(MHz)

例如 当 Atlas A3/A2 训练/推理平台主频为 1800 MHz 时,若 msprof 采集到 aic_mte1_time(us) = 0.021111

Cycle = 0.021111 * 1800 = 38.00 cycles

当 Ascend 950PR/950DT 平台主频为 1650 MHz 时,若 msprof 采集到 aic_mte1_time(us) = 0.030000

Cycle = 0.030000 * 1650 = 49.50 cycles
数据搬运量计算

perf.sh 按场景选择数据搬运量,作为带宽计算的 DataSize(bytes)

场景数据量计算数据类型大小
1、3、5、11、15M * K * sizeof(bfloat16)2 bytes
2、4、6、12、16、17K * N * sizeof(bfloat16)2 bytes
7K * N * sizeof(int8_t)1 byte
8、18N * sizeof(float)4 bytes
13M * K * sizeof(fp8_e4m3fn)1 byte
14K * N * sizeof(fp8_e4m3fn)1 byte
9、19N * sizeof(uint64_t)8 bytes
其他场景默认按 M * K * sizeof(bfloat16) 计算2 bytes

Bias 场景在 kernel 中会根据平台要求做 C1 到 C2 的块长对齐。perf.sh 默认按有效 bias 元素量 N * sizeof(float) 计算带宽;如果需要分析硬件实际搬运粒度,可结合 load_data_perf.asc 中的 biasSizeAlign 对齐规则单独折算。

实测带宽计算

带宽按 GB/s 输出。由于 Time(us) 是微秒,DataSize(bytes) / Time(us) 的单位是 MB/s,继续除以 1e3 后得到 GB/s:

Bandwidth(GB/s) = DataSize(bytes) / Time(us) / 1e3

例如场景 1,shape 为 [128, 128, 128],数据类型为 bfloat16:

DataSize = 128 * 128 * 2 = 32768 bytes
Time = 0.100000 us
Bandwidth = 32768 / 0.100000 / 1e3 = 327.680 GB/s
理论耗时与带宽利用率

场景表中的“理论带宽(Byte/cycle)”和“带宽延迟(cycle)”可用于估算理论耗时。固定延迟表示一次搬运的基础启动开销,理论传输时间可按如下方式估算:

TransferCycle = DataSize(bytes) / TheoreticalBandwidth(Byte/cycle)
TheoryCycle = Latency(cycle) + TransferCycle
TheoryTime(us) = TheoryCycle / Frequency(MHz)
TheoryBandwidth(GB/s) = DataSize(bytes) / TheoryTime(us) / 1e3

实测带宽与理论带宽的比例可用于评估带宽利用率:

BandwidthUtilization = MeasuredBandwidth(GB/s) / TheoryBandwidth(GB/s) * 100%

当理论带宽为范围值(例如 32-256 Byte/cycle)或复合值(例如 256/32 Byte/cycle)时,需要结合具体接口搬运模式、数据排布以及 scale 数据路径选择对应的理论带宽进行估算。

平台主频由脚本按场景自动设置:

平台架构代号主频适用场景
Atlas A3/A2 训练/推理平台dav-22011800 MHz1-9
Ascend 950PR/950DT 平台dav-35101650 MHz11-19

Roofline 分析

本样例提供 generate_roofline_with_latency.py,可基于 perf.sh 生成的 CSV 输出 ASCII 报告和图片。

Python 包依赖

generate_roofline_with_latency.py 使用 Python 标准库读取 CSV 并生成 ASCII 报告;如果需要同时生成 PNG/PDF 图表,需要安装 matplotlibnumpy

python3 -m pip install --user matplotlib numpy

如果未安装上述依赖,脚本仍可生成 .txt 格式的 ASCII 分析报告,但会跳过图片生成。

# 自动查找最新 perf_data 目录中的结果
python3 generate_roofline_with_latency.py

# 指定 CSV 文件
python3 generate_roofline_with_latency.py --csv perf_data_20260613_164620_scenario1/perf_result_scenario1.csv

# 自定义理论参数
python3 generate_roofline_with_latency.py \
  --csv perf_data_20260613_164620_scenario1/perf_result_scenario1.csv \
  --peak-bw 256 \
  --latency 30 \
  --frequency 1800 \
  --l0-size 64

默认输出文件前缀为 ${perf_data目录名}_roofline,生成的 .txt 文件为 ASCII 详细分析,安装 matplotlib 后会同时生成 .png 图表。

图表示例

以下为场景 1 生成的 Roofline 图示例:

场景 1 Roofline 图

注意事项

  1. 场景编号与平台架构必须匹配:Atlas A3/A2 训练/推理平台使用场景 1-9,Ascend 950PR/950DT 平台使用场景 11-19。
  2. 场景 7(LoadSparse)仅支持 dav-2201 架构。
  3. 场景 13/14(Load2DMx)仅支持 dav-3510 架构。
  4. 不同场景对矩阵规格有不同的对齐要求,建议使用符合对齐要求的矩阵规格(如 16、32、64 的倍数)。

【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 【免费下载链接】asc-devkit 项目地址: https://gitcode.com/cann/asc-devkit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值