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