c++ - 如何有效地将 VkDispatchIndirectCommand 字段提高到 subgroupSize 的倍数

标签 c++ vulkan compute-shader

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

最佳答案

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

关于c++ - 如何有效地将 VkDispatchIndirectCommand 字段提高到 subgroupSize 的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54407406/

相关文章:

c++ - OpenGL 计算着色器调用

Vulkan WaW 危害和内存屏障

c - Vulkan - 同步对单个缓冲区的访问

vulkan - 组合图像采样器与单独采样图像和采样器

opengl - 在 OpenGL 中渲染数据 : Vertices and Compute shaders

c++ - 如何在 Vulkan 中跨多个计算队列执行并行计算着色器?

c++ - 各种编译器上的 RDRAND 和 RDSEED 内在函数?

c++ - 迭代时如何知道我在树的末尾?

c++ - 如何将特定的头文件夹添加到 Eclipse?

在不同的 IDE 中使用 Git 进行 C++ 协作