跳到主要内容

性能分析与对比

ZStudio 中内置了程序性能分析&可视化流水线工具 ZProf,帮助用户定位从函数层级到微架构层级的性能瓶颈并进行针对性的优化。

性能分析

本节将介绍 ZStudio 中性能分析工具的使用方法。关于性能分析的示例项目,请参考 AccInst

执行性能分析

用户在执行性能分析前,需要先成功构建项目。完成项目构建后,可以直接保持默认配置执行性能分析,点击菜单栏"性能分析" > "启动性能分析"生成性能分析数据。

启动性能分析

性能分析完成之前不要重新执行,以免生成错误数据。完成后右下角会生成提示信息,性能分析结果将在编辑器中打开。

性能分析完成

也可以根据需要更改性能分析配置,点击菜单栏的"性能分析" > "配置"。

性能分析配置

性能分析配置1

性能分析配置2

  • 选择开发板:选择"内置"开发板或添加"自定义"开发板。

    • 仿真器虚拟开发板:通过下拉框选择内置的目标虚拟开发板。

    • 开发板配置文件:指定添加自定义开发板的配置文件路径。

  • 展示统计信息: 选择是否在运行控制台中打印仿真器运行可执行程序的性能统计数据,即 instructions, cycles, branch count, branch misses 以及 IPC 等数据。

  • 性能结果输出目录:指定结果保存的目录名,默认为 {project_name}.zprof,所有结果将在导航栏中 zprof-output 节点下列出。

  • 仿真器参数:指定传递给仿真器的参数,默认不传递任何参数。

  • 性能分析覆盖:对于相同配置的同一个项目进行性能分析,是否允许最新的性能分析数据是否自动覆盖上一次数据,如果选择不自动覆盖,将为每次得到的新结果添加一个时间戳。

  • 程序参数:指定传给运行项目的参数,默认不传递任何参数。

性能分析结果

性能分析结果中统计了衡量程序或代码段性能的重要指标,包括程序性能指标(Program Summary)和函数执行统计(Function Summary)两部分。

性能分析结果

Program Summary 列出了程序在执行过程中的所有重要指标,如下列表所示:

程序性能指标
程序性能指标
程序性能指标描述
时钟周期总数(Total Cycle)程序执行期间所花费的时钟周期总数。
指令总数(Total Instruction)程序执行期间执行的指令总数。
时钟周期执行的平均指令数(Instruction Per Cycle, IPC)指在一个时钟周期内执行的平均指令数。高 IPC 表示更好的性能。
指令缓存未命中总数(Total Instruction Cache Misses)在指令缓存中无法找到所需指令的次数。
数据缓存未命中(Total Data Cache Misses)在数据缓存中无法找到所需数据的次数。
分支方向预测失败(Total Branch Direction Prediction Misses)无法正确预测程序中分支的执行路径的次数。
分支或跳转目标预测失败(Total Branch or Jump Prediction Misses)处理器在执行分支或跳转指令时无法准确预测目标地址的次数。

函数执行统计(Function Summary)列表中,统计了程序中所有函数的重要指标,用户点击某个指标的标题行可以针对该指标对函数进行从大到小或从小到大排序,例如点击 "Self Cycle",所有函数将根据函数在执行期间实际使用的处理器时钟周期数从大到小进行排序。

函数执行统计

根据函数执行统计表,用户可以快速定位瓶颈函数。点击列表右侧 jump-to-source-button 按钮,将在编辑器右侧打开源代码文件并定位到对应的源代码位置。

跳转至源代码

函数执行统计列表中的其他函数指标可参考下表:

函数执行统计中的函数指标
指标描述
Functions项目中所有执行过的函数名
Address函数的内存地址
Exec Times函数的执行次数
Self Cycle函数在执行期间实际使用的处理器时钟周期数
Total Cycle包含内部调用或子任务的时钟周期数
Self Instructions函数内部实际执行的指令数量
Total Instructions包含被该函数调用的其他函数或子程序的指令数量
Cycle Percentage函数占用总时钟周期的百分比
Self Instruction Cache Misses函数执行过程中自身指令缓存未命中次数
Total Instruction Cache Misses包括函数调用的其他子程序的指令缓存未命中次数
Self Data Cache Misses函数执行过程中自身数据缓存未命中次数
Total Data Cache Misses包括函数调用的其他子程序的数据缓存未命中次数
Self Branch Direction Prediction Misses函数执行中自身分支方向预测失败次数
Total Branch Direction Prediction Misses包括调用的其他子程序的分支方向预测失败次数
Self Branch Or Jump Prediction Misses函数执行中自身跳转或分支预测失败次数
Total Branch Or Jump Prediction Misses包括调用的其他子程序的跳转或分支预测失败次数

高频代码分析

ZStudio 还提供了高频代码(Code Coverage)的分析信息,包括哪些代码被执行的次数最多,占用资源多等。帮助开发者快速定位和解决性能问题,并提高程序的整体性能。

当用户从 Function Summary 或 Pipeline 跳转到源代码时,可以通过菜单栏"性能分析" > "启动代码覆盖率分析"选项获取每行代码的执行次数的信息。

提示

获取 code coverage 数据必须使用 Debug 配置( -g )编译项目

启动高频代码分析

运行完成后,可以看到代码行的右侧显示出执行次数。性能分析信息概览,例如 IPC, instructions 和 cycle 信息也将显示在代码行下,在源代码中点击"Enter Pipeline"将进入流水线视图。

从源代码进入流水线视图

