本文介绍 PerfKitty 中的 Mali GPU 性能指标,包括中英文名称、单位、指标含义和常见分析方法。指标是否可采集取决于 GPU 型号、驱动版本、内核计数器权限和设备厂商实现;界面中没有返回某项指标时,不应把缺失值理解为 0。
指标范围
PerfKitty 将不同 Mali GPU 架构和型号的底层性能计数器整理为 45 项常用指标,分为 15 个指标组。本文重点解释这些统一指标,便于在性能分析时快速理解 GPU 使用率、纹理、几何、内存带宽、停顿和延迟等数据。
Arm 的型号指南通常还会提供大量特定于硬件的原始或派生计数器,因此官方指南中的指标数量可能明显多于本文的 45 项。不同代际的队列模型、硬件单元和计算方式也可能变化;同名指标适合用于理解相近语义,但不应默认不同 GPU 型号使用完全相同的底层公式。
L2 read bytes/cy 和 External read bytes/cy 在纹理路径与 Load/Store 路径中各出现一次。虽然显示名称相同,但它们描述的是不同硬件路径,分析时应结合所在指标组区分。
代表架构与官方型号指南
Mali GPU 使用过不同的任务提交前端,包括 Job Manager(JM,作业管理器)和 Command Stream Frontend(CSF,命令流前端)。下表列出本文涉及架构的代表型号,并提供 Arm 官方指南入口;它不是 PerfKitty 支持型号的完整清单。
未在表中单列的同架构 GPU 可能使用代表型号进行近似解释:Midgard 参考 Mali-T720、Bifrost 参考 Mali-G52、Valhall 参考 Mali-G78、第五代参考 Mali-G720。代表型号只能帮助理解相近架构,不能证明两个型号的计数器定义完全相同。
跨代差异
- 队列模型:Bifrost 和 Valhall JM 使用作业管理器语义,常见
Non-fragment、Fragment 和 Tiler 队列;Valhall CSF 与第五代使用命令流前端,并增加 main、binning、fragment、compute 等任务或队列指标。旧的 Non-fragment/Fragment 名称在新架构上可能没有一对一标识符。
- 纹理属性:Mali-G31、Mali-G51 和 Mali-G52 参考页能完整对应本文的纹理缓存、mipmap 和 trilinear 指标;Mali-G71 缺少纹理缓存查找的精确标识符。Valhall 页面通常没有
MaliTexCacheLookup、MaliTexMipInstrRate 和 MaliTexTriInstrRate 这些精确标识符。应使用该型号页面提供的新计数器分析,而不是把缺失项补成 0。
- 几何剔除:Mali-G715 和第五代页面不再提供本文中分开的 facing/XY 与 Z plane 剔除率精确标识符,可能需要结合更高层的总剔除、可见图元和其他新剔除分类判断。
- 几何线程效率:第五代页面没有
MaliGeomVarShadThreadPerPrim 的精确标识符。跨代比较时应优先比较输入图元、可见图元和该型号实际提供的线程计数,而不是强行套用旧公式。
- 稳定语义:
GPU active 在 Bifrost、Valhall JM、Valhall CSF 和第五代都有明确映射;内存带宽、stall 和延迟直方图等概念跨代相对稳定,但底层计数器、归一化分母和可用性仍可能不同。
PerfKitty 会优先使用与当前 GPU 架构匹配的指标映射;最终只有设备实际返回的有效计数器才会显示。因此,“官方指南提供该指标”“该架构存在对应计算方式”和“当前设备能够采集”是三个不同层次。
单位与阅读方法
| 单位 |
含义 |
Cycles |
采样区间内的活动周期、发射周期,或以周期表示的平均成本。需结合 GPU 频率和采样时长判断。 |
Count |
事件、请求、图元、线程或返回数据拍的计数。 |
% |
利用率或某类事件占比。高值是否异常取决于工作负载目标。 |
Ratio |
两个相关计数器的比值,用于衡量几何处理效率。 |
Bytes/Cycle |
每个相关硬件活动周期平均传输的字节数。它反映单位工作周期的数据量,不是每秒带宽。 |
Bytes/Second |
PerfKitty 当前展示的每秒字节速率。 |
L2 read bytes/cy、External read bytes/cy 和 L2 write bytes/cy 名称中的 /cy 表示“每个相关活动周期”,其语义单位为 Bytes/Cycle。部分 PerfKitty 版本若显示为 Bytes/s,应按 /cy 指标语义理解,不要与外部内存带宽组中的 Read bytes、Write bytes 混用。
Mali GPU Usage / Mali GPU 使用率
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
GPU active |
GPU 活跃 |
Cycles |
GPU 至少有一个工作队列或硬件阶段处于活动状态的周期数。 |
应同时看 GPU 频率和采样时长;活动周期高不等于利用效率高。 |
Non-fragment queue active |
非片元队列活动 |
Cycles |
非片元队列处于活动状态的周期数,通常涵盖顶点、计算和其他非片元工作。 |
与 GPU active 接近通常表示非片元工作占主导;明显偏低可能说明队列空闲或重叠不足。 |
Fragment queue active |
片元队列处于活动状态 |
Cycles |
片元队列处于活动状态的周期数。 |
与 GPU active 接近通常表示片元工作占主导;结合着色、纹理和带宽指标定位瓶颈。 |
Tiler active |
图块处理器活跃 |
Cycles |
Tiler 处理图元分箱和几何相关工作的活动周期数。 |
高值应结合输入图元、剔除率和顶点线程数判断是否由网格复杂度或分箱压力造成。 |
GPU interrupt active |
GPU 中断活跃 |
Cycles |
GPU 中断处于挂起或等待处理状态的周期数。 |
GPU 仍可能并行处理其他工作;若其占 GPU active 比例长期很高,可能存在 CPU、驱动或系统响应问题。 |
Mali GPU Utilization / Mali GPU 利用率
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
Non-fragment queue utilization |
非片元队列利用率 |
% |
非片元队列活动周期相对于 GPU 活动周期的占比。 |
GPU-bound 场景中主导队列通常接近 100%;多个队列都不高但 GPU 很忙时,可能存在串行依赖。 |
Fragment queue utilization |
片元队列利用率 |
% |
片元队列活动周期相对于 GPU 活动周期的占比。 |
高值表示片元阶段是主要负载之一,应继续检查着色器、纹理、过度绘制和外部带宽。 |
Tiler utilization |
图块处理器利用率 |
% |
Tiler 活动周期相对于 GPU 活动周期的占比。 |
高值通常指向几何输入、图元剔除或分箱压力。 |
移动设备会通过 DVFS 动态调整 GPU 频率。轻负载在低频下也可能出现很高的利用率,因此不要只凭利用率判断性能问题。
Mali Texture CPI / Mali 纹理 CPI
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
Texture CPI |
纹理 CPI |
Cycles |
完成一个纹理指令或等价采样工作所需的平均纹理处理周期。PerfKitty 会按 GPU 代际选择分母,可能基于纹理指令、采样 quad(四像素采样单元)、输出消息或最繁忙纹理路径计算。 |
越高通常表示过滤方式更复杂、各向异性级别更高、缓存访问成本更大或纹理路径受限。跨 GPU 对比前应确认架构。 |
在 Mali-G52 上,Arm 以纹理过滤活动周期除以纹理请求所代表的采样数来计算平均成本。双线性、三线性、3D 和各向异性过滤的成本不同,因此该指标没有跨场景通用的固定理想值。
Mali Geometry Usage / Mali 几何使用率
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
Visible primitives |
可见图元数 |
Count |
通过全部剔除测试、进入后续渲染阶段的可见图元数量。 |
高值表示实际送入光栅化的几何量大;需结合像素负载判断是否有效贡献画面。 |
Culled primitives |
剔除图元 |
Count |
被朝向、XY 平面、Z 平面或采样测试剔除的图元总数。 |
高剔除量可能说明剔除有效,也可能说明应用提交了大量无效几何。 |
Input primitives |
输入图元 |
Count |
输入到渲染流程的图元总数,通常等于可见图元与各类被剔除图元之和。 |
过高时检查网格 LOD、重复几何、索引复用和不可见物体提交。 |
Mali Memory Bandwidth Usage / Mali 内存带宽使用率
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
Read bytes |
读取字节 |
Bytes/Second |
GPU 从外部内存系统读取的数据速率。 |
持续高值会增加功耗并可能触发内存瓶颈;检查纹理压缩、资源精度、mipmap 和重复读取。 |
Write bytes |
写入字节 |
Bytes/Second |
GPU 写入外部内存系统的数据速率。 |
检查渲染目标格式、带宽较大的后处理、无效清屏以及帧缓冲压缩(framebuffer compression)。 |
Mali Texture Usage / Mali 纹理使用率
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
Texture filtering active |
纹理过滤激活 |
Cycles |
纹理单元执行纹理采样和过滤发射的活动周期数。复杂过滤会被拆成更多基础采样,因此消耗更多周期。 |
结合 Texture CPI、采样率和纹理带宽判断;可从采样数量、过滤方式、各向异性和纹理格式入手。 |
Cache lookup |
缓存查找 |
Count |
纹理路径发起的缓存查找数量,是纹理缓存访问压力的计数。 |
不能直接理解为缓存命中率;应结合采样量、L2 read bytes/cy、External read bytes/cy 和 Texture CPI 判断。 |
Mali Load/Store Usage / Mali 加载/存储使用率
Load/store 单元用于纹理和帧缓冲(framebuffer)回写之外的通用着色器数据访问,包括 buffer、image、共享存储、顶点属性和栈访问。
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
Load/store unit issue |
加载/存储单元发射 |
Cycles |
Load/store 单元的总访问发射周期,通常由 full read、partial read、full write、partial write 和 atomic access 相加得到;不包含缓存未命中等二次等待。 |
高值表示通用数据访问压力大;继续观察读写类型、外部访问和 stall 指标。 |
Full read |
完整读取 |
Count |
充分利用 load/store 数据通路宽度的完整宽度读取次数。 |
与 partial read 相比,full read 通常具有更好的通路利用率。 |
Partial read |
部分读取 |
Count |
未充分利用 load/store 数据通路宽度的部分宽度读取次数。 |
占比高时检查短标量访问、结构体 padding、非合并访问,并考虑向量化或连续地址访问。 |
Full write |
全写 |
Count |
充分利用 load/store 数据通路宽度的完整宽度写入次数。 |
与 partial write 相比,full write 通常具有更好的通路利用率。 |
Partial write |
部分写入 |
Count |
未充分利用 load/store 数据通路宽度的部分宽度写入次数。 |
占比高时检查写入粒度、数据布局和线程地址连续性。 |
Atomic access |
原子访问 |
Count |
Load/store 单元执行原子内存访问的次数。 |
原子操作通常是多周期且会造成竞争;性能关键路径中应减少不必要的原子操作和热点地址冲突。 |
Mali Texture Workload Property Rate / Mali 纹理工作负载属性比率
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
Mipmapped sample rate |
MipMap 采样率 |
% |
访问 mipmapped 纹理的纹理操作占比;底层分子和分母会按 GPU 代际映射。 |
3D 场景中的离线纹理通常应启用 mipmap,以改善远距离质量、缓存局部性和内存带宽。 |
Trilinear sample rate |
三线性采样率 |
% |
使用三线性过滤的纹理操作占比。 |
三线性过滤通常比双线性过滤需要更多采样工作;结合画质目标和 Texture CPI 评估成本。 |
Mali Texture Memory Usage / Mali 纹理内存使用率
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
L2 read bytes/cy |
L2 读取字节/cy |
Bytes/Cycle |
纹理单元每个纹理过滤活动周期平均从 L2 路径读取的字节数。 |
相对纹理工作量偏高时,可能存在 L1 纹理缓存效率不佳、格式过宽、缺少压缩或 mipmap 不合理。 |
External read bytes/cy |
每周期外部读取字节数 |
Bytes/Cycle |
纹理单元每个纹理过滤活动周期平均从外部内存路径读取的字节数。 |
相对 L2 读取偏高时,可能表示 L2 缓存复用不足;检查纹理尺寸、格式、压缩、细节层级偏移(LOD bias)和各向异性。 |
Mali Load/Store Memory Usage / Mali 加载/存储内存使用率
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
L2 read bytes/cy |
L2 读取字节/cy |
Bytes/Cycle |
Load/store 单元每个读取发射活动周期平均从 L2 路径读取的字节数。 |
相对 read issue 偏高时,检查数据格式宽度、L1 数据缓存复用和访问合并。 |
External read bytes/cy |
每周期外部读取字节数 |
Bytes/Cycle |
Load/store 单元每个读取发射活动周期平均从外部内存路径读取的字节数。 |
相对 L2 读取偏高时,可能表示 L2 缓存复用不足;检查数据布局、访问顺序和工作集大小。 |
L2 write bytes/cy |
L2 写入字节/cy |
Bytes/Cycle |
Load/store 单元每个写入发射活动周期平均写入 L2 路径的字节数。 |
相对 write issue 偏高时,检查写入格式、部分宽度写入、冗余写入和线程地址连续性。 |
Mali Memory Stall Rate / Mali 内存停顿率
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
Read stall rate |
读取停顿率 |
% |
GPU 因外部内存读事务无法继续发出或等待下游接收而停顿的周期占比。 |
高值通常说明读取带宽、突发访问或下游内存压力较大;可通过缩小资源、压缩纹理和改善局部性降低。 |
Write stall rate |
写入停滞率 |
% |
GPU 因外部内存写事务无法继续发出或等待下游接收而停顿的周期占比。 |
高值通常说明写入带宽或下游队列压力较大;检查渲染目标、写回量和中间结果。 |
Mali Memory Read Latency / Mali 内存读取延迟
这组六个指标组成外部内存读取延迟直方图,统计读事务开始后,数据返回落入不同周期区间的次数。它们应作为分布一起阅读,而不是只看单个桶。不同 GPU 型号和频率下的周期时长不同,因此不宜把某个区间直接定义为“快”或“慢”。
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
0-127 cycles |
0-127 个周期 |
Count |
返回延迟落在 0 到 127 周期区间的数据计数。 |
与同一设备、相近频率和相同场景下的其他采样比较。 |
128-191 cycles |
128-191 周期 |
Count |
返回延迟落在 128 到 191 周期区间的数据计数。 |
观察延迟分布是否逐步向更高周期区间移动。 |
192-255 cycles |
192-255 个周期 |
Count |
返回延迟落在 192 到 255 周期区间的数据计数。 |
与相邻区间一起观察,避免仅凭单个桶判断异常。 |
256-319 cycles |
256-319 个周期 |
Count |
返回延迟落在 256 到 319 周期区间的数据计数。 |
占比持续升高时,结合带宽、工作集和访问局部性判断。 |
320-383 cycles |
320-383 周期 |
Count |
返回延迟落在 320 到 383 周期区间的数据计数。 |
占比持续升高时,检查系统内存竞争和下游压力。 |
384+ cycles |
384+ 个周期 |
Count |
返回延迟不低于 384 周期的数据计数。 |
占比持续升高时,结合 read stall 和带宽判断是否影响关键路径。 |
Mali Geometry Culling Rate / Mali 几何剔除率
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
Visible primitive rate |
可见图元速率 |
% |
输入图元中通过全部剔除测试并可见的比例。 |
很低时说明大量提交图元最终不可见,可考虑更早的对象或网格剔除。 |
Facing or XY plane culled primitive rate |
面或 XY 平面剔除图元率 |
% |
因背面朝向或超出裁剪空间 XY 平面而被剔除的输入图元比例。 |
高值可能表示背面或屏幕外几何提交较多;检查剔除模式、相机外对象和网格朝向。 |
Z plane culled primitive rate |
Z 平面剔除图元速率 |
% |
因超出近、远 Z 裁剪平面而被剔除的输入图元比例。 |
高值时检查相机 near/far plane、对象可见性和场景提交范围。 |
Sample culled primitive rate |
样本剔除图元率 |
% |
通过平面测试后,因没有覆盖有效采样点等采样测试而被剔除的输入图元比例。 |
高值常见于大量微小或退化图元;检查过细网格、LOD 和投影后的三角形尺寸。 |
Mali Geometry Threads / Mali 几何线程
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
Position shading threads |
位置着色线程 |
Count |
执行位置着色阶段(position shader)的线程调用数量。 |
与输入图元和顶点数量一起判断顶点索引复用与几何处理成本。 |
Varying shading threads |
Varying 着色线程 |
Count |
执行插值属性着色阶段(varying shader)的线程调用数量。 |
与可见图元一起判断可见几何的属性计算量和复用效率。 |
Mali Geometry Efficiency / Mali 几何效率
| PerfKitty 英文名 |
中文名 |
单位 |
指标解释 |
分析提示 |
Position threads/input primitive |
每输入图元的位置线程数 |
Ratio |
每个输入图元平均触发的位置着色线程数。 |
越低通常表示相邻图元顶点复用和索引局部性越好;检查重复顶点、索引顺序和未使用索引范围。 |
Varying threads/visible primitive |
每可见图元的 Varying 线程数 |
Ratio |
每个可见图元平均触发的插值属性着色线程数。 |
越低通常表示可见几何的顶点复用越好;应与画质、网格拓扑和剔除结果一起判断。 |
官方资料与使用边界
需要了解具体 GPU 的队列、流水线、内存路径或完整计数器定义时,请通过上表和官方资料链接查看对应型号指南。
本文不提供跨所有 GPU 型号通用的固定阈值。实际分析应优先比较同一设备、相近频率、相同场景和相同 PerfKitty 版本下的数据。