使用Radeon™ GPU Analyzer进行实时VGPR分析

首次发布:
Amit Ben-Moshe's avatar
Amit Ben-Moshe

本教程介绍如何使用 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

报告结构

  • 第一列(最左边):一个递增的数字,代表程序代码行号
  • 第二列:程序执行到该点时活动VGPR的数量
  • 第三列:代表每个寄存器状态的符号。第i个符号指的是第i个寄存器
    • ‘:’ 表示该寄存器保持活动状态,但当前指令并未主动使用它
    • ‘^’ 表示当前指令写入该寄存器
    • ‘v’ 表示当前指令读取该寄存器
    • ‘x’ 表示当前指令同时读取和写入该寄存器
  • 第四列:当前指令的反汇编
  • 报告的最后一行:总结了着色器实际使用的VGPR数量以及为它分配的VGPR数量。

备注

  • 分析会考虑代码中的分支,并假设任何一个分支都可能被执行。在这种情况下,活动寄存器会“凭空”出现在标签处。这是设计使然。
  • 分析仅关注VGPR,而不关注SGPR。许多指令会消耗标量寄存器,这些指令被忽略,因为通常有足够的标量寄存器,而且标量寄存器不是GCN上占用率的限制因素。
  • 程序开始时,一些寄存器会显示为活动状态——这通常是预加载的。例如,在顶点着色器中,获取着色器会在着色器开始前将数据加载到寄存器中。

为RGA做贡献

RGA的实时寄存器分析引擎的源代码可以在GitHub上找到,链接如下。

资源

Amit Ben-Moshe's avatar

Amit Ben-Moshe

Amit Ben-Moshe 是 AMD 的杰出工程师。他的发帖内容代表他个人的观点,可能不代表 AMD 的立场、策略或观点。第三方网站链接仅为方便起见提供,除非明确说明,否则 AMD 对这些链接网站的内容概不负责,也不暗示任何认可。

相关新闻和技术文章

相关视频

© . This site is unofficial and not affiliated with AMD.