c++ - 如何有效地将 VkDispatchIndirectCommand 字段提升为 subgroupSize 的倍数
问题描述
我在 vulkan 中使用计算着色器并遇到了一个我无法解决的问题。我有 2 个计算着色器。第一个计算第二个中需要的调用量(除其他外),并将这些(通过 atomicAdd 间接 - 每个调用向整体添加一个未知量)写入 VkDispatchIndirectCommand 的字段。问题是 VkDispatchIndirectCommand 代表工作组的数量而不是调用,每个工作组的调用计数应至少为 subgroupSize(例如 nvidia 的 32)。我第一次尝试纠正主机端两个着色器运行之间的数量导致性能大幅下降。什么是更好的方法,或者在 vulkan 中甚至有一个理想的解决方案,我只是还不知道。
解决方案
从 atomicAdd 的使用来看,听起来您想要的调用次数是在第一次调度的所有调用中以分布式方式计算的。假设您无法更改它,并且确实需要一个后处理来将调用次数转换为工作组数,那么您可以在第一个调度(一个线程)之后运行一个非常小的调度(一个线程),该调度在间接调度之前进行转换。这本质上是您在 CPU 上所做的事情,但在 GPU 上以应该具有较低延迟的流水线方式完成。
推荐阅读
- json - DataTables 插件无法读取来自本地存储的 JSON 数据
- python - 如何在函数 Python 中调用类
- javascript - 无法将事件从 javascript 分派到组件(离子)
- javascript - 如何使用单选按钮和切换大小写使用 JavaScript 更改 img?
- c++ - constexpr 运算符 new
- php - 为什么我会得到带有 INSERT INTO VALUES 的 #1064?
- python - python REST服务器PUT不更新值
- mysql - 在同一张表中 LEFT JOIN 11 次
- mysql - 根据其他左连接计算左连接
- fortran - 当输入名称列表文件中缺少名称列表变量时,如何引发运行时错误?