概览窗口
帧摘要 (基于帧的配置文件)
此窗口从多个角度描述了配置文件的结构。基于帧的配置文件是指从 DirectX12 和 Vulkan 图形应用程序捕获的、调用 Present 的配置文件。

系统活动部分显示了同步操作以及命令缓冲区何时提交到 GPU 的系统级视图。笼统地说,所有配置文件都包含两种类型的数据:命令缓冲区计时数据和 SQTT 计时数据。此窗格显示前者,RGP 的其余部分显示后者。
顶部有一系列控件
-
GPU 和 CPU 帧:控制如何显示帧边界,帧边界也由黑色标记括起来。两种模式之间的时间差可以帮助可视化工作负载提交和执行之间的延迟。驱动程序为每个命令缓冲区提供帧号、CPU 提交时间戳、GPU 开始时间戳和 GPU 结束时间戳。
-
基于 GPU 的帧:将帧边界解释为 GPU 上的 Present 完成时开始。
-
基于 CPU 的帧:将帧边界解释为 CPU 上的 Present 提交时开始。
-
-
工作负载视图:提供查看相同数据的不同方式
-
命令缓冲区:显示提交中所有命令缓冲区的列表。禁用此选项会将所有命令缓冲区压缩成一个提交块,该块还会指定其中包含的命令缓冲区数量。
-
同步对象:切换是否显示信号和等待。
-
顺序:一种替代视图,以线性方式显示数据,而不是堆叠显示。命令缓冲区和提交中最右侧的深色部分表示 GPU 上的执行时间。
-
仅 GPU:数据的平面视图,仅表示 GPU 工作。这有助于可视化所有 GPU 队列之间的并行性。
-
-
CPU 提交标记:绘制垂直线以帮助可视化 CPU 何时将特定类型的工作负载分派给 GPU。
-
缩放控件:与工具的其余部分一致,这些控件允许用户深入查看感兴趣的点。有关更多信息,请参阅缩放控件部分。
中间是实际视图。每个队列(图形、计算、复制)都有自己的部分。交替的灰色和白色背景表示帧边界。蓝色区域表示使用 SQTT 数据进行了哪些命令缓冲区的分析,以便在工具的其他部分进行更详细的事件分析。请注意,命令缓冲区使用两种相同的颜色阴影进行可视化。较浅的阴影表示到达 GPU 之前花费的时间,较深的阴影表示实际执行时间。
请注意,此视图是交互式的,用户可以选择和突出显示命令缓冲区、同步对象和提交点。
用户可以通过右键单击“详细 GPU 事件”区域中的命令缓冲区来关联命令缓冲区计时数据和 SQTT 数据。这将打开一个上下文菜单,其中包含三个菜单项,用于查找所选命令缓冲区中的第一个事件。选择菜单项之一将导航到相应的窗格并将焦点设置在指定的事件上。
底部是有关用户选择的信息
-
提交时间:指定 CPU 何时发布工作
-
提交持续时间:指定提交的完整持续时间
-
排队持续时间:指定工作在 GPU 上开始之前排队的时间
-
GPU 持续时间:指定 GPU 执行所需的时间。
在队列计时视图下方,我们发现以下摘要

这显示了对队列计时数据的解释,以确定哪个处理器是瓶颈。默认情况下,如果 GPU 空闲时间超过 5%,则该配置文件被视为 CPU 密集型。此百分比可以在 RGP 设置中进行调整。
请注意,显示的帧持续时间和帧率值来自 SQTT 数据。换句话说,它们基于 RGP 的其他窗格(如 Wavefront Occupancy)中使用的持续时间和着色器时钟频率。
分析开销显示了在收集 RGP 配置文件时硬件写入显存的分析数据量。分析开销也以用于写入数据内存带宽的形式表示。分析开销包括 SQTT 数据和分析时收集的缓存计数器数据。
队列提交和命令缓冲区饼图显示帧中的队列提交和命令缓冲区数量,按 Direct 和 Compute 队列细分。计算提交为黄色,图形提交为浅蓝色。同步图元部分计算在整个配置文件中检测到多少唯一信号和等待对象。请注意,配置文件数据仅包含来自队列操作的信号和等待。例如,来自 vkAcquireNextImageKHR 的任何 Vulkan 信号将不会出现,因为那不是队列操作。

