Skip to content

[Graphics] GPU 硬件性能计数器支持 #326

Description

@SaeruHikari

市面上的截帧工具产品比较广泛并且针对自家硬件的情况都是比较好用的,但是有以下这些需求没办法解决:

  • 这些截帧工具都使用 discrete counter,由于硬件槽位有限,都需要截取之后进行 Multi-Pass 多次执行,取得所有的硬件 counter;
    • 准确,但是这样的工况和实时环境大不相同;
  • 无法在实时运行的状况下取得具体运行环境的即时计数器,在即时波动下无法辅助定位问题;
  • PIX 之类的通用工具,由于是 xbox 那边移植过来,可能是团队问题,问题很多,且针对细化问题不太好用;
  • AMD RGP 和 Intel 的工具,虽然提供的 CP 流和 Wave 组底层信息很多很精准,但是提供的管线相关信息过少,导致人类几乎不可读;
  • 无法以更加聚焦精准的方式程序化地取得底层的 counter,这在针对具体问题的精细化分析的时候往往是很必要的;
  • 无法以可编程的方式扩展自己的分析器和工具集;

为了更好的实时监视,同时可以聚焦精准需求,获取到逐平台最底层的计数器,我们需要引入 CGPU Perf API:

  • 通过每个厂商给出的 SDK 精准查询底层计数器;
  • 这些计数器本身就是厂商工具的底层,查询和功能能力是充分的。加上通过合适的组合调度,可以发挥出超越厂商工具的效果;
  • 配合 RenderGraph 精准嵌入到程序的渲染层,可以提供比起 PresentHook 更强的控制力和精细度;
  • 每个厂商的 SDK 有很多,最终配合实际需求选型组合如下:
    • NVIDIA: NVML(宏观数据)+ NvPerf/NSightPerf(精准计数)
    • AMD:ROCM-SMI(宏观数据) + GPUPerfAPI(精准计数)
    • INTEL:ITT(Profiler 框架接口) + Level0(底层接口)
    • METAL:Metal Counters API(精准计数)

除了 NVML 这种库提供的频率/功耗信息,采样方式分为以下三种:

  • discrete:精准采样,需要多次运行管线,可以配合 RenderGraph 进行多次执行截取到精准的 profile 计数;
  • stream:流式插值采样,会损失一些精度,但是可以直接用实时 UI 面板显示出关注的硬件资源情况,配合 RG 做一些 hint,对于实际实时波动调试作用很大;
  • intruction trace:回读硬件的指令包和 pc/mmu 等最底层的 counter,配合 shader pdb,可以实现指令和代码瓶颈的精准定位;

采样接口抽象在 cgpu_perf.h 已经定型。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions