性能分析与对比
ZStudio 中内置了程序性能分析&可视化流水线工具 ZProf,帮助用户定位从函数层级到微架构层级的性能瓶颈并进行针对性的优化。
性能分析
本节将介绍 ZStudio 中程序性能分析工具的使用方法。关于性能分析的示例项目,请参考 AccInst。
执行性能分析
用户在执行性能分析前,需要确定性能分析配置,点击菜单栏的"性能分析" > "配置"。
- 选择开发板:选择"内置"开发板或添加"自定义"开发板。
- 仿真器虚拟开发板:通过下拉框选择仿真器运行的目标虚拟开发板。
- 开发板配置文件:指定添加自定义开发板的配置文件路径。
- 仿真器参数:指定传递给仿真器的参数,默认不传递任何参数。
- 性能结果输出目录:指定结果保存的目录名,默认为
{project_name}.zprof
,所有结果将在导航栏中 zprof-output 节点下列出。 - 性能分析覆盖:对于同一个项目的相同配置进行性能 分析,是否允许最新的性能分析数据是否自动覆盖上一次数据,如果选择不自动覆盖,将为每次得到的新结果添加一个时间戳。
- 程序参数:指定传给运行项目的参数,默认不传递任何参数。
用户可以根据以下步骤执行性能分析:
- 在执行性能分析前,需将目标项目设置为当前激活项目,并完成项目构建。
- 成功构建后,点击菜单栏"性能分析" > "启动性能分析"生成该项目的性能分析数据,性能分析完成之前不要重新执行该行为,以免生成错误数据。完成后右下角会生成提示信息,性能分析结果将在编辑器中打开。
性能分析结果
性能分析结果中统计了衡量程序或代码段性能的重要指标,包括程序性能指标(Program Summary)和函数执行统计(Function Summary)两部分。
Program Summary 列出了程序在执行过程中的所有重要指标,如下列表所示:
程序性能指标 | 描述 |
---|---|
指令总数(Instruction Count) | 程序执行期间执行的 指令总数。 |
处理器时钟周期总数(Cycle Count) | 程序执行期间所花费的时钟周期总数。 |
时钟周期执行的平均指令数(Instruction Per Cycle, IPC) | 指在一个时钟周期内执行的平均指令数。高 IPC 表示更好的性能。 |
一级指令缓存未命中(Level 1 Instruction Cache Misses) | 在一级指令缓存中无法找到所需指令的次数。 |
一级数据缓存未命中(Level 1 Data Cache Misses) | 在一级数据缓存中无法找到所需数据的次数。 |
分支方向预测失败(Branch Prediction Misses) | 无法正确预测程序中分支的执行路径的次数。 |
分支或跳转目标预测失败(Branch or Jump Target Prediction Misses) | 处理器在执行分支或跳转指令时无法准确预测目标地址的次数。 |
函数执行统计(Function Summary)列表中,统计了程序中所有函数的重要指标,用户点击某个指标的标题行可以针对该指标对函数进行从大到小排序,例如点击 "Self Cycle",所有函数将根据函数在执行期间实际使用的处理器时钟周期数从大到小进行排序。
根据函数执行统计表,用户可以快速定位瓶颈函数。点击列表右侧 按钮,将在编辑器右侧打开源代码文件并定位到对应的源代码位置。
函数执行统计列表中的其他函数指标可参考下表:
指标 | 描述 |
---|---|
Functions | 项目中所有执行过的函数名 |
Address | 函数的内存地址 |
Exec Times | 函数的执行次数 |
Self Cycle | 函数在执行期间实际使用的处理器时钟周期数 |
Total Cycle | 包含内部调用或子任务的时钟周期数 |
Self Inst | 函数内部实际执行的指令数量 |
Total Inst | 包含被该函数调用的其他函数或子程序的指令数量 |
Cycle Percentage | 函数占用总时钟周期的百分比 |
高频代码分析
ZStudio 还提供了高频代码(Code Coverage)的分析信息,包括哪些代码被执行的次数最多,占用资源多等。帮助开发者快速定位和解决性能问题,并提高程序的整体性能。
当用户从函数执行统计跳转到源代码时,ZStudio 将会在对应的源代码位置显示性能分析的数据信息,以及高频代码执行次数。第一次跳转时,用户将会看到 No coverage output found, please execute "Code Coverage Analysis" 提示信息,需要在菜单栏点击"性能分析" > "启动代码覆盖率分析"获取每行代码的执行次数的信息。
用户可以自定义这些信息是否默认显示,使用快捷键 Control+Shift+P 打开命令面板,输入并选择选单中的 Code Editor: Toggle Profiling Summary
选项可控制性能分析的数据信息的默认显示,输入并选择 Code Editor: Toggle Code Coverage
选项,可控制高频代码执行次数的默认显示。
在函数执行统计中点击 按钮或者在源代码中点击"Enter Pipeline"将进入流水线视图。
微架构流水线
微架构流水线视图(Micro Arch Pipeline)将程序中的指令可视化为流程图来表示其执行情况,标示出数据相关性的停顿泡(bubbles),并使用不同颜色进行类型区分。选择菜单栏"性能分析"
"微架构流水线",在选单中选择已完成的数据即可打开流水线视图。
微架构流水线视图(Micro Arch Pipeline)使用不同颜色区分不同类型的停顿泡(bubbles), 参考下表:
停顿泡 | 描述 |
---|---|
ICache Miss | 指令高速缓存未命中;CPU 流水线停滞,产生 bubble |
DCache Miss | 数据高速缓存未命中;CPU 流水线停滞,产生 bubble |
Pipeline Flush | 流水线清空;CPU 检测到分支指令或者异常处理停止当前正在执行的指令,并清空流水线中的指令,产生 bubble |
Hazard | 数据冒险;当一个指令依赖于尚未完成的前一条指令的结果时,产生 bubble |
Stalled by Previous | 前一个阶段停顿;流水线中某个阶段的执行需要等待前一个阶段完成后才能开始,产生 bubble |
指令流水线(Instruction Pipeline)视图重点关注指令的执行过程并发现指令执行中 的潜在性能问题。点击下拉框查看不同类型的 bubbles,点击前进后退按钮进行同类型 bubbles 快速跳转;在搜索框中输入 PC 地址和 cycle 可以进行快速定位。在指令流水线视图中,点击指令地址或者反汇编码可导航至源代码。
资源流水线(Resource Pipeline)视图侧重于描述计算机硬件资源之间的关系和数据流动方式,从硬件模块的维度显示了硬件资源的利用效率和数据流动方式。
用户可以选择界面左下角 "首选项" > "流水线设置",在流水线设置中自定义停顿泡颜色,以及决定横向流水线和纵向流水线是否同步滚动。
性能分析对比
本节介绍如何利用"性能分析对比"工具中对比两个或多个性能分析结果,通过性能分析对比,用户可以对比不同构建配置,不同微架构以及添加特殊加速指令的源码更改对性能的影响。
用户每次执行性能分析的结果都将显示在"性能分析对比"视图的左侧栏中,点击 (刷新)按钮以获取最新数据,当性能分析结果过多时,可以通过搜索框快速定位到需要对比的结果数据。
用户可以遵循以下步骤进行性能分析结果对比:
-
在主菜单中,点击"视图" > "性能分析对比" 调出对比工具。
-
在"性能分析对比"视图的左侧栏中,右键点击某个性能分析结果,并点击"选为对比基准"。
-
尝试按住 Shift 或 Ctrl 键同时选择多个结果,右击选择"对比",或者点击 按钮进行快速比较。
-
用户也通过点击 按钮打开设置窗口,调整对比项和显示方式,完成设置后,点击 "确定" 关闭窗口。
- 选择"程序性能指标对比"的数据可视化形式:至少选择图或表格中的一种形式。
- 选择对比项:默认对比项为"指令总数","周期总数"以及"单位周期执行的指令数",用户可自行选择对比项。
- 自定义数据颜色标识:用户可以为性能分析对比中的不同数据自定义颜色标识。被设置为对比基准的数据将以固定颜色进行标识(默认为蓝色)。
-
调整完设置后,重新选择数据进行对比,性能分析对比视图将在编辑器中打开。
用户可以通过右上角下拉框更改性能分析对比基准,对比基准应用于程序性能对比和函数执行对比中的所有数据;被设置为对比基准的数据将以固定颜色进行标识(默认为蓝色)。
程序性能指标对比
程序性能指标对比 统计了程序在执行过程中所有重要性能数据,用户可以在"性能分析对比设置"中指定需要对比的数据指标并过滤掉不需要的对比项。
程序性能指标对比图根据 指标的不同单位呈现为三组柱状图对比结果,横轴为指标名,纵轴为指标数据。Legend 按钮可以控制性能分析结果图例的显示。
程序性能指标对比表根据基准数计算出指标变化的幅度;绿色和红色区分变化性质,绿色表示对比基准降低,红色则表示对比基准数据升高。
函数执行统计对比
函数执行统计对比显示了程序执行过程中所有函数的重要指标, 用户点击某个指标的标题行可以针对基准数据对该指标进行从大到小排序。 每组指标数据项根据基准目标计算出函数针对该指标的变化幅度;绿色和红色区分数据变化性质,绿色表示对比基准降低,红色则表示对比基准数据升高。
用户可以通过搜索关键函数过滤显示结果,在搜索框中输入函数名然后键入 Enter 过滤结果。