在Vulkan中使用多GPU会不会像制作许多命令队列那样在它们之间划分命令缓冲区?
有两个问题:
答案 0 :(得分:22)
更新了最近的信息,现在存在Vulkan。
有两种类型的多GPU设置:多个GPU是某些SLI风格设置的一部分,而它们不是那种类型。 Vulkan支持两者,并在同一台计算机上支持它们。也就是说,你可以将两个同时进行SLI的NVIDIA GPU和英特尔嵌入式GPU以及Vulkan可以与它们进行交互。
在Vulkan中,有一种称为Vulkan实例的东西。这代表了基础Vulkan系统本身;各个设备将自己注册到实例。 Vulkan实例系统基本上由Vulkan SDK实现。
物理设备代表实现GPU接口的特定硬件。暴露Vulkan实现的每个硬件都通过向实例系统注册其物理设备来实现。您可以查询哪些物理设备可用,以及它们的一些基本属性(它们的名称,它们提供的内存量等)。
然后,为您使用的物理设备创建逻辑设备。逻辑设备是你在Vulkan中实际做事的方式。它们有队列,命令缓冲区等。每个逻辑设备都是独立的......主要是。
现在,您可以绕过整个“实例”并手动加载设备。但你真的不应该。至少,除非你处于发展的最后阶段。 Vulkan层对于日常调试来说太过关键,只能选择退出。
Vulkan 1.1中有一些机制,允许单个设备能够将某些信息传递给其他设备。在1.1中,只有某些类型的信息可以在物理设备之间共享(即,围栏和信号量,即便如此,仅在Linux上通过同步文件)。虽然这些API可以提供在两个物理设备之间共享数据的机制,但是目前,对大多数形式的数据共享的限制是两个物理设备必须具有匹配的UUID(因此是相同的物理设备)。
两个Vulkan 1.0扩展程序涵盖了处理SLI:KHR_device_group
和KHR_device_group_creation
。前者用于处理Vulkan中的“设备组”,而后者是用于创建设备分组设备的实例扩展。这两个都是Vulkan 1.1的核心。
这个想法是SLI聚合作为单个VkDevice
公开,它是从许多VkPhysicalDevice
创建的。每个内部物理设备都是“子设备”。您可以查询子设备及其中的一些属性。内存分配特定于特定子设备。资源对象(缓冲区和图像)不特定于子设备,但它们可以与不同子设备上的不同的内存分配相关联。
命令缓冲区和队列不是特定于子设备的;当您在队列上执行CB时,驱动程序会确定它将运行哪个子设备,并使用适当的GPU指针填充使用图像/缓冲区的描述符,以获取这些图像/缓冲区所具有的内存被绑定在那些特定的子设备上。
交替帧渲染只是在一帧上呈现从一个子设备生成的图像,然后在另一帧上呈现来自不同子设备的图像。拆分帧渲染由更复杂的机制处理,您可以在其中定义要在设备之间拆分的渲染命令的目标图像的内存。你甚至可以用可呈现的图像来做到这一点。
答案 1 :(得分:6)
在vulkan中,您需要枚举设备并选择要使用的设备。没有什么可以阻止你分别尝试使用2个不同的。每个vulkan调用至少需要1个参数作为上下文。然后,加载程序层将调用转发给正确的驱动程序。或者你可以分别加载每个设备的功能,以避免加载器的蹦床。
生成的帧需要转发到连接到屏幕以显示的卡。因此,1 GPU更可能负责图形,而其他GPU则用于物理。
一次只能将一个设备连接到特定表面,以便设备需要获取渲染帧以将其复制到可渲染到屏幕的可渲染图像中。
答案 2 :(得分:0)
要使用设备组。查看vulkan规范以获取文档。 Vulkan处理所有其他GPU的调度(当它们通过sli / crossfire连接时)。您需要做的就是告诉vulkan分派如何完成(例如,在GPU上分派一帧,在另一帧上分派另一帧)。如果需要进行计算工作,则需要分别处理每个GPU。请找到链接以供参考:https://www.ea.com/seed/news/khronos-munich-2018-halcyon-vulkan