Vulkan队列的底层硬件映射

Underlying hardware mapping of Vulkan queues

Vulkan 旨在为用户提供精简和明确的信息,但队列是此规则的一个大例外:队列可能会被驱动程序多路复用,并且使用来自一个系列的多个队列是否会提高性能并不总是很明显。

在一次驱动程序更新后,我得到了 2 个仅传输队列,而不是一个,但我敢肯定,与仅使用其中一个队列相比,并行使用它们进行数据流传输没有任何好处他们(很高兴被证明是错误的)

那么为什么不直接说 "we have N separate hardware queues and if you want to use some of them in parallel, just mutex it yourself"?现在好像没办法知道,家庭队列到底有多独立

如今的 GPU 必须应对多处理世界。不同的程序可以访问相同的硬件,而 GPU 必须能够处理这个问题。因此,为单个实际硬件提供并行输入流与能够创建比实际 CPU 内核更多的 CPU 线程没有什么不同。

也就是说,一个队列从一个家庭可能不是"mutexing"访问实际的硬件。至少,不是以 CPU 的方式。如果来自一个系列的多个队列是在同一硬件上执行内容的不同路径,那么从这些多个队列填充硬件的方式可能发生在 GPU 级别。也就是说,它是一个实际的硬件功能。

并且您永远无法通过 "mutexing it yourself" 获得与该硬件功能相当的性能。例如:

I've got 2 transfer-only queues instead of one, but I'm pretty sure that there will be no benefit in using them in parallel for data streaming compared to just using one of them

让我们假设在该传输队列后面确实只有一个具有固定带宽的硬件 D​​MA 通道。这意味着,在任何时候,一次只能将一件事从 CPU 内存 DMA 到 GPU 内存。

现在,假设您有一些 DMA 工作要做。你想上传一堆东西。但是时不时地,您需要下载一些渲染产品。该下载需要尽快完成,因为您需要重新使用存储这些字节的图像。

使用优先队列,您可以为下载传输队列赋予比上传队列更高的优先级。如果硬件允许,那么它可以中断上传来执行下载,然后返回上传。

按照您的方式,您必须每隔一定时间一次上传一个项目。必须能够被可能的下载中断的过程。为此,您基本上必须有一个显示要执行的重复性任务,并提交 单个上传到传输队列。

将工作交给 GPU 并让它的优先级系统来处理会更有效率。即使没有优先级系统,它也可能会循环执行操作,在输入传输队列操作之间来回跳转,而不是等待一个队列 运行 干后再尝试另一个。

当然,这都是假设。您需要 do profiling work 以确保这些事情顺利进行。

族内队列的主要问题是它们有时代表具有自己专用资源的不同硬件,有时则不然。例如,AMD 的硬件提供两个传输队列,但它们实际上使用单独的 DMA 通道。当然,它们可能仍然共享相同的总带宽,但这不是一个队列必须等待另一个队列执行传输命令才能执行工作的简单情况。