工具使用指南
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 的两倍。