繁体   English   中英

在Vulkan中并行执行计算着色器?

[英]Parallel compute shaders execution in Vulkan?

我有几个计算着色器(我们称它们为compute1compute2等),它们具有多个输入绑定(在着色器代码中定义为layout (...) readonly buffer )和几个输出绑定(定义为layout (...) writeonly buffer )。 我将缓冲区与数据绑定到其描述符集,然后尝试并行执行这些着色器。


我试过的

  1. vkQueueSubmit()VkSubmitInfo.pCommandBuffers几个主要命令缓冲区(每个计算着色器一个);
  2. vkQueueSubmit()VkSubmitInfo.pCommandBuffers保持这是使用记录的一个主命令缓冲区vkCmdExecuteCommands()pCommandBuffers保持几个次要的命令缓冲区(每个计算着色器之一);
  3. 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(); 等等;
  4. 单独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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM