首页 > 解决方案 > 如何有效地将 VkDispatchIndirectCommand 字段提升为 subgroupSize 的倍数

问题描述

我在 vulkan 中使用计算着色器并遇到了一个我无法解决的问题。我有 2 个计算着色器。第一个计算第二个中需要的调用量(除其他外),并将这些(通过 atomicAdd 间接 - 每个调用向整体添加一个未知量)写入 VkDispatchIndirectCommand 的字段。问题是 VkDispatchIndirectCommand 代表工作组的数量而不是调用,每个工作组的调用计数应至少为 subgroupSize(例如 nvidia 的 32)。我第一次尝试纠正主机端两个着色器运行之间的数量导致性能大幅下降。什么是更好的方法,或者在 vulkan 中甚至有一个理想的解决方案,我只是还不知道。

标签: c++vulkancompute-shader

解决方案


从 atomicAdd 的使用来看,听起来您想要的调用次数是在第一次调度的所有调用中以分布式方式计算的。假设您无法更改它,并且确实需要一个后处理来将调用次数转换为工作组数,那么您可以在第一个调度(一个线程)之后运行一个非常小的调度(一个线程),该调度在间接调度之前进行转换。这本质上是您在 CPU 上所做的事情,但在 GPU 上以应该具有较低延迟的流水线方式完成。


推荐阅读