性能测试之shader测试

工具使用指南

Adreno Offine Complier:

工具下载:

Adreno GPU SDK - Tools - Qualcomm Developer Network

使用命令:

aoc.exe -arch=a650 file/*.frag file/*.vert

目前支持的编译平台:A650、A660、A730、C510、C511

 重要指标解读,取自官方文档

名字

描述

性能/功率影响

如何改进

备注

Total instruction count

总指令数。具有高指令数的复杂着色器可能具有较长的执行时间。

在大多数情况下,更多的指令意味着更长的着色器执行时间。指令计数大于指令缓存大小会导致 I$ 未命中并损害着色器性能。

避免冗余操作

等于表格中所有带指令的指标之和

ALU instruction count 32bit

所有 32 位 ALU 指令的总数。

更多的 ALU 指令可能不会影响性能,但可能会消耗更多功率。

删除冗余计算。

ALU instruction count 16bit

所有 16 位 ALU 指令的总数。注意:与 16 位指令相比,32 位 ALU 指令的性能更好,使用的寄存器空间更少。

类似于全精度 ALU 指令。将全精度 ALU 指令转换为半精度 ALU 指令可以提高 ALU 绑定着色器的性能。

尽可能使用较低的精度。较高的 16 位 ALU 指令百分比可能会提高性能。

高通分享会上提到:相较于32bit,16bit对减少功耗、减少GPU cycles、提高并行度都比较友好。

Complex instruction count 32bit

所有 32 位复杂指令(sin、cos 等)的总数。

EFU 指令比 ALU 指令更耗时。EFU 与其使用指令之间的依赖关系需要短延迟同步指令。

如果必须使用 EFU 指令,请尝试将其中一些指令组合在一起,以减少短同步延迟指令的数量。但也不建议过于激进的分组。

Complex instruction count 16bit

所有 16 位复杂指令(sin、cos 等)的总数。

类似于全精度 EFU 指令。

尽可能使用较低的精度。

Texture read instruction count

所有纹理读取指令的总数。

纹理提取会导致内存访问延迟,需要通过 ALU 指令隐藏。延迟由纹理提取的数量及其在缓存中的位置决定。

可以合并的纹理提取应组合在一起,以避免缓存抖动。将每个组中的纹理提取次数限制为 15 次以下。

Memory read instruction count

所有内存读取指令的总数。

类似于纹理提取,但内存访问单元不同。

类似于纹理提取。

Load store,对功耗影响较大。

Memory write instruction count

所有内存写入指令的总数。

分散的内存存储指令到连续的内存位置可能会损害性能。

尽可能使用矢量存储。将存储说明分组到一个相邻的位置。

Flow control instruction count

所有流控制指令的总数。

更多的流控制指令意味着着色器代码中的分歧更大,这可能会损害着色器性能。控制流指令比 ALU 指令需要更多的执行时间。

尽可能减少控制流块内的指令,以便编译器可以展平控制流。

Barrier and fence Instruction count

所有屏障和围栏说明的总数。

全局同步可降低波并行度并延长应用程序执行时间。如果执行时间较长,则会消耗更多的功率。

避免频繁的全局同步。

Short latency sync instruction count

所有短延迟同步指令的总数。

如果着色器指令与导致此短延迟同步的指令太近,并且没有其他波可以隐藏此延迟,则着色器指令执行可能会延迟。

如果这不会过多地增加定义使用距离,请将 EFU 指令放在一起。

Long latency sync instruction count

所有长延迟同步指令的总数。

这是由内存访问引起的,如果延迟很长并且没有足够的波来隐藏此延迟,则可能会延迟着色器指令的执行。

延迟由多种因素决定。但是改善记忆指令的位置可能会有所帮助。

Miscellaneous instruction count

上面未特别提及的所有其他指令的总数。

Full precision register footprint per shader instance

每个着色器实例使用的 128 位寄存器数。每个 128 位寄存器可以存储 4 个 FP32 值。

这是着色器所需的全精度寄存器数。

除了直接影响所需寄存器数的项外,还应使用较低精度的变量以避免在着色器中使用较高的寄存器。

Half precision register footprint per shader instance

每个着色器实例使用的 64 位寄存器数。每个 64 位寄存器可以存储 4 个 FP16 值。

这是着色器所需的半精度寄存器数。寄存器数量通常为最大值(全寄存器数、半寄存器数),并计为全精度寄存器数。

尽量使用半精度变量,避免过多的混合精度运算。

Overall register footprint per shader instance

每个着色器实例使用的 128 位寄存器数。每个 128 位寄存器可以存储 4 个 FP32(全精度浮点)值或 8 个 FP16(半精度浮点)值。

使用过多寄存器会减少着色器执行中的活动波数,在某些情况下可能会导致寄存器溢出。较高的活动波形计数可以隐藏更长的内存延迟。另一方面,低活动波数无法隐藏延迟,从而导致较低的 ALU 利用率。

避免使用动态访问的非常大的向量变量。将定义移近其使用位置。如果可能,请使用常量数组/向量,而不是声明数组/向量并为其分配常量值。

Scratch memory usage per shader instance

每个着色器实例使用的 128 位暂存内存插槽数。警告:如果着色器使用任何暂存内存,它将性能不佳。

Output component count

所有着色器阶段输出组件的总数。

Input component count

所有着色器阶段输入组件的总数。

ALU fiber occupancy percentage

着色器的最大 ALU 光纤占用百分比。警告:如果此数字较低,则着色器的性能可能不佳。

更高的 ALU 光纤占用百分比意味着着色器执行中的并行度更高。较低的 ALU 光纤占用百分比可能会导致 ALU 或其他 GPU 组件上的内存访问延迟和空闲时间。

尝试降低寄存器使用量以增加 ALU 光纤占用百分比。

Mali_Offine_Compiler:

工具下载:

可以直接下载Arm Mobile Studio安装

工具使用指导文档:

https://developer.arm.com/documentation/101863/latest

使用命令:

malioc.exe + 文件名 -c 硬件型号 malioc shader.frag/shader.vert -c Mali-G78

运行结果:

重要指标解读:

A:算数单元(Arithmetic unit)

算数流水线执行所有类型的着色器算数指令。可以有多个并行算数流水线,数量取决于目标Mali GPU。工具中显示的数据根据设计中的管线数量进行标准化。

LS:加载/存储单元(L/S:Load/store unit)

加载/存储流水线处理所有非纹理存储器访问,包括缓冲区访问、图像访问。

V:可变单位(Varying unit)

可变流水线是实现可变插值器的专用流水线。

T:纹理单位(Texture unit)

纹理管道处理所有的纹理采样和过滤操作。

Work registers:

shader工作时使用的寄存器数量。可用的物理寄存器池执行着色器线程之间的分配。因此,减少工作寄存器的使用可以增加可以同时执行的线程数,有助于保持GPU工作忙碌。(待办:高通一直在提的并行度是不是一个东西)

Uniform registers:

统一寄存器

stack spilling(堆栈溢出):

可以看到是否有变量被放置在栈内存中。防止在栈中的内存对于GPU读取的性能消耗较大。

16-bit arithmetic:

以 16 位或更低精度执行的算术运算的百分比。数值越高代表shader性能越好。因为使用 mediump 选择的 16 位精度是 32 位精度下的 highp 的两倍。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值