创建逻辑设备时,我们可以为一个系列队列索引指定多个队列,如 VkDeviceQueueCreateInfo 中所示,并且我们可以在 VkDeviceCreateInfo 中传递该结构体的数组。
因此,例如,创建传输队列和图形队列时,我的第一个线索是在设备创建时使用具有两个不同 VkDeviceQueueCreateInfo 的相同逻辑设备。
但是,我可以使用不同的 VkDeviceQueueCreateInfo 从同一物理设备创建两个逻辑设备(一个用于图形,一个用于传输)吗?
如果是,那么制定一种或另一种解决方案可能有什么好处或坏主意?
一般来说,在评估在 Vulkan 中执行操作的可能方法时,您应该选择看起来需要最少东西的方法。
在本例中,您尝试在多个队列和多个设备之间进行选择。嗯,多队列方法显然需要更少的东西;您拥有一台具有多个队列的设备(理论上),而不是具有多个队列的多台设备(每个设备一个)。队列数量相同,但设备数量更多。所以选那个少的。
Vulkan API 并不是试图诱骗您采取较慢的路径。如果使用多个设备且每个设备一个队列是最佳选择,那么 Vulkan 根本不会有多个队列作为选项。
为了更详细地说明,您说您想要在图形操作之外进行内存传输。好的。
物理设备不必提供多个队列。某些设备只提供一个队列族,可以从中VkQueue创建一个队列族。显然,如果设备允许多个队列,您应该使用它们。但如果它只允许一个,那么您可能有理由认为您应该创建多个设备并以这种方式工作。
即使在这种情况下,也不要这样做。
事情是这样的:如果 GPU实际上可以独立执行多个操作,从而使它们重叠……它们就会暴露多个队列。因此,物理设备不这样做的事实表明,在 GPU 级别独立执行不同的操作根本不可能。
这意味着,即使您使用多个设备,传输和图形操作几乎肯定会按某种顺序执行。也就是说,vkQueueSubmit最先发布的将是第一个完成其工作的。
因此,使用多个设备不会产生实际的 GPU 执行重叠(理论上)。您一无所获,并且失去了对这些操作发出顺序的明确控制。
现在,在图形队列上执行传输操作可能不会抑制在同一队列上执行渲染命令。也就是说,传输操作可以开始,然后渲染命令可以开始,同时传输通过 DMA 或其他方式完成。因此它们按顺序开始执行,但以任意顺序完成执行。
即使是这样,跨设备工作也不会给您带来任何优势。如前所述,您无法控制这些命令的提交顺序。图形命令往往会占用命令队列,而单个传输命令可以(在这样的系统上)被处理,然后在后台执行,同时处理不相关的命令。在这种情况下,在特定帧的图形命令之前发送任何传输命令非常重要。
如果您有两台设备,则必须进行 2 个vkQueueSubmit呼叫,而不是 1 个。而且vkQueueSubmit通话速度并不快。
不尝试多设备的东西还有很多其他原因。例如,如果稍后的渲染操作需要访问传输的数据,这意味着您需要外部内存和外部同步原语来同步设备之间的访问。等等。
| 归档时间: |
|
| 查看次数: |
1114 次 |
| 最近记录: |