Vulkan 多个逻辑设备来自一个物理设备的后果
Vulkan multiple logical device from one physical device consequences
当创建一个逻辑设备时,我们可以在VkDeviceQueueCreateInfo中看到一个family queue index指定多个队列,我们可以在VkDeviceCreateInfo中传递一个这个结构的数组。
所以我的第一个线索,例如,创建一个传输队列和一个图形队列,是在创建设备时使用具有两个不同 VkDeviceQueueCreateInfo 的相同逻辑设备。
但是,我可以使用不同的 VkDeviceQueueCreateInfo 从同一个物理设备创建两个逻辑设备(一个用于图形,一个用于传输)吗?
如果是,那么制定一个或另一个解决方案的好处或坏主意是什么?
一般来说,在评估在 Vulkan 中做事的可能方式时,您应该选择似乎需要最少东西的方式。
在这种情况下,您正试图 select 在多个队列和多个设备之间。好吧,多队列方法显然需要更少的东西;你有一个设备有很多队列(理论上),而不是许多设备有很多队列(每个设备一个)。队列数量相同,但设备更多。所以挑一个少的。
Vulkan API 并不是要 欺骗您 走慢路。如果使用多个设备每个设备一个队列是最好的选择,那么 Vulkan 根本不会有多个队列作为一个选项。
更详细地说,你说你想在图形操作之外进行内存传输。好的,好的。
物理设备不必提供多个队列。有些设备只提供一个队列系列,可以从中创建一个 VkQueue
。显然,如果一个设备允许多个队列,你应该使用它们。但如果它只允许一个,那么您可能有理由认为您应该创建多个设备并以这种方式工作。
即使在这种情况下,也不要这样做。
事情是这样的:如果 GPU 可以实际上 独立地执行多个操作以便它们重叠...它们会暴露多个队列.因此,物理设备不这样做的事实表明,在 GPU 级别独立执行不同的操作是不可能的。
这意味着,即使您使用多个设备,传输和图形操作几乎肯定会按某种顺序执行。也就是说,先发出 vkQueueSubmit
的那个将首先执行它的工作。
因此,使用多个设备不会给您带来实际的 GPU 执行重叠(理论上)。您一无所获,并且失去了对发出这些操作的顺序的明确控制。
现在,在图形队列上执行传输操作可能不会抑制在同一队列上执行渲染命令。也就是说,可以开始传输操作,然后可以启动渲染命令,同时通过 DMA 或其他方式完成传输。所以他们按顺序开始执行,但按任意顺序执行结束。
即使是这样,跨设备工作也不会给您带来任何优势。如前所述,您无法控制这些命令的提交顺序。图形命令往往会占用命令队列,而单个传输命令可以(在这样的系统上)被处理,然后在后台执行,同时处理不相关的命令。在这种情况下,重要的是发送任何传输命令 在 特定帧的图形命令之前。
如果您有两台设备,则必须进行 2 次 vkQueueSubmit
调用,而不是一次调用。 vkQueueSubmit
调用并不以速度快着称。
还有许多其他原因不为此尝试多设备。例如,如果以后的渲染操作需要访问传输的数据,这意味着您需要外部存储器 和 外部同步原语来同步设备之间的访问。等等。
当创建一个逻辑设备时,我们可以在VkDeviceQueueCreateInfo中看到一个family queue index指定多个队列,我们可以在VkDeviceCreateInfo中传递一个这个结构的数组。
所以我的第一个线索,例如,创建一个传输队列和一个图形队列,是在创建设备时使用具有两个不同 VkDeviceQueueCreateInfo 的相同逻辑设备。
但是,我可以使用不同的 VkDeviceQueueCreateInfo 从同一个物理设备创建两个逻辑设备(一个用于图形,一个用于传输)吗?
如果是,那么制定一个或另一个解决方案的好处或坏主意是什么?
一般来说,在评估在 Vulkan 中做事的可能方式时,您应该选择似乎需要最少东西的方式。
在这种情况下,您正试图 select 在多个队列和多个设备之间。好吧,多队列方法显然需要更少的东西;你有一个设备有很多队列(理论上),而不是许多设备有很多队列(每个设备一个)。队列数量相同,但设备更多。所以挑一个少的。
Vulkan API 并不是要 欺骗您 走慢路。如果使用多个设备每个设备一个队列是最好的选择,那么 Vulkan 根本不会有多个队列作为一个选项。
更详细地说,你说你想在图形操作之外进行内存传输。好的,好的。
物理设备不必提供多个队列。有些设备只提供一个队列系列,可以从中创建一个 VkQueue
。显然,如果一个设备允许多个队列,你应该使用它们。但如果它只允许一个,那么您可能有理由认为您应该创建多个设备并以这种方式工作。
即使在这种情况下,也不要这样做。
事情是这样的:如果 GPU 可以实际上 独立地执行多个操作以便它们重叠...它们会暴露多个队列.因此,物理设备不这样做的事实表明,在 GPU 级别独立执行不同的操作是不可能的。
这意味着,即使您使用多个设备,传输和图形操作几乎肯定会按某种顺序执行。也就是说,先发出 vkQueueSubmit
的那个将首先执行它的工作。
因此,使用多个设备不会给您带来实际的 GPU 执行重叠(理论上)。您一无所获,并且失去了对发出这些操作的顺序的明确控制。
现在,在图形队列上执行传输操作可能不会抑制在同一队列上执行渲染命令。也就是说,可以开始传输操作,然后可以启动渲染命令,同时通过 DMA 或其他方式完成传输。所以他们按顺序开始执行,但按任意顺序执行结束。
即使是这样,跨设备工作也不会给您带来任何优势。如前所述,您无法控制这些命令的提交顺序。图形命令往往会占用命令队列,而单个传输命令可以(在这样的系统上)被处理,然后在后台执行,同时处理不相关的命令。在这种情况下,重要的是发送任何传输命令 在 特定帧的图形命令之前。
如果您有两台设备,则必须进行 2 次 vkQueueSubmit
调用,而不是一次调用。 vkQueueSubmit
调用并不以速度快着称。
还有许多其他原因不为此尝试多设备。例如,如果以后的渲染操作需要访问传输的数据,这意味着您需要外部存储器 和 外部同步原语来同步设备之间的访问。等等。