Vulkan:队列如何支持不同的功能? / VkQueue 实现

Vulkan : How could queues support different features? / VkQueue implementation

在我的理解中,VkPhysicalDevice 代表了 Vulkan 的一种实现,它可以表示为 GPU 及其驱动程序。 我们应该使用 VkCommandBuffers 记录命令,并通过队列将它们发送到潜在的多线程我们发送到 gpu 的工作。 这就是为什么我理解可以有多个队列的事实。 我也了解 QueueFamilies 根据队列可以执行的功能(它们可用的扩展,例如演示,以及图形计算、传输等)对队列进行分组。

但是,如果 GPU 能够执行图形工作,为什么有些队列不能这样做? 我听说使用功能较少的队列可能会更快,但为什么呢? 具体什么是队列? 它只与 vulkan 实施有关吗?还是与硬件相关?

我只是不明白为什么存在具有不同特性的队列,甚至在通过 Vulkan 文档、Whosebug、vulkan-tutorial 和 vkguide 进行搜索后,我唯一找到的是“Vulkan 中的队列是一个”执行端口“用于 GPU。”,我不太了解,而且我在 google.

上找不到任何内容

提前感谢您的帮助!

队列是一种消费和执行命令的东西,因此每个队列(理论上)都与其他队列分开执行。你可以把队列想象成一张嘴,把命令想象成食物。

队列系列中的队列通常使用相同的底层硬件执行命令来处理它们。这就像一个有多个嘴巴的生物,但它们都连接到同一个消化道。他们能吃多少食物与他们能消化的食物量是分开的。一张嘴吃的食物可能要等待另一张嘴吃过的食物通过消化道。

来自不同系列的队列可能(或可能不)具有不同的底层执行硬件。这就像一个有多个嘴巴和多个消化道的生物。如果一张嘴在吃,那份食物就不需要等待另一张嘴的食物来消化。

当然,不同的底层执行硬件通常是不同的,这是有原因的。几个 GPU 有专门的 DMA 硬件来复制 to/from device-local 内存。此类硬件通常会公开一个仅允许传输操作的队列系列,与在 graphics-capable 队列上完成的传输相比,这些传输操作的字节对齐可能会受到限制。

请注意,这些是一般规则。有时一个系列中的队列确实在不同的硬件上执行,有时系列之间的队列使用大部分相同的硬件。 API 和实现并不总能说明这一点,因此您可能需要对不同的情况进行基准测试。