多适配器系统

介绍 Direct3D 12 对已安装多个适配器的系统的支持,包括应用程序明确使用多个 GPU 适配器的情况,以及驱动程序代表应用程序隐式使用多个 GPU 适配器的情况。

多适配器概述

GPU 适配器可以是任何制造商生产的任何支持 Direct3D 12 的适配器(图形或计算、独立或集成)。

多个适配器在 API 中被引用 许多元素(如队列)适用于每个节点,因此如果有两个节点,则会有两个默认的 3D 队列。 如图所示,管道状态、根节点和命令签名等其他元素可以指向一个或多个节点,也可以指向所有节点。

队列应用于每个图形适配器

在适配器之间共享堆

请参阅共享堆主题。

多适配器 API 和节点掩码

与以前的 Direct3D API 类似,每组链接适配器都被枚举为一个 IDXGIAdapter3 对象。 附加到链接中任何适配器的所有输出都枚举为附加到单个 IDXGIAdapter3 对象

应用程序可以通过调用 ID3D12Device::GetNodeCount 来确定与给定设备关联的物理适配器数量。

Direct3D 12 中的许多 API 都接受节点掩码(位掩码),它表示 API 调用所指向的节点集。 每个节点都有一个从 0 开始的索引。 但在节点掩码中,0 表示第 1 位;1 表示第 2 位;以此类推。

单个节点

在调用以下(单节点)API 时,应用程序将指定与 API 调用相关联的单个节点。 大多数情况下,这是由节点掩码指定的。 掩码中的每个位都对应一个节点。 对于本部分介绍的所有 API,必须在节点掩码中只设置一位。

多个节点

在调用以下(多节点)API 时,应用程序将指定与 API 调用相关联的一系列节点。 可以将节点关联指定为节点掩码,并可能设置多个位。 如果应用程序为该位掩码传入 0,那么 Direct3D 12 驱动程序会将其转换为位掩码 1(表示对象与节点 0 相关联)。

资源创建 API

以下 API 引用节点掩码。

创建保留资源时,未指定节点索引或掩码。 可将保留资源映射到任何节点的堆上(遵循跨节点共享规则)。

方法 MakeResident 在内部与适配器队列一起工作,应用程序无需为此指定任何内容。

在调用以下 ID3D12Device API 时,应用程序无需指定 API 调用将关联的节点集,因为 API 调用适用于所有节点。

Direct3D 12 编程指南