用户可以自定义这些信息是否显示,使用快捷键 Control+Shift+P 打开命令面板,输入并选择选单中的 Code Editor: Toggle Profiling Summary 选项可以关闭性能分析的数据信息显示;输入并选择 Code Editor: Toggle Code Coverage 选项,可以关闭高频代码执行次数显示。

微架构流水线

微架构流水线视图(Micro Arch Pipeline)将程序中的指令可视化为流程图来表示其执行情况,标示出数据相关性的停顿泡(bubbles),并使用不同颜色进行类型区分。

用户可以通过以下当时打流水线视图:

  1. 选择菜单栏"性能分析" > "微架构流水线",在选单中选择已完成的数据即可打开流水线视图。

  2. 从函数执行统计(Function Summary)中点击 jump-to-pipeline-button 按钮跳转至流水线视图。

  3. 在代码编辑器中点击"Enter Pipeline"将进入流水线视图。

微架构流水线

微架构流水线视图(Micro Arch Pipeline)使用不同颜色区分不同类型的停顿泡(bubbles), 参考下表:

流水线中的停顿泡类型
停顿泡描述
ICache Miss指令高速缓存未命中;CPU 流水线停滞,产生 bubble
DCache Miss数据高速缓存未命中;CPU 流水线停滞,产生 bubble
Pipeline Flush流水线清空;CPU 检测到分支指令或者异常处理停止当前正在执行的指令,并清空流水线中的指令,产生 bubble
Data Hazard数据冒险;当一个指令依赖于尚未完成的前一条指令的结果时,产生 bubble
Structural Hazard结构冒险;硬件资源冲突(如多个指令同时访问同一资源)导致流水线停滞,产生 bubble
Stalled by Previous前一个阶段停顿;流水线中某个阶段的执行需要等待前一个阶段完成后才能开始,产生 bubble

指令流水线(Instruction Pipeline)视图重点关注指令的执行过程并发现指令执行中的潜在性能问题。点击下拉框查看不同类型的 bubbles,点击前进后退按钮进行同类型 bubbles 快速跳转;在搜索框中输入 PC 地址和 cycle 可以进行快速定位。

指令流水线

在指令流水线视图中,点击指令地址或者反汇编码可导航至源代码。

指令流水线

资源流水线(Resource Pipeline)视图侧重于描述计算机硬件资源之间的关系和数据流动方式,从硬件模块的维度显示了硬件资源的利用效率和数据流动方式。

资源流水线

用户可以选择界面左下角 "首选项" > "流水线设置",在流水线设置中自定义停顿泡颜色,以及决定横向流水线和纵向流水线是否同步滚动。

流水线设置

性能分析对比

本节介绍如何利用性能分析对比工具,对比多个性能分析结果。通过性能分析对比,用户可以对比不同构建配置,不同微架构以及添加特殊加速指令的源码更改对性能的影响。

用户每次执行性能分析的结果都将显示在"性能分析对比"视图的左侧栏中,点击 refresh-button (刷新)按钮以获取最新数据,当性能分析结果过多时,可以通过搜索框快速定位到需要对比的结果数据。

性能分析结果列表

用户可以遵循以下步骤进行性能分析结果对比:

  1. 在主菜单中,点击"视图" > "性能分析对比" 调出对比工具。

  2. 在"性能分析对比"视图的左侧栏中,右键点击某个性能分析结果,并点击"选为对比基准"。

  3. 尝试按住 ShiftCtrl 键同时选择多个结果,右击选择"对比",或者点击compare-button按钮进行快速比较。

  4. 用户也通过点击 comparison-configuration-button 按钮打开设置窗口,调整对比项和显示方式,完成设置后,点击 "确定" 关闭窗口。

性能分析对比配置

性能分析设置
  • 选择"程序性能指标对比"的数据可视化形式:至少选择图或表格中的一种形式。
  • 选择对比项:默认对比项为"指令总数","周期总数"以及"单位周期执行的指令数",用户可自行选择对比项。
  • 自定义数据颜色标识:用户可以为性能分析对比中的不同数据自定义颜色标识。被设置为对比基准的数据将以固定颜色进行标识(默认为蓝色)。
  1. 调整完设置后,重新选择数据进行对比,性能分析对比视图将在编辑器中打开。

    更改对比基准

用户可以通过右上角下拉框更改性能分析对比基准,对比基准应用于程序性能对比函数执行对比中的所有数据;被设置为对比基准的数据将以固定颜色进行标识(默认为蓝色)。

程序性能指标对比

程序性能指标对比统计了程序在执行过程中所有重要性能数据,用户可以在"性能分析对比设置"中指定需要对比的数据指标并过滤掉不需要的对比项。

程序性能指标对比图根据指标的不同单位呈现为三组柱状图对比结果,横轴为指标名,纵轴为指标数据。Legend 按钮可以控制性能分析结果图例的显示。

程序性能柱状图

程序性能指标对比表根据基准数计算出指标变化的幅度;绿色和红色区分变化性质,绿色表示对比基准降低,红色则表示对比基准数据升高。

程序性能表格

函数执行统计对比

函数执行统计对比显示了程序执行过程中所有函数的重要指标, 用户点击某个指标的标题行可以针对基准数据对该指标进行从大到小排序。 每组指标数据项根据基准目标计算出函数针对该指标的变化幅度;绿色和红色区分数据变化性质,绿色表示对比基准降低,红色则表示对比基准数据升高。

用户可以通过搜索关键函数过滤显示结果,在搜索框中输入函数名然后键入 Enter 过滤结果。

搜索关键函数过滤显示结果