分析内存效率

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

Adreno 设备

在 Adreno 设备上,首先突出显示与单个 GPU 帧一致的时间段,如估算 CPU 和 GPU 帧处理时间中所述。 请使用该页面上介绍的技术,其中涉及对帧时间范围使用 GPU % Utilization 或类似计数器跟踪。因为计数器跟踪都使用相同的计时方法,可以更准确地估算内存利用率(与使用从 GPU 切片派生的帧时间范围相比,该 Slice 的数据独立于计数器跟踪数据而收集)。

利用率轨道与下方的相关计数器对齐
图 1. 利用率轨道与下方的相关计数器对齐

读/写总计

在性能分析器中突出显示单个帧后,首先查看 Read Total (Bytes/sec)Write Total (Bytes/sec) 计数器。通过这些计数器,您可以很好地总体了解单个帧过程中有多少数据穿越了内存总线。内存带宽是移动设备上耗电量的主要来源,因此请尽可能减少通过总线发送的数据量。

读写总计数器
图 2. 读写总计数器

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

顶点 + 纹理内存读取计数器
图 3. 顶点 + 纹理内存读取计数器

您对这些值的“良好”标准取决于应用中看到的工作负载类型。例如,2D 应用可能会使用相对较大(约 2+GB/秒)的纹理内存读取带宽,但顶点内存带宽可能非常低(约 50MB/秒)。如需了解详情,请查看分析顶点内存带宽分析纹理内存带宽用量文档。

提取停顿

查看 % Vertex Fetch Stall% Texture Fetch Stall% Stall on System Memory 计数器,因为它们将为您提供一些关于应用整体内存性能的提示。如果这些值高于大约 5%,则表示您的应用未在内存中高效地布置数据,或者正在以充分利用缓存的有效方式访问其数据。如需详细了解如何提高这些类型的资源的内存用量,请查看分析顶点内存带宽分析纹理内存带宽用量

内存延迟计数器
图 4. 内存暂停计数器

Mali 设备

在 Mali 设备上,首先突出显示与单个 GPU 帧一致的时间段,如估算 CPU 和 GPU 帧处理时间中所述。 请使用该页面上介绍的技术,其中涉及对帧时间范围使用 GPU % Utilization 或类似计数器跟踪。因为计数器跟踪都使用相同的计时方法,可以更准确地估算内存利用率(与使用从 GPU 切片派生的帧时间范围相比,该 Slice 的数据独立于计数器跟踪数据而收集)。

利用率轨道与您想使用的计数器一起排列在下方
图 5. 利用率轨道与您感兴趣的计数器对齐,放在其下方

输出外部总计

系统性能分析器中突出显示单个帧后,请先查看 Output External Read bytes Output External Write bytes 计数器。通过这些计数器,您可以很好地总体了解单个帧过程中有多少数据穿越了内存总线。尽可能减少通过总线发送的数据量,因为内存带宽是移动设备上耗电量的主要来源。

输出外部计数器轨迹
图 6. 输出外部计数器轨迹

输入内部总计值

还有一些计数器可以为您提供有关缓存本身的信息。您感兴趣的计数器是“Input internal [read|write] stall cycles”(输入内部 [读取|写入] 停滞周期)。这些数值越高,表示您成功访问了缓存,但发出的读取请求过多,因此着色器代码停滞,以等待访问内存。

输入内部计数器跟踪
图 7. 输入内部计数器跟踪

提取停顿

您可以查看的下一组计数器是 Vertex Prefetcher Stall CyclesTexture Fetch Stall 计数器,因为您可以通过它们了解应用的整体内存性能。如果您看到高于 5% 左右的值,这表示您要么没有高效地在内存中布局数据,要么没有以有效方式访问我们的数据以利用缓存。请查看“分析 [Vertex|Texture] 内存带宽”文章,详细了解如何提高这些类型资源的内存使用率

提取摊位计数器轨道
图 8. 提取暂停计数器跟踪记录