事件统计饼图和表格显示按类型着色的事件计数。在上例中,有 281 个 Dispatch 和 1,633 个 DrawIndexedInstanced 事件。实例化图元直方图显示了绘制 N(1 到 16+)个实例的事件数量。在上例中,我们看到大多数事件只绘制了一个实例,而较少数量的事件绘制了 2-9 个和 16 个实例。

几何细分提供了顶点、着色图元、着色像素和实例化图元的摘要。在上例中,我们可以看到 GS 被用于扩展着色图元的数量。此外,查看渲染图元直方图,我们可以看到一个绘制使用了 0 到 1K 图元,而另一个绘制调用使用了 11K 或更多图元。考虑到该配置文件来自 D3D12nBodyGravity SDK 示例,这是有道理的。
注意:如果配置文件中没有渲染图元,则几何细分表和渲染图元直方图将被隐藏,如果配置文件中没有实例化图元,则实例化图元直方图将被隐藏。
配置文件摘要 (非基于帧的配置文件)
此窗口从多个角度描述了配置文件的结构。非基于帧的配置文件是指从 OpenCL、HIP 或纯计算 DirectX 和 Vulkan 应用程序捕获的配置文件。

系统活动部分显示了命令缓冲区何时提交到 GPU 的系统级视图。笼统地说,所有配置文件都包含两种类型的数据:命令缓冲区计时数据和 SQTT 计时数据。此窗格显示前者,RGP 的其余部分显示后者。对于 OpenCL 应用程序,可以在没有主机同步的情况下提交的多个分派会自动由 OpenCL 驱动程序分组到命令缓冲区中。这种分组减少了提交开销。
顶部有一系列控件
- 工作负载视图:提供查看相同数据的不同方式
命令缓冲区::仅用于纯计算 DirectX 和 Vulkan 配置文件。请参阅帧摘要部分中的描述。
-
同步对象:仅用于纯计算 DirectX 和 Vulkan 配置文件。请参阅:帧摘要部分中的描述。
-
顺序:一种替代视图,以线性方式显示数据,而不是堆叠显示。命令缓冲区和提交中最右侧的深色部分表示 GPU 上的执行时间。
-
仅 GPU:数据的平面视图,仅表示 GPU 工作。这有助于可视化所有 GPU 队列之间的并行性。
-
CPU 提交标记:绘制垂直线以帮助可视化 CPU 何时将特定类型的工作负载分派给 GPU。
-
缩放控件:与工具的其余部分一致,这些控件允许用户深入查看感兴趣的点。有关更多信息,请参阅“缩放控件”部分。
中间是实际视图。每个适用于非基于帧的配置文件的队列(计算、复制)都有自己的部分。请注意,命令缓冲区使用两种相同的颜色阴影进行可视化。较浅的阴影表示到达 GPU 之前花费的时间,较深的阴影表示实际执行时间。
请注意,此视图是交互式的,用户可以选择和突出显示命令缓冲区、同步对象和提交点。
底部是有关用户选择的信息
-
提交时间:指定 CPU 何时发布工作
-
提交持续时间:指定提交的完整持续时间
-
排队持续时间:指定工作在 GPU 上开始之前排队的时间
-
GPU 持续时间:指定 GPU 执行所需的时间。在队列计时视图下方,我们发现以下摘要

这显示了对队列计时数据的解释,以确定哪个处理器是瓶颈。默认情况下,如果 GPU 空闲时间超过 5%,则该配置文件被视为 CPU 密集型。此百分比可以在 RGP 设置中进行调整。
请注意,显示的配置文件持续时间值来自 SQTT 数据。换句话说,它基于 RGP 的其他窗格(如 Wavefront Occupancy)中使用的持续时间和着色器时钟频率。
分析开销显示了在收集 RGP 配置文件时硬件写入显存的 SQTT 数据量。分析开销也以用于写入 SQTT 数据内存带宽的形式表示。
对于纯计算 DirectX 和 Vulkan 应用程序,可以看到队列提交、命令缓冲区和同步图元饼图。有关更多信息,请参阅帧摘要部分。
事件统计饼图和表格显示事件计数。对于 OpenCL,各项按 OpenCL API 类型着色。对于 HIP,各项按内核名称(对于分派)或 HIP API 类型(对于其他事件)着色。纯计算 DirectX 和 Vulkan 应用程序的事件按类型着色,类似于基于帧的应用程序。在下面的示例中,有 89 个 clEnqueueNDRangeKernel 调用和 7 个 clEnqueueFillBuffer 调用。CmdBarrier() 的含义在屏障部分进行了解释。

