高通的离线编译器Adreno Offline Compiler
UE5好像此检测工具的插件:
https://developer.oculus.com/documentation/unreal/unreal-adreno-offline-compiler/
也可以去下载该工具的SDK自行合入:
https://developer.qualcomm.com/forums/software/adreno-gpu-sdk
常见指标
Complex instruction count 32bit/16bit: 这可能是指执行一些复杂的32位或16位指令需要的指令数。在GPU编程中,指令数是一个重要的性能指标,因为更多的指令通常意味着更长的执行时间和更高的功耗。
Texture read instruction count: 这是指读取纹理数据所需要的指令数。在图形渲染中,纹理读取是一项常见的操作,其性能直接影响到渲染速度。
Memory read/write instruction count: 这是指读取或写入内存所需要的指令数。在GPU编程中,内存操作通常是性能瓶颈,因此优化内存读写的指令数是提高性能的一个重要方向。
Flow control instruction count: 这是指执行流程控制(如条件判断和循环)所需要的指令数。在GPU编程中,流程控制指令通常比较昂贵,因为它们可能导致线程的分叉和合并,从而降低并行性。
Barrier and fence Instruction count: Barrier和fence是同步指令,用于控制线程之间的执行顺序。Barrier用于同步同一线程组中的线程,而fence用于同步不同线程组中的线程。这些指令的数量也是一个重要的性能指标,因为它们会阻塞线程的执行,直到所有线程都达到同步点。
Short latency sync instruction count: 这是指具有较短延迟的同步指令数量。这些指令通常用于同步相互靠近的线程,例如同一线程组中的线程。较短的延迟意味着这些指令可以在较短的时间内完成同步操作,从而减少线程等待的时间。
Long latency sync instruction count: 这是指具有较长延迟的同步指令数量。这些指令通常用于同步相互较远的线程,例如不同线程组中的线程。较长的延迟意味着这些指令需要更多的时间来完成同步操作,从而导致线程等待的时间较长。
在 GPU 编程中,同步指令的数量和类型是性能的关键指标,因为它们会影响线程的执行顺序和并行性。为了提高性能,应尽量减少同步指令的数量,特别是具有较长延迟的同步指令。在某些情况下,可以通过重新设计算法或使用不同的同步策略来实现这一目标。
Miscellaneous instruction count:指其他类型的 GPU 指令的数量,如算术、逻辑和移位指令。降低这些指令的数量可以提高 GPU 程序的性能。
Full precision register footprint per shader instance:每个着色器实例所需的完全精度寄存器数量。完全精度寄存器提供较高的精度,但可能需要更多的资源。
Half precision register footprint per shader instance:每个着色器实例所需的半精度寄存器数量。半精度寄存器的精度较低,但需要较少的资源。
Overall register footprint per shader instance:每个着色器实例所需的总寄存器数量。减少寄存器的使用可以降低资源占用,从而提高性能。
Scratch memory usage per shader instance:每个着色器实例所需的临时内存(Scratch Memory)使用量。Scratch Memory 用于存储临时数据,如局部变量和中间结果。减少 Scratch Memory 的使用可以降低内存占用,从而提高性能。
Output component count:输出组件的数量。这是指从顶点着色器到片段着色器的输出数据的数量。降低输出组件的数量可以减少数据传输,从而提高性能。
Input component count:输入组件的数量。这是指从顶点缓冲区到顶点着色器的输入数据的数量。降低输入组件的数量可以减少数据传输,从而提高性能。
ALU fiber occupancy percentage:ALU 纤程占用百分比。这是指 ALU(算术逻辑单元)在执行计算时的利用率。提高 ALU 利用率可以充分利用 GPU 资源,从而提高性能。
Mali Offline Compiler
常见指标
硬件:Mali-G710 r0p0,这是 Arm 的一款图形处理器。
架构:Valhall,这是 Arm Mali GPU 的架构。
驱动程序:r36p0-00rel0,这是用于 Arm Mali GPU 的驱动程序版本。
着色器类型:OpenGL ES Fragment,这是一种用于渲染图像的着色器类型。
主要着色器部分提供了关于着色器性能的详细信息:
Work registers
工作寄存器:32,这表示着色器使用了32个工作寄存器。
Uniform registers
统一寄存器:50,这表示着色器使用了50个统一寄存器。
Stack spilling
堆栈溢出:false,这表示着色器没有导致堆栈溢出。
16-bit arithmetic16位算术:55%,这表示着色器中55%的操作使用了16位算术。
FMA、CVT、SFU、LS、V、T 是在着色器报告中表示不同类型指令的缩写
FMA
Arith FMA,代表浮点乘加指令。这类指令执行浮点数的乘法和加法操作,通常用于向量和矩阵计算等。
CVT
Arith CVT,代表转换指令。这类指令用于在不同的数据类型(如整数、浮点数等)之间进行转换。
SFU
Arith SFU,代表特殊功能单元指令。这类指令执行一些特殊的数学运算,如平方根、对数、三角函数等。
LS
Load/Store,代表加载和存储指令。这类指令用于从内存中读取数据(加载)或将数据写入内存(存储)。
V
Varying,代表插值指令。这类指令用于在顶点着色器和片段着色器之间进行数据插值,如颜色、纹理坐标等。
T
Texture,代表纹理指令。这类指令用于处理纹理数据,如采样纹理、查找纹理等。
Total instruction cycles,Shortest path cycles,Longest path cycles
Total Instruction Cycles:
总指令周期数。这是执行着色器中所有指令所需的总周期数。一个周期通常是图形处理单元(GPU)执行一个操作的时间单位。总指令周期数越低,着色器的性能越好。
Shortest Path Cycles:
最短路径周期数。这是执行着色器中所有可能的执行路径中最短的那一个所需的周期数。在某些情况下,由于条件分支或循环等原因,着色器可能有多个可能的执行路径。最短路径周期数越低,着色器的最佳可能性能越好。
Longest Path Cycles:
最长路径周期数。这是执行着色器中所有可能的执行路径中最长的那一个所需的周期数。这是着色器的最坏可能性能。最长路径周期数越低,着色器的最坏可能性能越好。
这些指标可以帮助你了解着色器的性能特征,并找到可能的优化方向。例如,如果最长路径周期数远大于最短路径周期数,那么可能需要优化着色器的条件分支或循环以改善最坏情况的性能。
着色器属性(Shader properties)部分描述了着色器的一些特征和行为
Has uniform computation:
是否有统一计算。如果为 true,则表示着色器在运行过程中会对统一变量(uniform variables)进行计算。统一变量是在整个着色器执行过程中保持不变的变量,通常用于存储材质、灯光等信息。
Has side-effects:
是否有副作用。如果为 false,则表示着色器没有副作用。副作用是指着色器在执行过程中可能对其它数据或状态产生影响的行为,例如修改全局变量或写入缓冲区。
Modifies coverage:
是否修改覆盖率。如果为 false,则表示着色器不会改变片段的覆盖率。覆盖率是指一个片段在最终图像中所占的像素比例。修改覆盖率可能会影响抗锯齿处理和透明度效果。
Uses late ZS test:
是否使用延迟 ZS 测试。如果为 false,则表示着色器不使用延迟的深度(Z)和模板(stencil,S)测试。延迟 ZS 测试是在片段着色器执行后进行的深度和模板测试,可以提高渲染性能,但可能会导致一些视觉效果不正确。
Uses late ZS update:
是否使用延迟 ZS 更新。如果为 false,则表示着色器不使用延迟的深度(Z)和模板(stencil,S)更新。延迟 ZS 更新是在片段着色器执行后更新深度和模板缓冲区,与延迟 ZS 测试类似,可以提高渲染性能,但可能会导致一些视觉效果不正确。
Reads color buffer:
是否读取颜色缓冲区。如果为 false,则表示着色器不会读取颜色缓冲区的数据。颜色缓冲区存储了渲染过程中的像素颜色信息。读取颜色缓冲区可能会影响渲染性能和视觉效果。
了解这些属性有助于分析着色器的行为和性能特点,并找到可能的优化方向。