我在vulkan中玩计算着色器,遇到了一个我无法解决的问题。我有2个计算着色器。第一个计算所需的调用量(除其他事项外),然后将其写入(通过atomicAdd间接调用-每个调用将一个未知量添加到整个对象)到VkDispatchIndirectCommand字段中。问题是VkDispatchIndirectCommand代表工作组的数量而不是调用的数量,并且每个工作组的调用计数应至少为subgroupSize(例如,在nvidia上为32)。 我第一次尝试校正主机上两个着色器运行之间的数量时,导致性能下降。什么是更好的方法,或者在vulkan中甚至有理想的解决方案,我只是不知道。
答案 0 :(得分:2)
通过使用atomicAdd,听起来您想要的调用数是在第一次调度的所有调用中以分布式方式计算的。假设您不能更改它,并且确实需要一个后处理才能将调用数转换为工作组数,则可以在第一个执行该转换的线程之后在间接分派之前运行一个非常小的分派(一个线程)。从本质上讲,这就是您在CPU上所做的事情,但是在GPU上以流水线方式完成,应该具有较低的延迟。