屏障
现在,开发人员负责在其应用程序中使用屏障来控制何时在帧的特定部分可以使用资源。屏障使用不当可能导致性能下降,但其对帧的影响不易被开发人员看到——直到现在。屏障 UI 为开发人员提供了一个图形队列中使用的屏障列表,包括驱动程序插入的额外屏障。
请注意,在较旧的配置文件中或在不知道屏障来源的情况下,所有屏障和布局转换都将显示为“N/A”。使用最新的显示驱动程序可以确保此信息可用。

UI 左上角的摘要可让开发人员快速了解帧中是否存在屏障使用问题。在计算百分比时,只考虑屏障持续时间内未被任何队列的一个或多个事件重叠的部分。例如,如果一个屏障的持续时间为 100 ns,但该屏障的持续时间中有 80 ns 被其他事件(在同一队列或不同队列上)重叠,那么只有该特定屏障的 20 ns 会计入百分比计算。在上面的示例中,屏障使用占用了帧的 0%。
此摘要还显示了每次绘制或分派的平均屏障数量以及每次屏障发出的平均事件数量。
表格显示以下信息
- 事件编号 - 屏障的 ID - 选择此 UI 中的事件将在其他事件窗口中选择它
- 持续时间 - 屏障的生命周期
- 排空时间 - 屏障等待管线排空或工作完成的时间。一旦管线为空,就可以分派新的 Wavefront
- 停顿 - 与屏障相关的停顿类型 - 我们需要在图形管线中的何处排空工作
- 布局转换 - 蓝色的复选框表示屏障是否与布局转换相关。有六列表示布局转换的类型。这些在下面的布局转换部分进行描述。
- 失效 - 失效缓存列表
- 刷新 - 刷新缓存列表
- 屏障类型 - 屏障是源自应用程序还是驱动程序(如果未知则为“N/A”)
- 屏障原因 - 对于驱动程序插入的屏障,简要说明了插入此屏障的原因。表格中的行可以通过单击列标题进行排序。注意:在此列表中选择一个屏障将会在其他事件窗口中选择相同的事件。用户还可以右键单击任何行并导航到 Wavefront Occupancy、Event Timing 或 Pipeline State 窗格,并在这些窗格以及侧边面板中查看所选行代表的事件。用户还可以在 Frame Summary 窗格中看到父命令缓冲区,或导航到 Render/depth targets 视图并在时间线上查看事件。下面是右键单击上下文菜单样子的截图。

布局转换屏障表显示以下布局转换列
- 深度/模板解压缩:当深度/模板表面被解压缩时,会发出此屏障。深度/模板表面通常被压缩存储以减少与颜色和深度硬件单元的带宽。
- HiZ 范围重新汇总:当具有相应分层 Z 缓冲区数据的深度/模板缓冲区被修改时,会发出此屏障。此屏障确保修改后的数据反映在 hiZ 缓冲区中,从而实现正确的剔除和深度测试。
- DCC 解压缩:当 Delta Color Compression 压缩颜色数据需要解压缩时,会发出此屏障。
- FMask 解压缩:当 FMask 数据被解压缩时,会发出此屏障。FMask 用于压缩 MSAA 曲面。在纹理硬件单元读取这些曲面之前,必须先解压缩它们。
- 快速清除消除:当驱动程序执行快速清除时,会发出此屏障。对于快速清除,需要一个屏障来读取清除颜色,然后再填充渲染目标。清除到特定值(通常为 0.0 或 1.0)可能会让 GPU 跳过消除操作。
- 初始化 Mask RAM:当驱动程序使用着色器初始化用于压缩的内存时,会发出此屏障。
有关可能导致DCC 解压缩或可以使用哪些“清除”值来跳过快速清除消除的信息,请参阅/dcc-overview/。
OpenCL/HIP 的屏障 OpenCL 或 HIP 配置文件的屏障提供了对驱动程序如何调度到 GPU 的分派以及内核分派之间的依赖关系的可见性。这些屏障与上面描述的 DirectX12 和 Vulkan 使用的同步图元相同。
OpenCL 或 HIP 配置文件中显示的屏障对应于 OpenCL 或 HIP 驱动程序出于以下原因之一而插入的屏障。
- 数据依赖 - 后续分派之间存在数据依赖。例如,读取前一个内核分派的结果。这会导致插入屏障以使缓存失效。
- 队列分析 - (OpenCL 特定) 应用程序在创建命令队列时启用了 CL_QUEUE_PROFILING_ENABLE 属性。这会导致插入屏障以记录时间戳。
OpenCL 命令队列按顺序处理分派,并且后续内核分派通常使用前一个内核分派的结果。因此,可以预期 RGP 配置文件将包含大量屏障。
下面显示了典型 HIP 应用程序的屏障。

