多适配器系统
介绍 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,必须在节点掩码中只设置一位。
- D3D12_COMMAND_QUEUE_DESC:具有 NodeMask 成员。
- CreateCommandQueue:基于 D3D12_COMMAND_QUEUE_DESC 结构创建一个队列
- CreateCommandList:采用 nodeMask 参数。
- D3D12_DESCRIPTOR_HEAP_DESC:具有 NodeMask 成员。
- CreateDescriptorHeap:基于 D3D12_DESCRIPTOR_HEAP_DESC 结构创建描述符堆
- D3D12_QUERY_HEAP_DESC:具有 NodeMask 成员。
- CreateQueryHeap:基于 D3D12_QUERY_HEAP_DESC 结构创建一个查询堆。
多个节点
在调用以下(多节点)API 时,应用程序将指定与 API 调用相关联的一系列节点。 可以将节点关联指定为节点掩码,并可能设置多个位。 如果应用程序为该位掩码传入 0,那么 Direct3D 12 驱动程序会将其转换为位掩码 1(表示对象与节点 0 相关联)。
- D3D12_CROSS_NODE_SHARING_TIER:确定对跨节点共享的支持。
- D3D12_FEATURE_DATA_D3D12_OPTIONS:引用 D3D12_CROSS_NODE_SHARING_TIER 的结构。
- D3D12_FEATURE_DATA_ARCHITECTURE:包含 NodeIndex 成员。
- D3D12_GRAPHICS_PIPELINE_STATE_DESC:具有 NodeMask 成员。
- CreateGraphicsPipelineState:基于 D3D12_GRAPHICS_PIPELINE_STATE_DESC 结构创建图形管道状态对象。
- D3D12_COMPUTE_PIPELINE_STATE_DESC:具有 NodeMask 成员。
- CreateComputePipelineState:基于 D3D12_COMPUTE_PIPELINE_STATE_DESC 结构创建计算管道状态对象。
- CreateRootSignature:采用 nodeMask 参数。
- D3D12_COMMAND_SIGNATURE_DESC:具有 NodeMask 成员。
- CreateCommandSignature:基于 D3D12_COMMAND_SIGNATURE_DESC 结构创建命令签名对象。
资源创建 API
以下 API 引用节点掩码。
- D3D12_HEAP_PROPERTIES:同时具有 CreationNodeMask 和 VisibleNodeMask 成员。
- GetResourceAllocationInfo:具有 visibleMask 参数。
- GetCustomHeapProperties:具有 nodeMask 参数。
创建保留资源时,未指定节点索引或掩码。 可将保留资源映射到任何节点的堆上(遵循跨节点共享规则)。
方法 MakeResident 在内部与适配器队列一起工作,应用程序无需为此指定任何内容。
在调用以下 ID3D12Device API 时,应用程序无需指定 API 调用将关联的节点集,因为 API 调用适用于所有节点。
- CreateFence
- GetDescriptorHandleIncrementSize
- SetStablePowerState
- CheckFeatureSupport
- CreateSampler
- CopyDescriptors
- CopyDescriptorsSimple
- CreateSharedHandle
- OpenSharedHandleByName
- OpenSharedHandle:使用“围栏”作为参数 使用“资源”或“堆”作为参数时,此方法不接受节点作为参数,因为节点掩码继承自先前创建的对象。
- CreateCommandAllocator
- CreateConstantBufferView
- CreateRenderTargetView
- CreateUnorderedAccessView
- CreateDepthStencilView
- CreateShaderResourceView