如何在Vulkan中实现多GPU编程?

22

在Vulkan中使用多个GPU,是否类似于创建多个命令队列,然后在它们之间分配命令缓冲区?

存在两个问题:

  1. 在OpenGL中,我们使用GLEW获取函数。在有多个GPU的情况下,每个GPU都有自己的驱动程序。我们该如何在Vulkan中处理?
  2. 部分帧是否由一个GPU生成,并且其他GPU(例如在笔记本电脑上)用于渲染UI和AMD或Nvidia GPU用于渲染游戏屏幕?还是一帧由一个GPU生成,下一帧由另一个GPU生成?
3个回答

31

现在已经有了Vulkan,下面的信息已经更新。

有两种多GPU设置:一种是多个GPU属于某种SLI风格的设置,另一种是不属于SLI风格的设置。Vulkan支持这两种设置,并且可以在同一台计算机上支持它们。也就是说,你可以拥有两个被SLI连接在一起的NVIDIA GPU,以及Intel嵌入式GPU,而Vulkan可以与它们全部交互。

非SLI设置

在Vulkan中,有一个称为Vulkan实例的东西。它代表了基本的Vulkan系统;各个设备向实例注册自己。Vulkan实例系统实际上是由Vulkan SDK实现的。

物理设备代表实现与GPU接口的特定硬件。每个显示Vulkan实现的硬件通过向实例系统注册其物理设备来实现。您可以查询哪些物理设备可用,以及有关它们的一些基本属性(它们的名称、提供的内存量等)。

然后您为使用的物理设备创建逻辑设备。逻辑设备是您在Vulkan中实际执行操作的方式。它们具有队列、命令缓冲区等,并且每个逻辑设备是单独的...大多数情况下。

现在,您可以绕过整个“实例”事物并手动加载设备。但是你真的不应该这么做。至少,在开发结束之前不应该这样做。Vulkan层对于日常调试来说太关键了,不能随便退出。

Vulkan 1.1中有一些机制,允许各个设备能够向其他设备通信一些信息。在1.1版中,只有某些类型的信息可以跨物理设备共享(即fences和semaphores,而且仅通过sync文件在Linux上)。虽然这些API可以提供一个在两个物理设备间共享数据的机制,但目前大多数形式的数据共享限制是,两个物理设备必须具有匹配的UUIDs(因此是相同的物理设备)。

SLI设置

处理SLI使用了两个Vulkan 1.0扩展:KHR_device_groupKHR_device_group_creation。前者用于处理Vulkan中的“设备组”,而后者是一个实例扩展,用于创建设备组。这两个扩展都是Vulkan 1.1的核心功能。

这个想法是将SLI聚合作为单个VkDevice公开,它由许多VkPhysicalDevice创建。每个内部物理设备都是一个“子设备”。您可以查询子设备及其某些属性。内存分配特定于某个子设备。资源对象(缓冲区和图像)不特定于子设备,但它们可以与不同子设备上的不同内存分配相关联。

命令缓冲区和队列不特定于子设备;当您在队列上执行CB时,驱动程序会确定它将在哪些子设备上运行,并填充那些映像/缓冲区使用适当GPU指针的描述符,这些映像/缓冲区已绑定到那些特定的子设备上的内存。

交替帧渲染只是简单地在一个帧上呈现从一个子设备生成的图像,然后在另一个帧上呈现来自另一个子设备的图像。分割帧渲染由一种更复杂的机制处理,其中您定义了用于呈现命令的目标图像的内存将分配给哪些设备。您甚至可以使用可呈现的图像完成此操作。


4
+1 - 我能问一下你去了哪里吗?我们一直想念你。话虽如此,希望你不介意我在我的服务器上镜像了你的OpenGL教程,因为你的域名已经停止运营了一段时间。 - datenwolf
我应该在发布之后问一下,但你似乎有一些信息。确认后,我会选择它。 - Egy Prot
@NicolBolas 在Vulkan 1.1中,有一些机制是允许单个设备与其他设备进行通信的核心机制。 - 哪些机制/扩展支持这样做呢?据我所知,例如共享同步原语或内存(通过导出到/导入自外部资源)只能在从同一物理设备创建的逻辑设备之间完成。 - Ekzuzy
@Ekzuzy: 已更新。 - Nicol Bolas

6
  1. 在 Vulkan 中,您需要枚举设备并选择要使用的设备。您可以尝试分别使用两个不同的设备进行工作,没有任何阻止。每个 Vulkan 调用都需要至少一个上下文参数。加载程序层将把调用转发到正确的驱动程序。或者您可以单独为每个设备加载函数以避免加载程序的跳板。

  2. 生成的帧需要转发到连接到屏幕的卡上进行显示。因此,更有可能是1个 GPU 负责图形处理,其他 GPU 用于物理计算。

    每次只能将单个设备连接到特定表面,因此该设备需要获取渲染帧并将其复制到可渲染的图像中,然后推送到屏幕上。


你们在(1)中使用的事实陈述和术语,是否都在Khronos和Khronos成员公司公开发布的文件中得到了披露?请注意,我并不是在说它们没有得到过披露。我很兴奋地标记着公共信息的扩展前沿。SIGGRAPH可能会看到这一步向外迈进。 - ahcox
@ahcox第1点在今年早些时候的演示中已经明确说明了。第2点(就像所有与显示器的接口一样)是推测。 - ratchet freak
1
ahcox 这也是 Mantle 中的做法,虽然它并不是 Vulkan 规范的代表,但这是 Vulkan(和 DX12)使用的基本形式。 - Robinson
我发现了关于Directx 12的http://wccftech.com/directx-12-multiadapter-technology-discrete-integrated-gpus-work-coherently-demo-shows-big-performance-gains/。 - Egy Prot

0

设备组是一个不错的选择。请查看Vulkan规范以获取文档。Vulkan处理到其他GPU的所有分派(当它们通过sli / crossfire连接时)。你需要做的就是告诉vulkan如何分配(例如,在一个GPU上分配一帧,然后在另一个GPU上分配下一帧)。如果您需要进行计算工作,则需要单独地处理每个GPU。请参考以下链接:https://www.ea.com/seed/news/khronos-munich-2018-halcyon-vulkan


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接