如我们所见,屏障所需的时间通常非常短,因为调度间依赖关系只会导致缓存失效。

应注意,RGP 中 OpenCL/HIP 屏障的含义与 OpenCL 或 HIP 内建同步 API 不同。例如,出现在 OpenCL RGP 配置文件中的屏障与基于 cl_event 或 cl_barrier 的 OpenCL 同步 API 无关。因此,在 OpenCL/HIP 配置文件中看到的屏障显示为CmdBarrier(),而不是 OpenCL 或 HIP API 的一部分。对于这些配置文件,RGP 目前不显示 API 特定的事件或主机同步。
上下文回滚
注意:此 UI 仅适用于 DirectX 和 Vulkan 配置文件。
上下文回滚是 RDNA 和 GCN 图形架构特有的硬件功能,在优化 AMD GPU 的绘制时需要考虑。每次绘制都需要一组硬件上下文寄存器,这些寄存器描述了该特定绘制的渲染状态。当一个需要不同渲染状态的新绘制进入管线时,需要另外一组上下文寄存器。分配上下文寄存器集的过程称为上下文回滚。一组上下文寄存器跟随绘制通过图形管线,直到完成。绘制完成后,相应的寄存器集可以供下一个传入绘制使用。
在 RDNA 和 GCN 硬件上,有 8 个逻辑上下文寄存器库,其中只有七个可用于绘制。最坏情况是 8 个连续的绘制每个都需要一组唯一的上下文寄存器。在这种情况下,最后一个绘制必须等待第一个绘制完成才能使用上下文寄存器。这会导致一个停顿,该停顿可以通过 RGP 进行测量和可视化。在 RDNA2 硬件上,虽然仍有 8 个上下文寄存器库,但有一个完整的库(通常是库 2)被硬件保留,并且通常在“上下文回滚”窗格中显示为空。

在上例中,一个 DirectX 12 应用程序,我们可以看到帧中有 223 个上下文回滚,其中没有一个是冗余的。Radeon GPU Profiler 会比较状态变化之间的上下文寄存器值,以计算上下文回滚是否冗余。冗余上下文回滚可能由应用程序和驱动程序引起。无效的绘制批处理可能是应用程序方面的原因。
此外,该仪表还显示了上下文回滚的数量占绘制调用数量的百分比,从而直观地指示了帧在更改状态方面的效率。较低的百分比表示平均而言,更多的绘制调用在帧中共享状态。此仪表还显示了活动上下文回滚与冗余上下文回滚的细分。
右侧的图表显示了每个上下文中的事件数量。
下面的表格显示了 API 视角的当前状态,以及哪些状态部分参与了上下文回滚。第一列表示它参与了多少上下文回滚。第二列表示其中有多少次更改是相对于状态冗余的(状态以完全相同的值写入,或者更改了另一部分状态)。下一列表示完全冗余的上下文回滚数量(整个上下文是冗余的,而不仅仅是状态)。最后一列显示了该状态的上下文回滚数量,其中这是事件中唯一改变的内容。

