多适配器系统

介绍 Direct3D 12 中对安装了多个适配器的系统的支持,涵盖应用程序显式面向多个 GPU 适配器的方案,以及驱动程序代表应用程序隐式使用多个 GPU 适配器的方案。

多适配器概述

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

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

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

跨适配器共享堆

请参阅 共享堆 主题。

多适配器 API 和节点掩码

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

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

Direct3D 12 中的许多 API 接受 节点掩码 (位掩码) ,这指示 API 调用引用的节点集。 每个节点都有一个从零开始的索引。 但在节点掩码中, 0 转换为位 1;1 转换为位 2;等等。

单个节点

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

多个节点

调用以下 (多个节点) API 时,应用程序将指定一组与 API 调用关联的节点。 将节点关联指定为节点掩码,可能设置了多个位。 如果应用程序为此位掩码传递 0,则 Direct3D 12 驱动程序会将它转换为位掩码 1 (指示对象与节点 0) 相关联。

资源创建 API

以下 API 引用节点掩码。

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

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

调用以下 ID3D12Device API 时,应用程序不需要指定 API 调用将与之关联的一组节点,因为 API 调用适用于所有节点。

Direct3D 12 编程指南