希姆计算stc-prof使用说明
版本历史
版本 | 作者 | 日期 | 说明 |
---|---|---|---|
V1.2.0 | 希姆计算 | 2022-04-11 | - 增加record命令--multi-thread选项的说明。 - 文档版本号对齐HPE发版,章节目录优化。 |
V1.0.0 | 希姆计算 | 2021-09-01 | 初始版本。 |
概述
希姆计算提供的异构计算平台性能调优工具包含一个命令行工具stc-prof以及一套性能数据采集接口STCPTI。两者采集与呈现的性能数据内容相同,只是使用方式不同。本文将分别介绍两种使用方式的具体操作步骤以及各项相关性能指标。
基本概念
概念 | 全称 | 说明 |
---|---|---|
NPU | Neural-network Processing Unit | 神经网络处理器,专门面向大规模神经元和突触处理的处理器。采用数据驱动并行计算的架构,非常适合并行计算的场景。 |
NerualScale | NerualScale | 希姆计算自研的NPU神经网络计算加速架构,支持基于RISC-V指令集的扩展指令,具有良好的可编程性。 |
STCP920 | Stream Computing P920 | 希姆计算推出的云端AI推理计算加速板卡,内含可编程NPU,基于NerualScale架构、软硬件协同设计。 |
NPC | Neural-network Processing Core | 希姆计算自研NPU中的神经网络处理核心。 每个NPU中包含多个NPC Cluster,例如STCP920中包含4个NPC Cluster,每个NPC Cluster包括8个NPC,因此STCP920中共包含32个NPC。 每个NPC Cluster以NPC Cluster ID作为标识符,对N个NPC Cluster,异构编程环境中使用0至N-1依次标记,同一个NPU中的所有NPC Cluster的ID是连续的。 |
核函数 | Kernel Function | 一个核函数对应一个计算任务,由主机端(CPU)部署到设备端(NPU),并在设备端的多个NPC上并行执行。 |
本地内存(L1) | L1 | 每个NPC私有的高速内存,STCP920中每个NPC的本地内存大小为1.25 MiB。 |
共享内存(LLB) | Last Level Buffer | 每个NPC Cluster私有的中速内存,由NPC Cluster内的NPC共享,STCP920中每个NPC Cluster的共享内存大小为8 MiB。 |
全局内存(DDR) | Double Data Rate Synchronous Dynamic Random-Access Memory | 每个NPC Cluster私有的低速内存,由NPC Cluster内的NPC共享,STCP920中每个NPC Cluster的全局内存大小为4 GiB。 |
sysDMA | System Direct Memory Access | 数据传输通道,用于在NPC Cluster内的共享内存和全局内存间传输数据。 |
stcc | Stream Computing Heterogeneous C++ Compiler | 异构程序编译器,统一编译异构程序中的主机端程序和设备端程序,生成可执行文件。 |
stc-prof | Stream Computing Profiler | 性能调优工具,采集异构程序的性能数据,分析异构程序的性能。 说明:stc-prof是命令行工具,希姆计算还提供了接口形式的性能调优工具STCPTI( Stream Computing Profiling Tool Interface )。 |
IM | Intermediate Buffer | 中转缓存, 每个NPC私有的高速内存,STCP920中的大小为256KB。 |
PMU | Performance Monitor Unit | 性能数据采集单元。 |
PMC | Performance Monictor Counters | 性能数据采集单元统计的计数器。 |
MCU | Microcontroller Unit | 一款兼容RISC-V指令集架构的微控制器。 |
MME | Matrix MAC Engine | 矩阵MAC引擎。 |
VME | Vector MAC Engine | 向量MAC引擎。 |
MTE | Memory Transfer Engine | 内存传输引擎。 |
stc-prof
stc-prof命令
使用stc-prof --help
可以获取帮助信息:
$ stc-prof --help
help信息输出如下:
OVERVIEW: function tracer for stream computing heterogeneous program
Usage: stc-prof [--version] [--help] [COMMAND [OPTION...] [program]]
COMMAND:
record Record target program performance data
dump Output Chrome tracer file
summary Output summary of target program performance data
OPTION:
--target-pid="pid" Specify output process id
--target-tid="tid" Specify output thread id
detail Output detail of target program performance data. Multiple sub-module names separated by comma can be supported
OPTION:
--sub-module="DEFAULT" Output detail of target program cycle and cache performance data
--sub-module="VME" Output detail of target program VME performance data
--sub-module="MTE" Output detail of target program MTE performance data
--sub-module="MME" Output detail of target program MME performance data
--sub-module="PAL" Output detail of target program parallel data
--sub-module="MCU" Output detail of target program MCU performance data
--sub-module="MEMORY" Output detail of target program Memory data
--sub-module="MEMORY-COL" Output detail of target program Memory collision data
--target-pid="pid" Specify output process id
--target-tid="tid" Specify output thread id
record:用于执行目标程序并采集性能数据。
说明:默认按tid进行profiling,您可以通过添加
--multi-thread
选项指定按pid进行profiling。dump:输出程序执行时间轴,用于分析主机端与设备端程序的执行情况。
summary:输出目标程序概要信息,主要包括HPE Runtime API调用信息,内存信息,Kernel执行信息。
detail: 通过指定子命令输出指定pid/tid的VME、MME、MTE、MCU、PAL、MEMORY、MEMORY-COL信息。
获取性能数据
使用stc-prof record
命令执行目标程序可以获取目标程序的性能数据,命令如下:
$ stc-prof record ./resnet50
Weight: addr:0x1400000 size:72284544
dev_weight_addr:0x1400000 offset:0x01200000
Dma List: addr:0x58ef980 size:24576
使用stc-prof获取目标程序性能数据过程中,不会产生额外打印信息。收集到的性能数据信息会保存在当前目录stc-prof.data目录下,后续的性能数据输出需要使用stc-prof.data目录中内容。
输出性能数据
获取相关性能数据后,就可以使用stc-prof解析当前目录中stc-prof.data的内容输出各类性能数据信息。
summary
summary命令以概要形式对record过程获取的性能数据进行展示,其中包含HPE Runtime API的调用信息,以及每个Kernel Function信息的基本指令情况与sysDMA使用情况,命令如下:
stc-prof summary
summary信息输出如下:
pid:27277
|
--tid:27277
HPE Runtime API Info:
Pid Total Time Avg Time Calls Function
====== ==================== ==================== ====== ================================
27277 9603.682 us 9603.682 us 1 stcGetDevice
27277 11725.294 us 11725.294 us 1 stcDeviceSynchronize
27277 5971.846 us 1194.369 us 5 stcMalloc
27277 6127.097 us 1531.774 us 4 stcFree
27277 49345.448 us 24672.724 us 2 stcMemcpy
27277 5046.427 us 2523.213 us 2 stcMemcpyAsync
27277 4413.666 us 2206.833 us 2 stcConfigureCall
27277 365805.288 us 182902.644 us 2 stcLaunchKernel
27277 361654.087 us 361654.087 us 1 stcModuleLoadData
27277 58893.986 us 58893.986 us 1 stcRegisterFatBinary
27277 11604.920 us 11604.920 us 1 stcUnregisterFatBinary
27277 2540.827 us 2540.827 us 1 stcRuntimeGetVersion
------ -------------------- -------------------- ------ --------------------------------
Kernel Functions:
Kernel-Function Duration MCU MTE MME VME-CU VME-VEC
======================================== ================ ======== ======== ======== ======== ========
preload_kernel (8) 221.262 us 4946 0 0 0 0
resnet50_wrapper_stcconstin (8) 8234.915 us 7949734 2456925 4977836 1712065 0
---------------------------------------- ---------------- -------- -------- -------- -------- --------
Kernel Functions Memory(SysDMA):
Kernel-Function DMA-ID C0 (DDR -> LLB) C1 (LLB -> DDR)
======================================== ======== ========================= =========================
preload_kernel sysdma_0 0 B ( 0.0000 GB/s) 0 B ( 0.0000 GB/s)
resnet50_wrapper_stcconstin sysdma_0 100.10 MB ( 22.5182 GB/s) 32.00 KB ( 19.2075 GB/s)
preload_kernel sysdma_1 0 B ( 0.0000 GB/s) 0 B ( 0.0000 GB/s)
resnet50_wrapper_stcconstin sysdma_1 0 B ( 0.0000 GB/s) 0 B ( 0.0000 GB/s)
---------------------------------------- -------- ------------------------- -------------------------
DEVICE_TO_HOST size: 32.00 KB speed: 0.5666 GB/s
HOST_TO_DEVICE size: 209.79 MB speed: 1.8539 GB/s
各列输出信息描述如下:
列名 | 描述 |
---|---|
pid | 进程号。 |
tid | 线程号。 |
HPE Runtime API Info | HPE Runtime API调用总执行时间、平均执行时间、调用次数信息。 |
Kernel Functions | Kernel Function Major NPC性能数据信息。 |
Kernel Functions Memory | Kernel Function sysDMA 全局内存→共享内存、sysDMA 共享内存→全局内存、D2H、H2D数据量与带宽信息。 |
说明:当需要显示内容大于屏幕高度或者宽度时,可以通过方向键显示未展示部分内容。
detail
detail命令以分类信息形式对record过程获取的性能数据进行展示,其中包含每个Kernel Function的不同种类的硬件性能数据。基本命令格式如下:
stc-prof detail --sub-module="DEFAULT"
stc-prof detail --sub-module="VME"
stc-prof detail --sub-module="MTE"
stc-prof detail --sub-module="MME"
stc-prof detail --sub-module="PAL"
stc-prof detail --sub-module="MCU"
stc-prof detail --sub-module="MEMORY"
stc-prof detail --sub-module="MEMORY-COL"
stc-prof detail --target-pid="pid"
stc-prof detail --target-tid="tid"
--sub-module
用于指定性能数据类别,支持逗号分隔多个类别,输出顺序与参数指定顺序无关。例如:
stc-prof detail --sub-module="VME,MTE,MCU"
--target-pid
用于筛选指定pid的性能数据。 --target-tid
用于筛选指定tid的性能数据。
DEFAULT
DEFAULT分类用于输出Kernel Function执行过程中不同模块汇总性能信息,命令格式如下:
$ stc-prof detail --sub-module="DEFAULT"
输出示例如下:
resnet50_wrapper_stcconstin: device_recorder (cluster_0) duration: 8213.635 us
NPC-CORE MCU-CYCLE MTE MME VME-CU VME-VEC DCACHE MISS ICACHE MISS
========== ========== ======== ======== ======== ======== ============ ============
NPC_00 7959776 2453225 4977825 1712106 0 495 1556
NPC_01 7959923 2686308 4978017 1712253 0 491 1462
NPC_02 7958240 2833073 4978007 1712505 0 491 1484
NPC_03 7958183 2963030 4978020 1713336 0 490 1485
NPC_04 7958112 2729241 4977824 1712240 0 490 1454
NPC_05 7956068 2650715 4978016 1712409 0 490 1470
NPC_06 7956295 2670409 4978024 1712458 0 490 1470
NPC_07 7956240 2822035 4978029 1713541 0 490 1470
---------- ---------- -------- -------- -------- -------- ------------ ------------
各列输出信息描述如下:
列名 | 描述 |
---|---|
NPC-CORE | Kernel Function运行的NPC Core ID。 |
MCU-CYCLE | MCU cycle计数。 |
MTE | 自定义MTE指令cycle计数。 |
MME | 自定义MME指令cycle计数。 |
VME-CU | 自定义VME指令cycle计数。 |
VME-VEC | VEC指令cycle计数。 |
DCACHE-MISS | DCACHE MISS计数。 |
ICACHE-MISS | ICACHE MISS计数。 |
VME
VME分类用于输出Kernel Function执行过程中VME指令相关性能信息,命令格式如下:
$ stc-prof detail --sub-module="VME"
输出示例如下:
resnet50_wrapper_stcconstin: device_recorder (cluster_0) duration: 8213.635 us
NPC-CORE VME-CU VME-CU INST VME-VEC VME-VEC INST VME VME-MME VME-MTE VME-MME-MTE
========== ======== ============= ======== ============= ======================================
NPC_00 1712106 5426 0 0 8.0% 8.9% 2.9% 7.6%
NPC_01 1712253 5426 0 0 7.8% 8.5% 2.8% 7.4%
NPC_02 1712505 5426 0 0 7.6% 8.3% 2.9% 7.5%
NPC_03 1713336 5434 0 0 7.4% 8.1% 3.0% 7.5%
NPC_04 1712240 5426 0 0 7.6% 8.6% 3.0% 7.3%
NPC_05 1712409 5426 0 0 7.8% 8.6% 2.8% 7.4%
NPC_06 1712458 5426 0 0 7.9% 8.5% 2.8% 7.6%
NPC_07 1713541 5434 0 0 7.7% 8.2% 2.8% 7.6%
---------- -------- ------------- -------- ------------- --------------------------------------
各列输出信息描述如下:
列名 | 描述 |
---|---|
NPC-CORE | Kernel Function运行的NPC Core ID。 |
VME-CU | 自定义VME指令cycle计数。 |
VME-CU INST | 自定义VME指令数。 |
VME-VEC | VEC指令cycle计数。 |
VME-VEC INST | VEC指令数。 |
VME | VME指令单独执行百分比。 |
VME-MME | VME,MME共同执行并行度百分比。 |
VME-MTE | VME,MTE共同执行并行度百分比。 |
VME-MME-MTE | VME,MME,MTE共同执行并行度百分比。 |
MTE
MTE分类用于输出Kernel Function执行过程中MTE指令相关性能信息,命令格式如下:
$ stc-prof detail --sub-module="MTE"
输出示例如下:
resnet50_wrapper_stcconstin: device_recorder (cluster_0) duration: 8213.635 us
NPC-CORE MTE MTE INST MTE MTE-MME MTE-VME MTE-MME-VTE
========== ======== ========== ======================================
NPC_00 2453225 1928 9.6% 19.1% 2.9% 7.6%
NPC_01 2686308 1976 12.5% 18.8% 2.8% 7.4%
NPC_02 2833073 1972 13.1% 20.1% 2.9% 7.5%
NPC_03 2963030 1948 14.3% 20.2% 3.0% 7.5%
NPC_04 2729241 1928 12.6% 19.3% 3.0% 7.3%
NPC_05 2650715 1976 12.2% 18.8% 2.8% 7.4%
NPC_06 2670409 1972 11.6% 19.8% 2.8% 7.6%
NPC_07 2822035 1948 13.0% 20.0% 2.8% 7.6%
---------- -------- ---------- --------------------------------------
各列输出信息描述如下:
列名 | 描述 |
---|---|
NPC-CORE | Kernel Function运行的NPC Core ID。 |
MTE | 自定义MTE指令cycle计数。 |
MTE INST | 自定义MTE指令数。 |
MTE | MTE指令单独执行百分比。 |
MTE-MME | MTE、MME共同执行并行度百分比。 |
MTE-VME | MTE、VME共同执行并行度百分比。 |
MTE-MME-VTE | MTE、MME、VTE共同执行并行度百分比。 |
MME
MME分类用于输出Kernel Function执行过程中MME指令相关性能信息,命令格式如下:
$ stc-prof detail --sub-module="MME"
输出示例如下:
resnet50_wrapper_stcconstin: device_recorder (cluster_0) duration: 8213.635 us
NPC-CORE MME MME INST MME MME-VME MME-MTE MME-VME-MTE
========== ======== ========== ======================================
NPC_00 4977825 2220 43.9% 8.9% 19.1% 7.6%
NPC_01 4978017 2220 42.2% 8.5% 18.8% 7.4%
NPC_02 4978007 2220 40.5% 8.3% 20.1% 7.5%
NPC_03 4978020 2220 39.6% 8.1% 20.2% 7.5%
NPC_04 4977824 2220 41.7% 8.6% 19.3% 7.3%
NPC_05 4978016 2220 42.5% 8.6% 18.8% 7.4%
NPC_06 4978024 2220 41.9% 8.5% 19.8% 7.6%
NPC_07 4978029 2220 40.7% 8.2% 20.0% 7.6%
---------- -------- ---------- --------------------------------------
各列输出信息描述如下:
列名 | 描述 |
---|---|
NPC-CORE | Kernel Function运行的NPC Core ID。 |
MME | 自定义MME指令cycle计数。 |
MME INST | 自定义MME指令数。 |
MME | MME指令单独执行百分比。 |
MME-VME | MME、VME共同执行并行度百分比。 |
MME-MTE | MME、MTE共同执行并行度百分比。 |
MME-VME-MTE | MME、VME、MTE共同执行并行度百分比。 |
PAL
PAL分类用于输出Kernel Function执行过程中并行度相关性能信息,命令格式如下:
$ stc-prof detail --sub-module="PAL"
输出示例如下:
resnet50_wrapper_stcconstin: device_recorder (cluster_0) duration: 8213.635 us
NPC-CORE PAL(ALL) PAL(MTE/MME) PAL(MTE/VME) PAL(VME/MME)
========== ================ ================ ================ ================
NPC_00 473581(7.562%) 1197094(19.114%) 179677(2.869%) 556347(8.883%)
NPC_01 477441(7.378%) 1219619(18.848%) 178025(2.751%) 553112(8.548%)
NPC_02 485797(7.460%) 1309135(20.104%) 188205(2.890%) 542811(8.336%)
NPC_03 494888(7.492%) 1331031(20.151%) 195073(2.953%) 533126(8.071%)
NPC_04 473029(7.302%) 1247243(19.252%) 192010(2.964%) 555521(8.575%)
NPC_05 478010(7.417%) 1208969(18.758%) 177872(2.760%) 553160(8.583%)
NPC_06 486534(7.602%) 1266397(19.788%) 176855(2.763%) 544860(8.514%)
NPC_07 495266(7.615%) 1299408(19.979%) 184530(2.837%) 535147(8.228%)
---------- ---------------- ---------------- ---------------- ----------------
各列输出信息描述如下:
列名 | 描述 |
---|---|
NPC-CORE | Kernel Function运行的NPC Core ID。 |
PAL(ALL) | MTE、MME、VTE共同执行并行度百分比。 |
PAL(MTE/MME) | MTE、MME共同执行并行度百分比。 |
PAL(MTE/VME) | MTE、VME共同执行并行度百分比。 |
PAL(VME/MME) | VME、MME共同执行并行度百分比。 |
MCU
MCU分类用于输出Kernel Function执行过程中MCU指令相关性能信息,命令格式如下:
$ stc-prof detail --sub-module="MCU"
输出示例如下:
resnet50_wrapper_stcconstin: device_recorder (cluster_0) duration: 8213.635 us
NPC-CORE MCU INST MCU CYCLE DCACHE MISS ICACHE MISS
========== ============ ============ ============ ============
NPC_00 459528 8008766 495 1556
NPC_01 431166 8006122 491 1462
NPC_02 431218 8011689 491 1484
NPC_03 430290 8011805 490 1485
NPC_04 430894 8011459 490 1454
NPC_05 431190 8015949 490 1470
NPC_06 431206 8016205 490 1470
NPC_07 430290 8016834 490 1470
---------- ------------ ------------ ------------ ------------
各列输出信息描述如下:
列名 | 描述 |
---|---|
NPC-CORE | Kernel Function运行的NPC Core ID。 |
MCU INST | MCU指令计数。 |
MCU CYCLE | MCU cycle计数。 |
DCACHE MISS | DCACHE MISS计数。 |
ICACHE MISS | ICACHE MISS计数。 |
说明:此处的MCU cycle统计为non-stopable的第三方寄存器,会比DEFAULT情况下的MCU-CYCLE统计值偏大,后者在kernel执行结束后会被立即停止计数。
MEMORY
MEMORY分类用于输出Kernel Function执行过程中全局内存/共享内存/本地内存相关性能信息,命令格式如下:
$ stc-prof detail --sub-module="MEMORY"
输出示例如下:
resnet50_wrapper_stcconstin: device_recorder (cluster_0) duration: 8213.635 us
SYSDMA-ID C0 (DDR -> LLB) C1 (LLB -> DDR)
======================================================================================================
sysdma_0 100.1 MB (22.504 GB/s) 32.00 KB (22.306 GB/s)
sysdma_1 0 B (0.000 GB/s) 0 B (0.000 GB/s)
******************************************************************************************************
NPC-CORE ICMOV PLD L1 -> LLB LLB -> L1
======================================================================================================
npc_0 420.0 KB (34.664 GB/s) 92.43 MB (43.569 GB/s) 1.344 MB (11.350 GB/s) 805.0 KB (8.666 GB/s)
npc_1 1.560 MB (37.178 GB/s) 0 B (0 GB/s) 1.344 MB (11.398 GB/s) 2.348 MB (14.147 GB/s)
npc_2 1.177 MB (30.828 GB/s) 0 B (0 GB/s) 1.344 MB (14.686 GB/s) 1.583 MB (12.269 GB/s)
npc_3 1.669 MB (40.259 GB/s) 0 B (0 GB/s) 1.344 MB (13.880 GB/s) 3.093 MB (15.452 GB/s)
npc_4 420.0 KB (37.169 GB/s) 0 B (0 GB/s) 1.344 MB (13.385 GB/s) 805.0 KB (8.773 GB/s)
npc_5 1.560 MB (38.370 GB/s) 0 B (0 GB/s) 1.344 MB (11.947 GB/s) 2.348 MB (13.820 GB/s)
npc_6 1.177 MB (38.606 GB/s) 0 B (0 GB/s) 1.344 MB (12.200 GB/s) 1.583 MB (12.130 GB/s)
npc_7 1.669 MB (47.177 GB/s) 0 B (0 GB/s) 1.344 MB (11.762 GB/s) 3.093 MB (15.297 GB/s)
------------------------------------------------------------------------------------------------------
各列输出信息描述如下:
列名 | 描述 |
---|---|
SYSDMA-ID | Kernel Function使用的sysDMA ID。 |
C0(DDR→LLB) | sysDMA Channel 0 数据与带宽信息。 |
C1(LLB→DDR) | sysDMA Channel 1 数据与带宽信息。 |
NPC-CORE | Kernel Function运行的NPC Core ID。 |
ICMOV | MTE icmov指令数据量与带宽。 |
PLD | MTE pld指令数据量与带宽。 |
L1→LLB | MTE mov.llb.l1指令数据量与带宽。 |
LLB→L1 | MTE mov.l1.llb指令数据量与带宽。 |
MEMORY-COL
MEMORY-COL分类用于输出Kernel Function执行过程中全局内存/共享内存/本地内存冲突相关性能信息,命令格式如下:
$ stc-prof detail --sub-module="MEMORY-COL"
输出示例如下:
resnet50_wrapper_stcconstin: device_recorder (cluster_0) duration: 8213.635 us
SYSDMA-ID LLB COLLISION
======================================================================================================
sysdma_0 85
sysdma_1 0
******************************************************************************************************
NPC-CORE L1 COLLISION TYPE L1 COLLISION VAL IM COLLISION TYPE IM COLLISION VAL
======================================================================================================
npc_0 L1_COLS_TO_MEM 247800 IM_COLS_TO_MEM 0
npc_1 L1_COLS_TO_MEM 257982 IM_COLS_TO_MEM 0
npc_2 L1_COLS_TO_MEM 255544 IM_COLS_TO_MEM 0
npc_3 L1_COLS_TO_MEM 249929 IM_COLS_TO_MEM 0
npc_4 L1_COLS_TO_MEM 248689 IM_COLS_TO_MEM 0
npc_5 L1_COLS_TO_MEM 259612 IM_COLS_TO_MEM 0
npc_6 L1_COLS_TO_MEM 256727 IM_COLS_TO_MEM 0
npc_7 L1_COLS_TO_MEM 251025 IM_COLS_TO_MEM 0
------------------------------------------------------------------------------------------------------
各列输出信息描述如下:
列名 | 描述 |
---|---|
SYSDMA-ID | Kernel Function使用的sysDMA ID。 |
LLB COLLISION VAL | 共享内存冲突性能计数。 |
NPC-CORE | Kernel Function运行的NPC Core ID。 |
L1 COLLISION TYPE | 本地内存冲突数据种类。 |
L1 COLLISION VAL | 本地内存冲突性能计数。 |
IM COLLISION TYPE | Intermediate Buffer冲突数据块选择。 |
IM COLLISION VAL | Intermediate Buffer冲突性能计数。 |
dump
ctf(chrome tracer file)是一种使用json格式描述各类事件发生与结束的文本文件,其内容可通过使用chrome://tracing/打开并显示。
stc-prof工具提供了dump子命令,可将信息收集过程HPE Runtime API与stream信息输出为ctf文件,通过chrome://tracing/展示执行时间线。
$ stc-prof dump > file_name.json
显示效果如下:
STCPTI
STCPTI是希姆异构计算平台的性能数据采集接口,主要用于异构计算程序的性能数据获取。接口功能主要由以下头文件和共享链接库提供:
stcpti.h
libprofiler_stc.so
libtracer_stc.so
使用流程
头文件
用户使用STCPTI时,需要包含以下头文件:
stcpti.h
#if !defined(__SHC_NPU_COMPILE__) #include <stcpti.h> #endif
__SHC_NPU_COMPILE__宏用于控制#include只在主机端代码进行编译时生效。
编译
利用STCPTI进行profiling时,需要添加两个链接选项:
-lprofiler_stc
-ltracer_stc
$ stcc x.hc xx.hc -DNCORE=N -lprofiler_stc -ltracer_stc -o xxx
接口调用
定义STCpti_PerfDatas并作为参数传给stcptiKernelGetPerfDatas:
STCpti_PerfDatas perf_data = {0};
...
stcptiKernelGetPerfDatas(&perf_data);
根据以下步骤获取Kernel Function性能数据:
数据输出
STCpti_PerfDatas包含一个STCpti_KernelPerfDatas数组,数组中每个元素为一个Kernel采集到的性能数据。结构体属性如下:
属性名称 | 属性类型 | 属性描述 |
---|---|---|
kernelPerfDataSize | size_t | STCpti_KernelPerfDatas数组的大小。 |
pKernelPerfDatas | STCpti_KernelPerfDatas * | STCpti_KernelPerfDatas数组指针。 |
STCpti_KernelPerfDatas包含一个STCpti_KernelNpcPerfData数组,数组中每个元素为一个NPC上的性能数据。结构体属性如下:
属性名称 | 属性类型 | 属性描述 |
---|---|---|
pKernelName | char* | kernel的名称。 |
kernelNpcPerfDataSize | size_t | STCpti_KernelNpcPerfData数组的大小。 |
arrKernelNpcPerfData | STCpti_KernelNpcPerfData * | STCpti_KernelNpcPerfData数组指针。 |
kernelDmaPerfData | STCpti_KernelDmaPerfData | STCpti_KernelDmaPerfData包含event数组。 |
代码示例:
const char* name = NULL;
for (int i = 0; i < perf_data.kernelPerfDataSize; i++) {
STCpti_KernelPerfDatas *kernel_perf_datas_ptr =
&perf_data.pKernelPerfDatas[i];
for (int j = 0; j < kernel_perf_datas_ptr->kernelNpcPerfDataSize; j++) {
STCpti_KernelNpcPerfData *kernel_npc_perf_data_ptr =
&kernel_perf_datas_ptr->arrKernelNpcPerfData[j];
for (int m = 0; m < STC_PTI_EVENT_ID_SYSDMA0_DMA_ID; m++) {
stcptiGetEventNameFromID(m, &name);
printf("kernel: %d npc: %d event %02d %s [%u]\n", i, j, m, name,
kernel_npc_perf_data_ptr->event[m]);
}
}
for ( int k = STC_PTI_EVENT_ID_SYSDMA0_DMA_ID; k < STC_PTI_EVENT_ID_MAX; k++ ){
stcptiGetEventNameFromID(k, &name);
STCpti_KernelDmaPerfData* kernel_dma_perf_data_ptr =
&(kernel_perf_datas_ptr->kernelDmaPerfData);
printf("kernel: %d dma event %02d %s [%u]\n", i, k, name,
kernel_dma_perf_data_ptr->event[ k - STC_PTI_EVENT_ID_SYSDMA0_DMA_ID]);
}
}
接口定义
返回值
stcProfilerResult_t
描述:
枚举定义 | 枚举值 | 说明 |
---|---|---|
STC_PROFILER_ERROR | -1 | 函数调用返回失败。 |
STC_PROFILER_SUCCESS | 0 | 函数调用无错误返回。 |
STC_PROFILER_ERROR_INVALID_ARGU | 1 | 无效的参数。 |
STC_PROFILER_ERROR_UNKNOW | 2 | 未知的错误。 |
Event定义
stcPtiEventID_t
描述:
枚举定义 | 枚举值 | 说明 |
---|---|---|
STC_PTI_EVENT_ID_MCU_CYCLE | 0 | 自定义PMC, mcu执行的cycle数。 |
STC_PTI_EVENT_ID_VME_CYCLE | 1 | 自定义PMC, VME执行的cycle数。 |
STC_PTI_EVENT_ID_MME_CYCLE | 2 | 自定义PMC, MME执行的cycle数。 |
STC_PTI_EVENT_ID_VEC_CYCLE | 3 | 自定义PMC, VME执行的cycle数。 |
STC_PTI_EVENT_ID_SYN_CYCLE | 4 | 自定义PMC, SYNC执行的cycle数。 |
STC_PTI_EVENT_ID_MTE_TOTAL_CYCLE | 5 | 自定义PMC, 所有MTE指令的cycle数。 |
STC_PTI_EVENT_ID_VME_INST | 6 | 自定义PMC, VME的指令个数。 |
STC_PTI_EVENT_ID_MME_INST | 7 | 自定义PMC, MME的指令个数。 |
STC_PTI_EVENT_ID_VEC_INST | 8 | 自定义PMC, VME的指令个数。 |
STC_PTI_EVENT_ID_SYN_INST | 9 | 自定义PMC, SYNC的指令个数。 |
STC_PTI_EVENT_ID_MTE_PLD_INST | 10 | 自定义PMC, MTE的pld指令个数。 |
STC_PTI_EVENT_ID_MTE_ICMOV_INST | 11 | 自定义PMC, MTE的icmov指令个数。 |
STC_PTI_EVENT_ID_MTE_MOV_INST | 12 | 自定义PMC, MTE的mov指令个数。 |
STC_PTI_EVENT_ID_PAL_VME_MME_CYCLE | 13 | 自定义PMC, VME与MME并行执行的cycle数。 |
STC_PTI_EVENT_ID_PAL_MTE_MME_CYCLE | 14 | 自定义PMC, MTE与MME并行执行的cycle数。 |
STC_PTI_EVENT_ID_PAL_VME_MTE_CYCLE | 15 | 自定义PMC, VME与MTE并行执行的cycle数。 |
STC_PTI_EVENT_ID_PAL_TOTAL_CYCLE | 16 | 自定义PMC, VME,MME和MTE并行执行的cycle数。 |
STC_PTI_EVENT_ID_MTE_ICMOV_CYCLE | 17 | 自定义PMC, MTE的icmov执行的cycle数。 |
STC_PTI_EVENT_ID_MTE_L12LLB_CYCLE | 18 | 自定义PMC, MTE的L1到LLB执行的cycle数。 |
STC_PTI_EVENT_ID_MTE_LLB2L1_CYCLE | 19 | 自定义PMC, MTE的LLB到L1执行的cycle数。 |
STC_PTI_EVENT_ID_MTE_PLD_CYCLE | 20 | 自定义PMC, MTE的pld执行的cycle数。 |
STC_PTI_EVENT_ID_MTE_PLD_BYTE | 21 | 自定义PMC, MTE的pld执行的byte数量。 |
STC_PTI_EVENT_ID_MTE_L12LLB_BYTE | 22 | 自定义PMC, MTE的L1到LLB执行的byte数量。 |
STC_PTI_EVENT_ID_MTE_LLB2L1_BYTE | 23 | 自定义PMC, MTE的LLB到L1执行的byte数量。 |
STC_PTI_EVENT_ID_MTE_ICMOV_BYTE | 24 | 自定义PMC, MTE的icmov执行的byte数量。 |
STC_PTI_EVENT_ID_SYN_WAIT_CYCLE | 25 | 自定义PMC, SYNC wait的cycle数。 |
STC_PTI_EVENT_ID_VEC_SLOT_WAIT_CYCLE | 26 | 自定义PMC, VEC wait的cycle数。 |
STC_PTI_EVENT_ID_MME_SLOT_WAIT_CYCLE | 27 | 自定义PMC, MME wait的cycle数。 |
STC_PTI_EVENT_ID_MTE_SLOT_WAIT_CYCLE | 28 | 自定义PMC, MTE wait的cycle数。 |
STC_PTI_EVENT_ID_MIF_L1_CONFLICT_CYCLE | 29 | 自定义PMC, MIF L1的访问冲突cycle数。 |
STC_PTI_EVENT_ID_MIF_IM_CONFLICT_CYCLE | 30 | 自定义PMC, MIF IM的访问冲突cycle数。 |
STC_PTI_EVENT_ID_MCU_EVENT3_TYPE_CNT | 31 | 第三方PMC, 可配置寄存器。 |
STC_PTI_EVENT_ID_MCU_EVENT4_TYPE_CNT | 32 | 第三方PMC, 可配置寄存器。 |
STC_PTI_EVENT_ID_MCU_EVENT5_TYPE_CNT | 33 | 第三方PMC, 可配置寄存器。 |
STC_PTI_EVENT_ID_MCU_EVENT6_TYPE_CNT | 34 | 第三方PMC, 可配置寄存器。 |
STC_PTI_EVENT_ID_MCU_EVENT6H_TYPE_CNT | 35 | 第三方PMC, STC_PTI_EVENT_ID_MCU_EVENT6_TYPE_CNT的高32位。 |
STC_PTI_EVENT_ID_MCU_MCOUNTER_OVERFLOW | 36 | 第三方PMC, 判断event计数是否溢出。 |
STC_PTI_EVENT_ID_SYSDMA0_DMA_ID | 37 | sysDMA的ID。 |
STC_PTI_EVENT_ID_SYSDMA0_LLB_CONFLICT_CYCLE | 38 | sysDMA0上LLB冲突的cycle数。 |
STC_PTI_EVENT_ID_SYSDMA0_DMA_C0_CYCLE0 | 39 | sysDMA0上channel0最近一次传输cycle数。 |
STC_PTI_EVENT_ID_SYSDMA0_DMA_C0_CYCLE1 | 40 | sysDMA0上channel0所有传输cycle数。 |
STC_PTI_EVENT_ID_SYSDMA0_DMA_C0_BYTE | 41 | sysDMA0上channel0传输字节数。 |
STC_PTI_EVENT_ID_SYSDMA0_DMA_C1_CYCLE0 | 42 | sysDMA0上channel1最近一次传输cycle数。 |
STC_PTI_EVENT_ID_SYSDMA0_DMA_C1_CYCLE1 | 43 | sysDMA0上channel1所有传输cycle数。 |
STC_PTI_EVENT_ID_SYSDMA0_DMA_C1_BYTE | 44 | sysDMA0上channel1传输字节数。 |
STC_PTI_EVENT_ID_SYSDMA1_DMA_ID | 45 | sysDMA的ID。 |
STC_PTI_EVENT_ID_SYSDMA1_LLB_CONFLICT_CYCLE | 46 | sysDMA1上LLB冲突的cycle数。 |
STC_PTI_EVENT_ID_SYSDMA1_DMA_C0_CYCLE0 | 47 | sysDMA1上channel0最近一次传输cycle数。 |
STC_PTI_EVENT_ID_SYSDMA1_DMA_C0_CYCLE1 | 48 | sysDMA1上channel0所有传输cycle数。 |
STC_PTI_EVENT_ID_SYSDMA1_DMA_C0_BYTE | 49 | sysDMA1上channel0传输字节数。 |
STC_PTI_EVENT_ID_SYSDMA1_DMA_C1_CYCLE0 | 50 | sysDMA1上channel1最近一次传输cycle数。 |
STC_PTI_EVENT_ID_SYSDMA1_DMA_C1_CYCLE1 | 51 | sysDMA1上channel1所有传输cycle数。 |
STC_PTI_EVENT_ID_SYSDMA1_DMA_C1_BYTE | 52 | sysDMA1上channel1传输字节数。 |
STC_PTI_EVENT_ID_MAX | 53 | enum边界值。 |
接口详细说明
host stcProfilerResult_t stcptiKernelContextCreate
函数描述:为指定进程创建Kernel Function Profiler Context。
函数类型:同步函数
函数定义:
__host__ stcProfilerResult_t stcptiKernelContextCreate()
返回值:详见stcProfilerResult_t定义。
host stcProfilerResult_t stcptiKernelContextRelease
函数描述:释放指定进程Kernel Function Profiler Context。
函数类型:同步函数
函数定义:
__host__ stcProfilerResult_t stcptiKernelContextRelease()
返回值:详见stcProfilerResult_t定义。
host stcProfilerResult_t stcptiKernelContextReleaseAll
函数描述:释放所有进程Kernel Function Profiler Context。
函数类型:同步函数
函数定义:
__host__ stcProfilerResult_t stcptiKernelContextReleaseAll()
返回值:详见stcProfilerResult_t定义。
host stcProfilerResult_t stcptiKernelEnable
函数描述:使能指定进程Kernel Function Profiler数据获取功能。
函数类型:同步函数
函数定义:
__host__ stcProfilerResult_t stcptiKernelEnable()
返回值:详见stcProfilerResult_t定义。
host stcProfilerResult_t stcptiKernelDisable
函数描述:关闭指定进程Kernel Function Profiler数据获取功能。
函数类型:同步函数
__host__ stcProfilerResult_t stcptiKernelDisable()
返回值:详见stcProfilerResult_t定义。
host stcProfilerResult_t stcptiKernelGetPerfDatas
函数描述:获取指定进程Kernel Function Profiler数据。
函数类型:同步函数
函数定义:
__host__ stcProfilerResult_t stcptiKernelGetPerfDatas(struct STCpti_PerfDatas *perf_data)
参数说明:
参数名称 | 参数类型 | 描述 |
---|---|---|
perf_data | 输出参数 | STCpti_PerfDatas类型,用于返回所有Kernel Function在所有NPC上的性能数据。 |
返回值:详见stcProfilerResult_t定义。
host stcProfilerResult_t stcptiGetEventNameFromID
函数描述:获取指定stcPtiEventID_t对应的event名称。
函数类型:同步函数
函数定义:
__host__ stcProfilerResult_t stcptiGetEventNameFromID(int e, const char **eventName);
参数说明:
参数名称 | 参数类型 | 描述 |
---|---|---|
e | 输入参数 | 需要查询的stcPtiEventID_t值。 |
eventName | 输出参数 | 查询到的event名称。 |
返回值:详见stcProfilerResult_t定义。
host bool stcptiKernelIsMcuCycle32Ovf
函数描述:判断32位的mcu cycle寄存器是否溢出。
函数类型:同步函数
函数定义:
__host__ bool stcptiKernelIsMcuCycle32Ovf(struct STCpti_KernelNpcPerfData kernel_perf_data);
参数说明:
参数名称 | 参数类型 | 描述 |
---|---|---|
kernel_perf_data | 输入参数 | 需要查询的NPC性能数据。 |
返回值:bool,0代表未溢出,1代表溢出。
host uint64_t stcptiKernelGetMcuCycle64
函数描述:获取64位的mcu cycle计数值。
函数类型:同步函数
函数定义:
__host__ uint64_t stcptiKernelGetMcuCycle64(struct STCpti_KernelNpcPerfData kernel_perf_data);
参数说明:
参数名称 | 参数类型 | 描述 |
---|---|---|
kernel_perf_data | 输入参数 | 需要查询的NPC性能数据。 |
返回值:uint64_t
host bool stcptiKernelIsMcuCycle64Ovf
函数描述:判断64位的mcu cycle寄存器是否溢出。
函数类型:同步函数
函数定义:
__host__ bool stcptiKernelIsMcuCycle64Ovf(struct STCpti_KernelNpcPerfData kernel_perf_data);
参数说明:
参数名称 | 参数类型 | 描述 |
---|---|---|
kernel_perf_data | 输入参数 | 需要查询的NPC性能数据。 |
返回值:bool,0代表未溢出,1代表溢出。