跳转至

Work Graphs 快速入门

作者: Kostas Anagnostou
发布日期: 2024 年 6 月 29 日
原文链接: Interplay of Light


一、概述

Work Graphs(简称 WG)是 DirectX 12 在 2024 年新增的一项特性,由 NVIDIA 和 AMD 硬件同时支持。
它允许 GPU 自行生成produce消费consume任务,而无需再依赖 CPU 进行 Dispatch 调度。

作者通过一个三阶段的“阴影射线追踪”示例,演示了 Work Graph 的基本理念:

  1. 剔除所有背对光源的 tile。
  2. 对剩余 tile 执行 ray-march 深度检测。
  3. 对仍未命中的像素执行 ray-trace 查询 Acceleration Structure。

二、Work Graph 的核心概念

一个 Work Graph 由若干 节点(Node) 组成。每个节点:

  • 从显存或上游节点接收输入数据;
  • 执行自身的 Shader 逻辑;
  • 将结果写入下游节点或显存。

当前仅支持以下 Shader 类型:

  • Compute Shader
  • Inline Raytracing Shader

未来 DX 版本计划加入更多 Shader 类型的支持(如 Mesh Shader 等)。


三、示例:三节点 Work Graph

  1. Tile 分类节点(Tile Classifier)

  2. 检查 8×8 tile 内的所有像素是否都背向光源。

  3. 若全部背向,则直接写出“无阴影”标记;否则向下游输出 Tile 记录。

  4. Ray-march 节点(Raymarcher)

  5. 读取 Tile 记录,对每个像素沿深度缓冲执行 ray-march。

  6. 命中即写入结果;未命中则输出给下一个节点。

  7. Ray-trace 节点(Raytracer)

  8. 使用 Acceleration Structure 对剩余像素执行内联 ray tracing。

这三个节点按拓扑顺序串联,构成完整的 GPU 任务流。


四、节点定义示例

[Shader("node")]
[NodeLaunch("broadcasting")]
[NodeIsProgramEntry]
[NodeDispatchGrid(1, 1, 1)]
[numthreads(8, 8, 1)]
void ClassifyPixels_Node(
    in uint3 globalThreadID : SV_DispatchThreadID,
    in uint2 groupId : SV_GroupID,
    in uint groupThreadIndex : SV_GroupIndex,
    [MaxRecords(1)] NodeOutput<TileRecord> Shadows_Node
)

关键属性说明

属性 作用
NodeIsProgramEntry 指定该节点为 Work Graph 的入口节点。
NodeDispatchGrid 定义调度网格的大小(线程组数量)。
NodeLaunch 控制节点的执行粒度与线程共享方式。

五、Node Launch 模式

模式 描述 数据粒度
Broadcasting 线程组内所有线程共享同一输入记录,可使用 groupshared 内存。 按 Tile 或 Group 处理
Thread 每个线程拥有独立记录,不支持 groupshared 但可使用 Wave 指令。 按像素或线程处理
Coalescing 混合模式,由 GPU 自动批处理并部分共享数据。 自适应

六、执行模型

  • 每个节点独立执行,并可在 GPU 内部触发下游节点;

  • 节点的输出即下游节点的输入;

  • 整个 Graph 调度通过 DispatchGraph 完成,取代传统的 ExecuteIndirect

  • CPU 只需一次 Dispatch 调用,GPU 自行调度各节点。


七、优势

  • CPU 开销显著减少

  • 无需频繁 Dispatch 与 Barrier 同步。

  • GPU 并行性更强

  • 任务之间可细粒度连接与动态调度。

  • 任务粒度可控

  • 支持按 线程、线程组 或 混合 粒度灵活执行。


八、限制与注意事项

  • 当前仅支持 Compute ShaderInline Raytracing

  • 存在严格的 API 规则:

  • 所有线程组内线程必须一致地调用 Get…Records()

  • 不允许在分支语句中有条件地创建记录;

  • 调试与可视化工具仍在完善阶段,理解与排错较传统 Compute 更困难。


九、结语

Work Graphs 是 GPU 任务调度的重要革新,它让开发者能以图结构的形式构建完全由 GPU 驱动的渲染或计算流水线。
作者最后列出了一些官方与社区教程,供进一步深入学习。


译者注:本文翻译自 Kostas Anagnostou 发表于 2024 年 6 月 29 日 Interplay of Light 博客的《A Quick Introduction to Work Graphs》。