选择一个 API 状态会显示第二个表格(称为事件表格)中的所有绘制调用,这些调用由于该状态的改变(无论是否同时改变其他状态)而回滚了上下文。
状态表右上角的“筛选 API 状态…”字段会在您键入时实时筛选状态树。只有包含筛选文本字符串的状态才会被显示。
注意:在此列表中选择一个事件将会在其他事件窗口中选择相同的事件。
用户还可以右键单击任何行,导航到 Wavefront Occupancy、Event Timing 或 Pipeline State 窗格,并在这些窗格以及侧边面板中查看所选行代表的事件。下面是右键单击上下文菜单样子的截图。

注意:在事件窗格中选择事件并使用右键单击上下文菜单在窗格之间跳转时,“在上下文回滚中查看”选项仅在所选事件当前存在于上下文回滚窗格的事件表中时可用。
在事件窗格中,从“波前占用事件时间线”或“事件时序”窗格的“按颜色”下拉框中选择“上下文回滚”选项,可以显示已从前一个事件回滚了上下文的所有事件。

最耗时的事件
“最昂贵事件”UI允许开发人员通过持续时间快速定位最昂贵的事件。窗口顶部是事件持续时间的直方图。最便宜的事件位于图表的左侧,最昂贵的事件位于右侧。带有箭头的蓝色摘要条指向按时间计算最昂贵的存储桶。此存储桶中的事件最需要优化。图表下方的双滑块可用于选择直方图的不同区域。随着双滑块位置的改变,下方的摘要和表格将更新。在下面的示例中,我们可以看到最昂贵的 5% 的事件占用了 51% 的帧时间。
直方图下方是帧的摘要。在这种情况下,最昂贵的 15% 的事件占用了 99% 的帧时间,其中 52% 的选定区域由图形事件组成,48% 由异步计算事件组成。
摘要下方的表格显示了选定区域中的事件列表,最昂贵的事件位于列表顶部。

注意:在此列表中选择一个事件将会在其他事件窗口中选择相同的事件。
用户还可以右键单击任何行,导航到 Wavefront Occupancy、Event Timing 或 Pipeline State 窗格,并在这些窗格以及侧边面板中查看所选行代表的事件。下面是右键单击上下文菜单样子的截图。

表格最后一列显示的 API 着色器阶段控件 指示了给定事件使用的管道中哪些 API 着色器阶段是活动的。
渲染/深度目标
注意:此 UI 仅适用于 DirectX 和 Vulkan 配置文件。
此 UI 提供了整个帧中用作渲染目标的*所有*缓冲区的概览。

屏幕分为两个部分:时间线视图和列出的树状视图

图形时间线视图说明了在帧持续时间内渲染目标的用法。其他事件,如分派、光线追踪分派、复制、清除和障碍物,显示在此视图的底部。
缩放控件可用于聚焦时间线的一部分。有关缩放控件的更多信息,请参阅缩放控件部分。此视图中的每个实心块代表一系列重叠并在同一通道中使用相同渲染目标绘制的事件。单击其中一个块会高亮显示树状视图中相应的条目。

此部分列出了帧中找到的所有渲染目标及其属性。根据活动的*分组模式*,它显示渲染目标或通道的顶级列表。分组可以通过两种方式配置:
-
按目标分组 顶级由帧中找到的所有渲染目标以及每帧统计信息组成。子条目显示每个渲染目标的*每通道*统计信息。
-
按通道分组 顶级由帧中找到的所有通道组成。子条目显示每个渲染目标的每通道统计信息。
以下是当前可用的列:
-
图例 时间线中渲染颜色的颜色。
-
名称 渲染目标的名称。当前是顺序的,基于帧中每个渲染目标的首次出现。
-
格式 每个渲染目标的格式。
-
宽度 渲染目标的宽度。
-
高度 渲染目标的高度。
-
绘制调用 输出到此渲染目标的绘制调用次数。
-
压缩 指示此渲染目标是否启用了压缩。
-
采样数 渲染目标的 MSAA 采样数。
-
无序绘制调用 发送到此渲染目标的无序绘制调用次数。对于在 RDNA GPU 上捕获的配置文件,此列不显示。
-
持续时间 渲染到渲染目标的所有事件的总持续时间。例如,如果 3 个事件写入深度缓冲区,则持续时间是这 3 个事件持续时间的总和。
可以通过单击列标题来对表格中的行进行排序。
注意
-
在时间线视图或树状视图中选择任何项目,都会在其他视图中选择相应的项目。
-
在时间线视图或树状视图中选择任何项目,都会在工具的其他部分选择该项目表示的最早事件。
管线
此概览窗格提供了配置文件中管道使用情况的详细信息。

窗格分为三个部分:
管道摘要 - 显示配置文件中找到的*每个*管道 API 配置的列表。
管道 - 显示一个表,其中包含配置文件中*每个*管道的一个条目,以及该管道中*每个*活动着色器阶段的子条目。
事件 - 显示**管道**表中*使用*所选管道的所有事件。
管道摘要
管道摘要部分显示了所有*唯一*管道配置,按 API 着色器阶段着色。
- 唯一定义为具有相同的活动 API 着色器阶段。
每个配置旁边都显示了配置文件中有多少个管道匹配该配置的计数。
管道
管道部分包含一个表,其中包含配置文件中*每个*管道的一个条目。
表中的每个条目显示以下信息:
- 存储桶 ID - 用于将管道与事件状态存储桶匹配的 ID,用于在其他窗格中进行分组。
- 哈希 - 128 位管道哈希和 API 着色器哈希。
- 持续时间 - 管道持续时间是使用此管道的所有事件的持续时间之和(仅计算重叠区域一次)。表中为子项显示的着色器阶段持续时间是使用此管道的所有事件的特定于着色器的持续时间之和(仅计算重叠区域一次)。
- 事件计数 - 使用此管道的事件数量占配置文件中总事件数量的百分比。
- 平均事件持续时间 - 配置文件中使用此管道的事件的平均持续时间。
- 占用率 - 每个管道的占用率范围和每个着色器阶段的占用率。
- VGPR - 每个管道的 VGPR 范围和每个着色器阶段的 VGPR 使用情况。
- SGPR - 每个管道的 SGPR 范围和每个着色器阶段的 SGPR 使用情况。
- 暂存内存 - 是/否,表示管道是否使用暂存内存。
- 波前模式 - wave32/wave64,表示着色器的模式。此列仅出现在支持 wave32 与 wave64 的设备上。
- 阶段 - API 着色器阶段控件,指示给定管道活动的阶段。
筛选管道... 字段可用于按 API PSO 哈希筛选列表中的项目。可以通过单击列标题来对管道表进行排序。
右键单击管道摘要部分中的管道会显示一个上下文菜单,提供“在 Radeon GPU Analyzer 中分析管道”的选项。选择此选项会将管道保存为二进制格式,并在 Radeon GPU Analyzer 中打开该二进制文件。有关更多信息,请参阅Radeon GPU Analyzer 和 Radeon GPU Profiler 互操作部分。

在表格下方,显示了当前所选管道的存储桶 ID、API PSO 哈希和驱动程序内部管道哈希。还有一个快速链接可以在“管道状态”视图中查看所选管道。这将导航到与该管道关联的第一个事件的“管道状态”视图。
事件
事件表显示*使用***管道**表中当前所选管道的所有事件。
表中的每个条目显示以下信息:
- 事件 ID - 事件 ID
- 事件 - 事件文本,显示事件的 API 或驱动程序调用
- 持续时间 - 事件在帧中花费的时间
可以通过单击列标题来对事件表进行排序。
与 RGP 中的所有事件列表一样,用户可以通过右键单击快速导航到其他窗格中的事件。

系统信息
此 UI 报告用于生成配置文件的系统配置。Radeon Developer Panel 可以在远程系统上捕获配置文件,因此系统详细信息可能与您正在查看数据的系统不同。GPU 时钟频率是指捕获时运行的时钟频率。括号中的数字表示图形硬件可以运行的峰值时钟频率。
此外,如果在捕获配置文件时启用了任何驱动程序实验,它们将在此处“驱动程序实验”部分下显示。将鼠标指针悬停在驱动程序实验名称或值上会显示一个描述该项目的工具提示。
