AMD GPU Services (AGS) 库
AMD GPU Services (AGS) 库使软件开发者能够查询通常无法通过标准操作系统或图形 API 获取的 AMD GPU 软件和硬件状态信息。
本教程介绍如何使用 Radeon GPU Analyzer (RGA) 为您的着色器和内核生成实时VGPR分析报告。假设您已具备基础的RGA使用知识。
通过对您的着色器和内核进行实时寄存器分析,您可以识别具有更高VGPR压力的代码块,并找到寄存器使用优化的机会。
实时寄存器分析确定“活动”寄存器,即包含将被后续指令消耗的值的所有寄存器。因此,活动寄存器的最大数量是需要分配的寄存器的下限。
该分析通过直接从ISA反汇编构建控制流图,并在其中传播读/写信息来计算活动寄存器集。每个读取操作会“向上”通过控制流图传播,直到遇到写入操作。这会产生一个生命周期,从写入开始,在读取指令处结束。
要为任何类型的着色器或内核生成实时VGPR分析报告,请在命令中添加 –livereg 开关。请确保您的命令包含 –isa 开关,因为实时寄存器报告是通过处理GCN ISA反汇编生成的。如果不使用 –isa,将没有GCN ISA反汇编可供分析。
以下命令将为Vulkan™顶点着色器生成实时VGPR分析报告
rga -s vulkan —vert ~/Vertex1.vert —isa ~/isa_output.txt —livereg ~/livereg_report.txt
让我们看一下下面为DirectX®11顶点着色器生成的实时寄存器分析报告
1 | 9 | ::::::: :: | label_basic_block_1: s_swappc_b64 s[2:3], s[2:3] 2 | 9 | ::::::: :: | s_andn2_b32 s0, s9, 0x3fff0000 3 | 9 | ::::::: :: | s_mov_b32 s1, s0 4 | 9 | ::::::: :: | s_mov_b32 s2, s10 5 | 9 | ::::::: :: | s_mov_b32 s3, s11 6 | 9 | ::::::: :: | s_mov_b32 s0, s8 7 | 9 | ::::::: :: | s_buffer_load_dwordx8 s[4:11], s[0:3], 0x00 8 | 9 | ::::::: :: | s_buffer_load_dwordx8 s[12:19], s[0:3], 0x20 9 | 9 | ::::::: :: | s_waitcnt lgkmcnt(0) 10 | 10 | ^ v:::::: :: | v_mul_f32 v0, s4, v4 11 | 11 | :^ v:::::: :: | v_mul_f32 v1, s8, v4 12 | 12 | ::^ v:::::: :: | v_mul_f32 v2, s12, v4 13 | 13 | :::^v:::::: :: | v_mul_f32 v3, s16, v4 14 | 12 | x::: v::::: :: | v_mac_f32 v0, s5, v5 15 | 12 | :x:: v::::: :: | v_mac_f32 v1, s9, v5 16 | 12 | ::x: v::::: :: | v_mac_f32 v2, s13, v5 17 | 12 | :::x v::::: :: | v_mac_f32 v3, s17, v5 18 | 11 | x::: v:::: :: | v_mac_f32 v0, s6, v6 19 | 11 | :x:: v:::: :: | v_mac_f32 v1, s10, v6 20 | 11 | ::x: v:::: :: | v_mac_f32 v2, s14, v6 21 | 11 | :::x v:::: :: | v_mac_f32 v3, s18, v6 22 | 10 | x::: v::: :: | v_mac_f32 v0, s7, v7 23 | 10 | :x:: v::: :: | v_mac_f32 v1, s11, v7 24 | 10 | ::x: v::: :: | v_mac_f32 v2, s15, v7 25 | 10 | :::x v::: :: | v_mac_f32 v3, s19, v7 26 | 9 | vvvv ::: :: | exp pos0, v0, v1, v2, v3 27 | 5 | ::: :: | s_buffer_load_dwordx4 s[4:7], s[0:3], 0x40 28 | 5 | ::: :: | s_buffer_load_dwordx4 s[8:11], s[0:3], 0x50 29 | 5 | ::: :: | s_buffer_load_dwordx4 s[0:3], s[0:3], 0x60 30 | 5 | ::: :: | s_waitcnt expcnt(0) 31 | 6 | ^ v:: :: | v_mul_f32 v0, s4, v8 32 | 7 | :^ v:: :: | v_mul_f32 v1, s8, v8 33 | 8 | ::^ v:: :: | v_mul_f32 v2, s0, v8 34 | 7 | x:: v: :: | v_mac_f32 v0, s5, v9 35 | 7 | :x: v: :: | v_mac_f32 v1, s9, v9 36 | 7 | ::x v: :: | v_mac_f32 v2, s1, v9 37 | 6 | x:: v :: | v_mac_f32 v0, s6, v10 38 | 6 | :x: v :: | v_mac_f32 v1, s10, v10 39 | 6 | ::x v :: | v_mac_f32 v2, s2, v10 40 | 5 | vvv :: | exp param0, v0, v1, v2, off 41 | 2 | vv | exp param1, v12, v13, off, off 42 | 0 | | s_endpgm
Maximum # VGPR used 13, # VGPR allocated: 14报告结构
备注
为RGA做贡献
RGA的实时寄存器分析引擎的源代码可以在GitHub上找到,链接如下。