Vulkan队列的底层硬件映射

Vulkan旨在精简和对用户明确显示,但是队列是此规则的一个大例外:队列可能由驱动程序进行多路复用,并且使用家族中的多个队列是否会改善性能并不总是显而易见的。

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

那么为什么不只说“我们有N个单独的硬件队列,如果要并行使用其中的一些,则自己将其静音”。现在看来,没有办法知道家庭中的独立队列到底有多大。

qq8719730 回答:Vulkan队列的底层硬件映射

如今,

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

也就是说,来自家庭的队列可能不会“互斥”访问实际硬件。至少不是以CPU方式。如果一个族的多个队列是在同一硬件上执行任务的不同路径,则从这些多个队列填充硬件的方式可能发生在GPU级别。也就是说,这是实际的硬件功能。

通过“自己互斥”,您将永远无法获得与该硬件功能相当的性能。例如:

  

我只有2个仅传输队列,而不是1个,但是我敢肯定,与仅使用其中一个相比,并行使用它们进行数据流传输没有任何好处

让我们假设在传输队列后面实际上只有一个固定带宽的硬件DMA通道。这意味着,一次只能从CPU内存到GPU内存进行DMA一件事情。

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

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

以这种方式,您必须定期上传一个项目。必须被可能的下载中断的过程。为此,您基本上必须要有一个重复执行的任务,才能执行并提交单个上传到传输队列。

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

但是,当然,这都是假设的。您需要do profiling work以确保这些事情顺利完成。

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

本文链接:https://www.f2er.com/3137573.html

大家都在问