【问题标题】:How vulkan pipeline barrier is implemented in terms of GPU or its driver?vulkan管道屏障是如何在GPU或其驱动方面实现的?
【发布时间】:2021-05-02 18:31:37
【问题描述】:

我认为管道障碍是内核模式驱动程序中命令的一种重新排序,但它似乎不是真的。我也认为这可能是驱动端 GPU 调度程序的提示,但它似乎仍然不是真的。它只是构建 KMD 的主命令缓冲区的提示,还是管道屏障代表 GPU 命令处理器的某种指令?

编辑:如何实现管道屏障?

【问题讨论】:

  • 这不是一个可以回答的问题,因为任何答案都取决于实施的非常具体的细节,并且可能因实施而异。即使在实现中,它也可能因障碍而异。但是障碍不是“重新排序”命令;它们是相反的,因为它们明确阻止重新排序。

标签: graphics gpu vulkan


【解决方案1】:

正如 Nicol 所说,细节将是实施和特定于障碍的。但一般原则是相似的。

GPU 是流水线处理器,这意味着每个命令都要经过多个执行阶段。阶段在绘图调用内和绘图调用之间同时运行。例如,绘图命令 N 的片段处理可能与绘图命令 N+1 的顶点处理同时执行。在先前的命令完成执行srcStageMask 中的所有阶段之前,屏障命令会阻止后续命令的工作开始执行dstStageMask 中的任何阶段。除了这个执行屏障,管道屏障还可以包括一个内存屏障,它确保前面命令完成的内存访问与当前命令的内存访问顺序正确。以后的命令。

所以这与重新排序无关,它只与新命令在先前命令完成之前开始的事实有关,有时您需要防止这种情况发生。最明显的例子是渲染到纹理:您希望在纹理的任何读取发生之前完成对纹理的所有写入。没有管道屏障,没有什么可以阻止它们重叠。

通常,GPU 将有一个(内部)命令,在之前的命令全部通过命令执行点之后“发出”某个标记的“信号”,另一个命令“等待”某个标记发出信号,然后才允许任何后续工作继续。标记可能只是一个内存位置(信号:写入特定值,等待:旋转直到该位置包含特定值)。或者它可能是某种特殊用途的片上资源。然后,障碍将只是一个信号命令,然后是一个等待命令。这会在 GPU 部分处于空闲状态的管道中创建一个“气泡”。为了尽量减少这种情况,一些 GPU 将能够在管道中的多个点发出信号并等待。通常能够在颜色写入完成后发出信号,并在光栅化之前等待,例如,允许绘制 N+1 的顶点工作发生,而绘制 N 的片段工作正在进行,但停止 N+1 片段工作。 srcStageMaskdstStageMask 允许实现准确地知道依赖关系是什么,但大多数实际上不能利用这种精细的粒度,并且会产生更粗略的保守气泡。

内存屏障对应于缓存清理(将脏行写入内存)和缓存无效(删除缓存的数据)操作。 “可见性”意味着清理本地缓存,将数据写回内存,以便以后从内存中读取的任何内容都会看到新值。 “可用性”意味着使本地缓存无效,因此任何新的读取都将在缓存中丢失(而不是看到旧数据)并从内存中获取。 GPU 通常对针对不同本地缓存(例如纹理缓存、深度/模板缓存等)的这些特定操作具有特殊命令。

因此,在渲染到纹理的情况下,您需要在纹理渲染命令和从纹理读取的任何命令之间插入管道屏障。驱动程序会为 GPU 生成一个命令(或多个命令),等待先前的命令完成混合阶段的执行,然后清理颜色附件缓存,然后发出一些标记。然后它会生成 GPU 命令以等待标记发出信号并使纹理缓存无效,然后再允许任何未来的绘制调用开始片段着色。

正如我之前所说,GPU 提供的实际命令可能比这粗得多,例如它可能是“等待所有先前的绘制命令完全完成,然后清理并使所有不具有自动一致性的缓存无效,然后允许后续的绘制命令开始顶点获取和顶点着色。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2021-05-30
    相关资源
    最近更新 更多