分析内存效率

应用的内存使用特征是其性能的一个基本方面。您可以使用**系统性能分析器**通过查看可用的 GPU 计数器信息来分析这些特征。

Adreno 设备

在 Adreno 设备上,首先突出显示与单个 GPU 帧一致的时间段,如估计 CPU 和 GPU 帧处理时间中所述。使用该页面上描述的技术,使用**GPU 利用率 %**或类似计数器轨迹来确定帧时间边界,因为所有计数器轨迹都使用相同的计时技术,并且将允许更准确地估计内存利用率(与使用从 GPU 切片派生的帧时间边界相比,这些数据独立于计数器轨迹数据收集)。

Utilization track lining up with the relevant counters below it
图 1. 利用率轨迹与下面的相关计数器对齐

读/写总数

在性能分析器中突出显示单个帧后,首先查看**读取总数 (字节/秒)**和**写入总数 (字节/秒)**计数器。这些计数器提供了在单个帧过程中有多少数据穿过内存总线的总体概览。请尽量减少发送到总线上的数据量,因为内存带宽是移动设备上耗电量大的来源。

Read + Write Total Counters
图 2. 读取 + 写入总数计数器

您还可以检查**顶点内存读取 (字节/秒)**和**纹理内存读取 (字节/秒)**计数器,以确定用于顶点和纹理数据的带宽部分。

Vertex + Texture Memory Read Counters
图 3. 顶点 + 纹理内存读取计数器

您认为这些值的“良好”取决于应用中看到的负载类型。例如,2D 应用可能会看到相对较大的(~2+GB/s)纹理内存读取带宽使用量,但顶点内存带宽可能非常小(~50MB/s)。有关更多详细信息,请查看分析顶点内存带宽分析纹理内存带宽使用情况的文档。

提取停顿

查看**顶点提取停顿 %**、**纹理提取停顿 %**和**系统内存停顿 %**计数器,因为这些计数器将为您提供一些有关应用总体内存性能的提示。如果这些值高于大约 5%,则表明您的应用要么没有以有效的方式在内存中布局数据,要么没有以有效的方式访问其数据以利用缓存。有关改善此类资源内存使用的详细信息,请查看分析顶点内存带宽分析纹理内存带宽使用情况

Memory Stall Counters
图 4. 内存停顿计数器

Mali 设备

在 Mali 设备上,首先突出显示与单个 GPU 帧一致的时间段,如估计 CPU 和 GPU 帧处理时间中所述。使用该页面上描述的技术,使用**GPU 利用率 %**或类似计数器轨迹来确定帧时间边界,因为所有计数器轨迹都使用相同的计时技术,并且将允许更准确地估计内存利用率(与使用从 GPU 切片派生的帧时间边界相比,这些数据独立于计数器轨迹数据收集)。

Utilization track lining up with the counters you are interested in below it
图 5. 利用率轨迹与您感兴趣的下方计数器对齐

输出外部总数

在**系统性能分析器**中突出显示单个帧后,首先查看**输出外部读取字节**和**输出外部写入字节**计数器。这些计数器提供了在单个帧过程中有多少数据穿过内存总线的总体概览。请尽量减少发送到总线上的数据量,因为内存带宽是移动设备上耗电量大的来源。

Output External counter tracks
图 6. 输出外部计数器轨迹

输入内部总数

还有一些计数器为您提供有关缓存本身的信息。您感兴趣的计数器是“输入内部 [读取|写入] 停顿周期”。这些值越高,意味着您成功命中了缓存,但发出了过多的读取请求,因此着色器代码在等待访问内存时会发生停顿。

Input Internal counter tracks
图 7. 输入内部计数器轨迹

提取停顿

接下来您可以查看的一组计数器是顶点预取器停顿周期纹理获取停顿计数器,因为它们会为您提供一些有关应用程序整体内存性能的提示。如果您看到的值高于约 5%,则意味着您要么没有以有效的方式在内存中布局数据,要么没有以有效的方式访问数据来利用缓存。请查看分析[顶点|纹理]内存带宽文章,了解如何改进这些类型资产的内存使用情况的详细信息

Fetch Stalls counter tracks
图 8. 获取停顿计数器跟踪