找出应用程序瓶颈

探索性能潜力的初始高级步骤。

每秒帧数?

在开始使用Snapdragon Profiler之前,您可能已经知道存在性能问题。即使不知道存在性能问题,也应该最好先检查一下当前应用的整体性能,并尝试确定性能瓶颈。

从帧速率着手是个不错的选择。游戏等应用通常以每秒30或60帧(fps)的速度运行,而虚拟和扩展现实(VR/XR)应用的帧速率更高。

我们要考虑两个方面。第一是平均帧速率,它是衡量应用平均运行速度的指标。第二是帧速率的一致性。即使平均值接近目标帧速率,偶尔的长帧也可能达不到这个目标,导致卡顿和延迟,运动不顺畅,影响用户体验,因此需要优化。

如果应用未经过优化,平均帧速率可能低于目标速率,应用无法达到所需的性能级别。另一方面,如果已经优化了应用,可能更接近平均值,但帧速率仍会出现周期性峰值。尖峰阻碍动画,因此需要查找问题和修改代码,使动画更加流畅。

在这两种情况下,Snapdragon Profiler都可以直接以fps直接显示应用的性能级别。以下截图显示了42.022 fps的平均速率(浅蓝色线条)。

虽然42 fps作为平均值可能足够了,但范围(蓝线)周期性降低至37.322 fps,表明应用丢帧,损害性能。

另外,应用应该选择达到其平台Vsync速率的除数或倍数的帧速率。由于典型平台是60Hz Vsync,因此30 Hz或60 Hz是唯一可接受的目标值。

探索潜在的瓶颈

虽然没有一个简单的指标可以显示性能问题所在以及解决方法,但Snapdragon Profiler可允许您检查数十个指标,了解应用与硬件的交互方式。以下跟踪捕获模式屏幕截图中的截面对应于可以着手处理的三个重要指标:

• Snapdragon Profiler中每个渲染阶段都是一个指标,表示应用在GPU上的执行情况。每个数据轨道是指标子集,轨迹数量根据应用而变化。以下截图中,绿色、品红色和紫色条显示单个曲面,曲面条下的轨迹代表相关的渲染阶段:

•GPU活动(下方)是一个系统指标,显示CPU和GPU之间的交互。

•CPU调度(“跟踪内核 - Sched CPU”)是另一个系统指标,它大概描述了应用在每个CPU核心上的执行情况。您可以查看应用的哪些部分正在哪里运行,以及是否存在调度或线程争用问题。

通过这些指标及其他指标,您可以检查性能可能受限的三个主要领域:GPU、CPU和Vsync(显示屏上的垂直同步刷新)。

GPU绑定的应用

在图形密集型应用中,最简单的方法是使用GPU启动消除过程。

在Snapdragon Profiler的实时视图中,GPU%利用率是顶级指标。以下截图显示了26%到38%的利用率:

将其与以下截图进行比较,显示98%到100%范围内的利用率:

后者明显表示该应用是GPU绑定应用。

除了实时视图外,Snapdragon Profiler中的跟踪捕获模式还提供了另一个参考点。如果应用不是GPU绑定,则可能会出现GPU行为差距:

但是,如果应用是GPU绑定,则GPU执行可能会延迟,GPU可能会持续渲染表面:

我们将继续沿着下面的GPU绑定应用的路径,但首先我们要检查其他两个潜在的阻塞点。

CPU绑定的应用

如果GPU驼峰没有消失,可以检查应用是否被CPU绑定。

与GPU绑定应用不同,实时视图中的CPU%利用率不是CPU绑定应用的可靠指标,如以下屏幕截图所示:

第一个应用的平均CPU利用率为16%,第二个应用为23%。第一个是CPU绑定,但应用之间的差异不如上面的GPU绑定应用那么明显,因此应用可能看起来不是CPU绑定。

CPU绑定应用的两个重要标准是它不是GPU绑定,第二,平均帧时间超过16毫秒。要确定应用是否被CPU绑定,可以查看应用和CPU的多线程特性。此外,超出CPU%利用率,检查频率和线程调度等指标也很有帮助。

在以下跟踪捕获模式截图中,Sched CPU 6中的线程似乎阻碍了CPU:

下一步是深入研究该线程,确定多线程的热点和候选者。采样捕获模式以固定间隔周期,定期对CPU程序计数器进行采样,并识别CPU热路径。它提供了活动的统计表示,包括在每个函数和库中花费的时间。您可以看到代码中的哪些函数执行的时间最多。

以下捕获显示了在CPU上运行的渲染布料纹理的函数和函数序列。红色和橙色块表示应用代码中的热点:

在本例中,CPU采样显示SatisfyConstraints()是最大的热点,活动量占98%。

进一步地,Snapdragon Profiler支持用户标记和Android NDK内置的Native Tracing API。换句话说,Android开发者可以使用该API将跟踪标记插入到应

用代码中,并在Snapdragon Profiler中查看此数据。

在本例中,您可以使用android/trace.h来检测SatisfyConstraints()调用,并追溯到主线程:一个worker函数:

渲染帧中的纹理需要一个布料对应一个函数,函数在需要时根据运行时间运行。如果修改了应用代码,将函数作为线程,Snapdragon Profilr可以一次显示包含所有活动的相关联视图:

此时,布料计算正在多个线程中进行。CPU调度中的输出显示更多线程。应用不再是CPU绑定,因此CPU等待分派绘图。

该过程通常用于使用Snapdragon Profiler识别、诊断和解决性能问题。

Vsync绑定的应用

如果您确定应用既非CPU绑定也不是GPU绑定,则可能是Vsync绑定;也就是说,它可以按显示硬件允许的速度运行。使用Snapdragon Profiler中的跟踪捕获模式,可以看到类似的内容:

请注意,帧时间大约为16ms(1秒除以60 fps),并且在帧结束时有一个间隙,在此期间GPU和CPU都在等待可用的表面进行渲染,意味着应用的运行速度和显示器的刷新率允许的速度一样。

许多应用的目标是以显示器允许的速度运行。但即使应用是Vsync绑定的,仍有机会进行优化,并且还有除了更高帧速率以外的其他好处。

移动应用中的大多数问题最终都可以归结为功耗问题,也即是电池寿命问题。即使应用能够在不绑定CPU和GPU的情况下满足目标帧速率,仍然可以优化代码。如果应用经修改后耗电更少,发热更低,那么,应用既可以减少工作量,满足目标帧速率,还可以在低端设备上提供更佳性能。

Qualcomm 解决方案

 

高通 AI Hub

全新高通 AI Hub 包含预优化AI模型库,支持在搭载骁龙和高通平台的终端上进行无缝部署。
该模型库为开发者提供超过75个主流的AI和生成式AI模型,比如Whisper、ControlNet、Stable Diffusion和Baichuan-7B,可在不同执行环境(runtime)中打包,能够在不同形态终端中实现卓越的终端侧AI性能、降低内存占用并提升能效。所有模型均经过优化,以充分利用高通AI引擎内所有核心(NPU、CPU和GPU)的硬件加速能力,从而使推理速度提升4倍。

了解更多

SDK 下载

本版块下载 SDK,只需简单注册,就可轻松下载。