希姆计算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

显示效果如下:

../_images/dump-example.png

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性能数据:

../_images/kernel-func-perf.png

数据输出

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代表溢出。