我在 vulkan 中使用计算着色器,遇到了一个我无法满意解决的问题。我有 2 个计算着色器。第一个计算第二个中所需的调用量(除其他事项外),并将这些(通过 atomicAdd 间接调用 - 每次调用都会向整体添加一个未知量)写入 VkDispatchIndirectCommand 的字段中。问题是 VkDispatchIndirectCommand 代表工作组的数量而不是调用,每个工作组的调用计数应该至少是 subgroupSize(例如 nvidia 的 32)。 我第一次尝试更正主机端两个着色器运行之间的数量导致性能大幅下降。什么是更好的方法,或者在 vulkan 中是否有一个理想的解决方案,我只是还不知道。
最佳答案
从 atomicAdd 的使用来看,听起来您想要的调用次数是在第一次分派(dispatch)的所有调用中以分布式方式计算的。假设你不能改变它,并且真的需要一个后处理来从调用数量转换为工作组数量,你可以在第一个执行间接调度之前执行该转换的调度之后运行一个非常小的调度(一个线程)。这本质上是您在 CPU 上所做的,但在 GPU 上以流水线方式完成,应该具有较低的延迟。
关于c++ - 如何有效地将 VkDispatchIndirectCommand 字段提高到 subgroupSize 的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54407406/