| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 1 个月前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 1 个月前 | ||
| 28 天前 | ||
| 27 天前 |
Fixpipe(L0C搬出)性能测试样例
概述
本样例用于矩阵计算搬出路径的性能测试,覆盖把Cube计算结果从L0C Buffer搬出到L1 Buffer或Unified Buffer(简称UB)的数据通路。
本样例为无业务测试,不校验计算结果,只采集Fixpipe搬出耗时。
本样例支持的产品及CANN软件版本
| 产品 | 架构代号 | CANN软件版本 |
|---|---|---|
| Ascend 950PR/Ascend 950DT | dav-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 |
目录结构介绍
├── fixpipe_perf
│ ├── CMakeLists.txt // 编译工程文件
│ ├── fixpipe_perf.asc // Fixpipe搬出性能测试实现与调用入口
│ ├── perf.sh // 性能测试脚本
│ ├── generate_roofline.py // Roofline 生成脚本
│ ├── README.md // 样例说明文档
样例描述
本样例通过运行参数SCENARIO_NUM选择不同的搬出通路与数据类型,矩阵规格通过./demo SCENARIO_NUM M K N在运行时传入。
两条搬出通路使用不同接口:
| 通路 | 接口 | 头文件路径 | 支持架构 |
|---|---|---|---|
| L0C Buffer到L1 Buffer | DataCopy |
basic_api/kernel_operator_data_copy_intf.h |
dav-2201、dav-3510 |
| L0C Buffer到UB | Fixpipe |
basic_api/kernel_operator_fixpipe_intf.h |
仅dav-3510 |
根据平台架构,支持的测试场景如下:
Atlas A3/A2训练/推理平台场景
| SCENARIO_NUM | 输入数据类型 | 数据源 | 执行路径 | 说明 | 理论带宽(Byte/cycle) | 带宽延迟(cycle) |
|---|---|---|---|---|---|---|
| 1 | float | L0C Buffer | L0C Buffer -> L1 Buffer | DataCopy 搬出,随路 F322F16 转 half | 128 | 20 |
| 2 | float | L0C Buffer | L0C Buffer -> L1 Buffer | DataCopy 搬出,随路 QF322B8_PRE 量化为 int8_t | 64 | 20 |
Ascend 950PR/950DT平台场景
| SCENARIO_NUM | 输入数据类型 | 数据源 | 执行路径 | 说明 | 理论带宽(Byte/cycle) | 带宽延迟(cycle) |
|---|---|---|---|---|---|---|
| 11 | float | L0C Buffer | L0C Buffer -> L1 Buffer | DataCopy 搬出,随路 F322F16 转 half | 128 | 26 |
| 12 | float | L0C Buffer | L0C Buffer -> L1 Buffer | DataCopy 搬出,随路 QF322B8_PRE 量化为 int8_t | 64 | 26 |
| 13 | float | L0C Buffer | L0C Buffer -> UB | Fixpipe 搬出 float,非双目标模式 | 128 | 26 |
| 14 | float | L0C Buffer | L0C Buffer -> UB | Fixpipe 搬出 float,双目标模式按 M 维度拆分 | 256 | 26 |
理论带宽基于硬件搬出并行度计算:搬出单元每 cycle 处理 64 个 out 元素,理论带宽 = 64 * sizeof(目的数据类型)(Byte/cycle)。双目标模式拆两个子核并行,等效并行度翻倍。L0C Buffer 到 UB 仅 dav-3510 支持(场景 13、14);场景 14 把 L0C Buffer 的 M×N 矩阵按 M 维度拆成两半,同时写入两个Vec核的 UB。
编译运行
在本样例根目录下执行如下步骤,编译并执行样例。
配置环境变量
请根据当前环境上CANN开发套件包的安装方式,配置环境变量。
source ${install_path}/cann/set_env.sh
${install_path}为CANN包安装目录,未指定安装目录时默认安装至/usr/local/Ascend下。
编译样例
针对Atlas A3/A2训练/推理平台(dav-2201)编译:
mkdir -p build && cd build
cmake -DCMAKE_ASC_ARCHITECTURES=dav-2201 ..
make -j
cd ..
针对Ascend 950PR/950DT平台(dav-3510)编译:
mkdir -p build && cd build
cmake -DCMAKE_ASC_ARCHITECTURES=dav-3510 ..
make -j
cd ..
运行样例
运行参数顺序为SCENARIO_NUM M K N:
# Atlas A3/A2训练/推理平台示例(场景1、2)
./build/demo 1 128 64 128
./build/demo 2 128 64 128
# Ascend 950PR/950DT平台示例(场景11-14)
./build/demo 11 128 64 128
./build/demo 12 128 64 128
./build/demo 13 128 64 128
./build/demo 14 128 64 128
| 参数 | 说明 |
|---|---|
SCENARIO_NUM |
测试场景编号,Atlas A3/A2训练/推理平台使用1、2,Ascend 950PR/950DT平台使用11-14 |
M |
矩阵行数 |
K |
矩阵 A 的列数(矩阵 B 的行数) |
N |
矩阵列数 |
矩阵规格需符合对齐要求:M、N取16的倍数;双目标模式按M维度拆分时M须为2的倍数,按N维度拆分时N须为32的倍数。
性能数据获取
使用msopprof工具获取详细性能数据:
msopprof build/demo 1 128 64 128
💡 使用
msopprof工具需安装CANN商用/社区版,详细信息可参考msOpProf工具安装指南。
命令完成后,会在默认目录下生成以OPPROF_{timestamp}_XXX命名的文件夹,性能数据文件夹结构示例如下:
├── dump # 原始性能数据
├── ArithmeticUtilization.csv # cube/vector指令cycle占比
├── L2Cache.csv # L2 Cache命中率,影响MTE2,建议合理规划数据搬运逻辑,增加命中率
├── Memory.csv # UB、L1 Buffer和主存储器读写带宽速率
├── MemoryL0.csv # L0A Buffer、L0B Buffer和L0C Buffer读写带宽速率
├── MemoryUB.csv # Vector和Scalar到UB的读写带宽速率
├── OpBasicInfo.csv # 算子基础信息
├── PipeUtilization.csv # 计算单元和搬运单元耗时及占比
├── ResourceConflictRatio.csv # UB bank group、bank conflict和资源冲突率占比
└── visualize_data.bin # MindStudio Insight呈现文件
本样例主要关注L0C Buffer搬出的性能数据,通过如下方法查看具体的性能数据结果:
cat ./OPPROF_*/PipeUtilization.csv
主要关注如下指标:
| 指标 | 说明 |
|---|---|
aic_fixpipe_time(us) |
fixpipe类型指令(L0C Buffer搬出)耗时 |
性能测试脚本
perf.sh用于批量编译、执行msopprof、提取Fixpipe搬出耗时并生成CSV汇总结果。
# 查看帮助
./perf.sh --help
# 测试场景1,默认使用dav-2201
./perf.sh 1
# 测试场景13,默认使用dav-3510
./perf.sh 13
# 明确指定平台,须与场景匹配,否则报错
./perf.sh 1 dav-2201
./perf.sh 13 dav-3510
脚本内置的默认shape序列(搬出性能只与M、N相关,K固定取64用于让Mmad前置产出L0C Buffer数据;从很小的M·N起步、逐步增大至满载)。dav-2201的L0C Buffer为128KB、dav-3510为256KB,满载点不同,故两架构末组不同:
dav-2201默认shape序列:
| Test_ID | M | K | N | M·N | L0C Buffer占用(float) |
|---|---|---|---|---|---|
| 1 | 16 | 64 | 16 | 256 | 1 KB |
| 2 | 32 | 64 | 32 | 1024 | 4 KB |
| 3 | 64 | 64 | 64 | 4096 | 16 KB |
| 4 | 128 | 64 | 128 | 16384 | 64 KB |
| 5 | 128 | 64 | 256 | 32768 | 128 KB(dav-2201满载) |
dav-3510默认shape序列:
| Test_ID | M | K | N | M·N | L0C Buffer占用(float) |
|---|---|---|---|---|---|
| 1 | 16 | 64 | 16 | 256 | 1 KB |
| 2 | 32 | 64 | 32 | 1024 | 4 KB |
| 3 | 64 | 64 | 64 | 4096 | 16 KB |
| 4 | 128 | 64 | 128 | 16384 | 64 KB |
| 5 | 256 | 64 | 256 | 65536 | 256 KB(dav-3510满载) |
其中,L0C Buffer搬出数据量为M * N * sizeof(目的类型),K仅用于让Mmad前置在L0C Buffer产出M×N结果、不计入搬出量,可以按需调整。
如需针对性补点,可直接用./build/demo SCENARIO_NUM M K N跑单个shape。
测试完成后,结果保存在perf_data_${timestamp}_scenario${SCENARIO}/perf_result_scenario${SCENARIO}.csv,原始msopprof数据保存在同目录下的test_${id}_${M}_${K}_${N}子目录。
性能指标说明
perf.sh从PipeUtilization.csv提取aic_fixpipe_time(us),并结合平台主频与搬出量计算带宽。
CSV中的计算列如下:
| 列名 | 计算方式 | 说明 |
|---|---|---|
AIC_FixPipe_Time(us) |
取自PipeUtilization.csv的aic_fixpipe_time(us) |
Fixpipe搬出耗时 |
Cycle |
Time(us) * Frequency(MHz) |
根据平台主频折算的Cycle数 |
Bandwidth(GB/s) |
DataSize(bytes) / Time(us) / 1e3 |
数据搬运带宽 |
性能指标计算方法
msopprof在PipeUtilization.csv中采集到的aic_fixpipe_time(us)为微秒(us)单位的搬出耗时。perf.sh会读取该时间列,并结合平台主频和搬出数据量计算Cycle数与实测带宽。
Time转换为Cycle
主频单位为MHz,即每微秒的周期数,因此无需额外换算:
Cycle = Time(us) * Frequency(MHz)
例如Atlas A3/A2训练/推理平台主频为1800MHz,若aic_fixpipe_time(us) = 0.050000:
Cycle = 0.050000 * 1800 = 90.00 cycles
数据搬运量计算
perf.sh按场景的目的数据类型计算搬出量,作为带宽计算的DataSize(bytes):
| 场景 | 数据量计算 | 数据类型大小 |
|---|---|---|
| 1、11 | M * N * sizeof(half) |
2 bytes |
| 2、12 | M * N * sizeof(int8_t) |
1 byte |
| 13、14 | M * N * sizeof(float) |
4 bytes |
实测带宽计算
带宽按GB/s输出。由于Time(us)是微秒,DataSize(bytes) / Time(us)的单位是MB/s,继续除以1e3后得到GB/s:
Bandwidth(GB/s) = DataSize(bytes) / Time(us) / 1e3
例如场景11,shape为[128, 64, 128],目的类型half:
DataSize = 128 * 128 * 2 = 32768 bytes
Time = 0.050000 us
Bandwidth = 32768 / 0.050000 / 1e3 = 655.360 GB/s
理论耗时与带宽利用率
场景表中的“理论带宽(Byte/cycle)”和“带宽延迟(cycle)”可用于估算理论耗时。理论带宽由搬出并行度推导(搬出单元每cycle处理64个out元素,理论带宽=64*sizeof(目的类型),双目标模式等效翻倍);固定延迟表示一次搬运的基础启动开销。理论传输时间可按如下方式估算:
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%
平台主频由perf.sh按场景自动设置:
| 平台 | 架构代号 | 主频 | 适用场景 |
|---|---|---|---|
| Atlas A3/A2训练/推理平台 | dav-2201 | 1800MHz | 1、2 |
| Ascend 950PR/950DT平台 | dav-3510 | 1650MHz | 11-14 |
Roofline分析
本样例提供generate_roofline.py,可基于perf.sh生成的CSV输出ASCII报告和图片。
Python包依赖
generate_roofline.py使用Python标准库读取CSV并生成ASCII报告;如果需要同时生成PNG/PDF图表,需要安装matplotlib和numpy。
python3 -m pip install --user matplotlib numpy
如果未安装上述依赖,脚本仍可生成.txt格式的ASCII分析报告,但会跳过图片生成。
# 自动查找最新perf_data目录中的结果
python3 generate_roofline.py
# 指定CSV文件
python3 generate_roofline.py --csv perf_data_xxx_scenario11/perf_result_scenario11.csv
脚本内置各场景的搬出并行度,无需手工传入峰值带宽;首指令开销默认按场景取(dav-2201为20cycle、dav-3510为26cycle),主频按场景自动取。
图表示例
以下为场景1生成的Roofline图示例:

注意事项
- 场景编号与平台必须匹配:dav-2201用场景1、2,dav-3510用场景11-14,
perf.sh会校验不匹配并报错。 - L0C Buffer到UB通路(场景13、14)仅dav-3510支持,使用
Fixpipe接口与混合编程框架。 - 矩阵规格需符合对齐要求:M、N取16的倍数;双目标模式按M维度拆分时M须为2的倍数,按N维度拆分时N须为32的倍数。
- 本样例为纯性能测试,不校验计算结果。核函数对L0A Buffer、L0B Buffer数据不初始化,保留一条最小Mmad前置产出L0C Buffer数据。
- Mmad前置与搬出指令之间插入
PipeBarrier<PIPE_ALL>,避免流水重叠导致aic_fixpipe_time统计不准。