gpt4 book ai didi

multithreading - 来自子 CPU 线程的 Vulkan Compute 调度

转载 作者:行者123 更新时间:2023-12-03 13:18:46 28 4
gpt4 key购买 nike

Vulkan Compute 可以从子 CPU 线程分派(dispatch),还是必须从主线程分派(dispatch)?我认为这不可能在 Unity 中从子线程调度计算着色器,我想知道它是否可以在虚幻引擎中完成。

最佳答案

这取决于您所说的"dispatch"和“主线程”是什么意思。
vkCmdDispatch ,正如“Cmd”前缀所暗示的那样,将命令放入命令缓冲区。这可以在任何线程上调用,只要 VkCommandBuffer对象不会有其他 vkCmd同时调用它的函数(通常,您为单个线程保留特定的命令缓冲区)。因此,根据一个定义,您可以从其他线程“分派(dispatch)”计算操作。

当然,在命令缓冲区中记录命令实际上并没有做任何事情。只有当您通过 vkQueueSubmit 将这些 CB 排队时,才会执行命令.点赞vkCmdDispatch ,在哪个线程上调用该函数并不重要。然而,像 vkCmdDispatch , 阻止多个线程访问同一个 VkQueue 确实很重要同时对象。

现在,您不必为 VkQueue 使用单个线程。 ;你可以锁定VkQueue在某种互斥体后面,因此一次只有一个线程可以拥有它。因此,创建 CB 的线程可以提交自己的工作。

但是,忽略任务通常需要按顺序插入队列的事实(一个任务可能会生成一些图形任务需要等待的计算数据,因此图形任务 CB 必须在计算 CB 之后),有一个更大的问题。 vkQueueSubmit花费很长时间。如果你看一下这个函数,它可以插入任意数量的 CB,并且它具有多个批处理的能力,每个批处理都由信号量和栅栏保护以进行同步。因此,强烈建议您尽量少做 vkQueueSubmit尽可能多地调用,因为每个调用都有一定数量的开销,这与您排队的 CB 数量无关。

规范本身甚至对此有警告。

因此,构建应用程序的典型方式是将任务分配给可用的 CPU 线程,然后这些任务构建命令缓冲区。一个特定的线程将被指定为队列的所有者。该线程可能会执行一些 CB 构建,但一旦完成,它将等待其他任务完成并从其他线程收集所有 CB。收集后,该线程将 vkQueueSubmit以适当的批处理进行。

您可以将该线程称为“主线程”,但 Vulkan 本身并不真正关心哪个线程“拥有”队列。它当然不必是您进程的初始线程。

关于multithreading - 来自子 CPU 线程的 Vulkan Compute 调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57432599/

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