gpt4 book ai didi

c++ - Vulkan 中的并行计算着色器执行?

转载 作者:行者123 更新时间:2023-11-28 04:37:44 24 4
gpt4 key购买 nike

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


我尝试过的:

  1. vkQueueSubmit()VkSubmitInfo.pCommandBuffers持有几个主要命令缓冲区(每个计算着色器一个);
  2. vkQueueSubmit()VkSubmitInfo.pCommandBuffers持有一个使用 vkCmdExecuteCommands() 记录的主命令缓冲区与 pCommandBuffers持有多个辅助命令缓冲区(每个计算着色器一个);
  3. 分开vkQueueSubmit() + vkQueueWaitIdle()来自不同std::thread对象(每个计算着色器一个)- 每个命令缓冲区都分配在单独的 VkCommandPool 中并提交给自己 VkQueue用自己的VkFence ,主线程正在等待使用 threads[0].join(); threads[1].join();等等;
  4. 分开vkQueueSubmit()来自不同的分离 std::thread对象(每个计算着色器一个)- 每个命令缓冲区都分配在单独的 VkCommandPool 中并提交给自己 VkQueue用自己的VkFence ,主线程正在等待使用 vkWaitForFences()pFencesvkQueueSubmit()中使用的栅栏和 waitAll控股true .

我得到的:

在所有情况下,结果时间几乎相同(差异小于 1%),就像调用 vkQueueSubmit() 一样+ vkQueueWaitIdle()对于 compute1 , 然后为 compute2等等。

我想为多个着色器绑定(bind)相同的缓冲区作为输入,但根据时间,如果每个着色器都使用自己的 VkBuffer 执行,结果是相同的+ VkDeviceMemory对象。


所以我的问题是:

是否有可能以某种方式同时执行多个计算着色器,或者命令缓冲区并行性仅适用于图形着色器?


更新:测试应用程序是使用 LunarG Vulkan SDK 1.1.73.0 编译的,并在配备 NVIDIA GeForce GTX 960 的 Windows 10 上运行。

最佳答案

这取决于您执行应用程序的硬件。硬件导出处理提交命令的队列。每个队列,顾名思义,按顺序执行命令,一个接一个。因此,如果您将多个命令缓冲区提交到单个队列,它们将按照提交顺序执行。在内部,GPU 可以尝试并行执行所提交命令的某些部分(例如可以同时处理图形管道的不同部分)。但一般来说,单个队列按顺序处理命令,无论您是提交图形还是计算命令都没有关系。

为了并行执行多个命令缓冲区,您需要将它们提交到单独的队列中。但是硬件必须支持多个队列 - 它必须具有独立的物理队列,以便能够同时处理它们。

但是,更重要的是 - 我了解到一些图形硬件供应商通过图形驱动程序模拟多个队列。换句话说 - 它们在 Vulkan 中公开了多个队列,但在内部它们由单个物理队列处理,我认为你的问题就是这种情况,你的实验结果会证实这一点(当然我不能确定).

关于c++ - Vulkan 中的并行计算着色器执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50927408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com