![](/img/trans.png)
[英]How to execute parallel compute shaders across multiple compute queues in Vulkan?
[英]Parallel compute shaders execution in Vulkan?
我有几个计算着色器(我们称它们为compute1
, compute2
等),它们具有多个输入绑定(在着色器代码中定义为layout (...) readonly buffer
)和几个输出绑定(定义为layout (...) writeonly buffer
)。 我将缓冲区与数据绑定到其描述符集,然后尝试并行执行这些着色器。
我试过的
vkQueueSubmit()
和VkSubmitInfo.pCommandBuffers
几个主要命令缓冲区(每个计算着色器一个); vkQueueSubmit()
与VkSubmitInfo.pCommandBuffers
保持这是使用记录的一个主命令缓冲区vkCmdExecuteCommands()
与pCommandBuffers
保持几个次要的命令缓冲区(每个计算着色器之一); vkQueueSubmit()
+ vkQueueWaitIdle()
与不同的std::thread
对象分开(每个计算着色器一个)-每个命令缓冲区都分配在单独的VkCommandPool
并通过自己的VkQueue
提交给自己的VkFence
,主线程正在使用threads[0].join(); threads[1].join();
等待threads[0].join(); threads[1].join();
threads[0].join(); threads[1].join();
等等; vkQueueSubmit()
从不同的已分离 std::thread
对象(每计算着色器之一) -每个命令缓冲区在单独分配VkCommandPool
并且被提交给自己VkQueue
与自己VkFence
,主线程使用等待vkWaitForFences()
与pFences
保持围栏那在vkQueueSubmit()
中使用的vkQueueSubmit()
,其中waitAll
保持true
。 我所拥有的:
在所有情况下,结果时间几乎都是相同的(差异小于1%),就好像是为compute1
然后为compute2
调用vkQueueSubmit()
+ vkQueueWaitIdle()
compute1
。
我想将相同的缓冲区绑定为多个着色器的输入,但是根据时间,如果每个着色器都使用自己的VkBuffer
+ VkDeviceMemory
对象执行,则结果是相同的。
所以我的问题是 :
是否可以以某种方式同时执行多个计算着色器,或者命令缓冲区并行性仅适用于图形着色器?
更新:测试应用程序是使用LunarG Vulkan SDK 1.1.73.0编译的,并在Windows 10和NVIDIA GeForce GTX 960上运行。
这取决于您要在其上执行应用程序的硬件。 硬件导出队列处理已提交的命令。 顾名思义,每个队列依次执行命令。 因此,如果将多个命令缓冲区提交到单个队列,则将按提交顺序执行它们。 在内部,GPU可以尝试并行执行所提交命令的某些部分(例如可以同时处理图形流水线的各个部分)。 但是通常,单个队列按顺序处理命令,无论您提交图形还是计算命令都没有关系。
为了并行执行多个命令缓冲区,您需要将它们提交到单独的队列中。 但是硬件必须支持多个队列-它必须具有单独的物理队列,以便能够同时处理它们。
但是,更重要的是-我读过一些图形硬件供应商通过图形驱动程序模拟了多个队列。 换句话说-它们在Vulkan中公开了多个队列,但是在内部它们是由一个物理队列处理的,我认为您的问题就是这种情况,您的实验结果可以证实这一点(尽管我不确定,当然)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.