我有几个计算着色器(我们称它们为compute1
,compute2
等等),它们有几个输入绑定(在着色器代码中定义为layout (...) readonly buffer
)和几个输出绑定(定义为layout (...) writeonly buffer
)。我正在将带有数据的缓冲区绑定到它们的描述符集,然后尝试并行执行这些着色器。
我试过的:
vkQueueSubmit()
拥有VkSubmitInfo.pCommandBuffers
多个主要命令缓冲区(每个计算着色器一个);vkQueueSubmit()
VkSubmitInfo.pCommandBuffers
保存一个主命令缓冲区,该缓冲区是使用保存vkCmdExecuteCommands()
多个pCommandBuffers
辅助命令缓冲区(每个计算着色器一个)记录的;vkQueueSubmit()
将+vkQueueWaitIdle()
从不同的对象中分离出来std::thread
(每个计算着色器一个) - 每个命令缓冲区是单独分配的,VkCommandPool
并且正在使用 own 提交给自己VkQueue
,VkFence
主线程正在等待使用threads[0].join(); threads[1].join();
,依此类推;vkQueueSubmit()
与不同的分离 对象分开std::thread
(每个计算着色器一个) - 每个命令缓冲区是单独分配的,VkCommandPool
并且正在使用 own 提交给 ownVkQueue
,VkFence
主线程正在等待使用vkWaitForFences()
与hold 一起使用的pFences
栅栏,该栅栏在中使用vkQueueSubmit()
和与waitAll
holding一起使用true
。
我有什么:
在所有情况下,结果时间几乎相同(差异小于 1%),就好像调用vkQueueSubmit()
+ vkQueueWaitIdle()
for compute1
,然后 forcompute2
等等。
我想将相同的缓冲区绑定为多个着色器的输入,但根据时间,如果每个着色器都使用自己的VkBuffer
+VkDeviceMemory
对象执行,结果是相同的。
所以我的问题是:
是否有可能以某种方式同时执行多个计算着色器,或者命令缓冲区并行性仅适用于图形着色器?
更新:测试应用程序使用 LunarG Vulkan SDK 1.1.73.0 编译并在带有 NVIDIA GeForce GTX 960 的 Windows 10 上运行。