マルチアダプター システム
複数のアダプターがインストールされているシステムに対する Direct3D 12 のサポートについて説明します。アプリケーションが複数の GPU アダプターを明示的にターゲットとするシナリオと、ドライバーがアプリケーションに代わって複数の GPU アダプターを暗黙的に使用するシナリオについて説明します。
マルチアダプタの概要
GPU アダプターは、Direct3D 12 をサポートする任意のメーカーの任意のアダプター (グラフィックスまたはコンピューティング、個別または統合) にすることができます。
複数のアダプターは "ノード" として キューなどの要素の数が各ノードに適用されるため、2 つのノードがある場合、既定の 3D キューが 2 つになります。 パイプラインの状態、ルート、コマンド署名などの他の要素は、図に示すように、1 つ以上のノードまたはすべてのノードを参照できます。
アダプター間でのヒープの共有
共有ヒープ のトピックを参照してください。
マルチアダプタAPIとノードマスク
以前の Direct3D API と同様に、リンクされたアダプターの各セットは、単一の IDXGIAdapter3 オブジェクトとして列挙されます。 リンク内のすべてのアダプターにアタッチされたすべての出力は、単一の IDXGIAdapter3 オブジェクトにアタッチされたのものとして列挙されます。
アプリケーションは、 ID3D12Device::GetNodeCount を呼び出すことによって、特定のデバイスに関連付けられている物理アダプターの数を確認できます。
Direct3D 12 の多くの API は、API 呼び出しが参照するノードのセットを示す ノード マスク (ビット マスク) を受け入れます。 各ノードにはゼロベースのインデックスがあります。 ただし、ノード マスクでは、ゼロはビット 1 に変換され、1 はビット 2 に変換されます。
単一ノード
次の (単一ノード) API を呼び出す場合、アプリケーションは API 呼び出しが関連付けられる単一のノードを指定します。 ほとんどの場合、これはノード マスクによって指定されます。 マスク内の各ビットは、単一ノードに対応します。 このセクションで説明するすべての API では、ノード マスクに 1 ビットだけ設定する必要があります。
- D3D12_COMMAND_QUEUE_DESC: NodeMask メンバーがあります。
- CreateCommandQueue: D3D12_COMMAND_QUEUE_DESC 構造からキューを作成します。
- CreateCommandList: 1 つの 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: 1 つの nodeMask パラメーターを取ります。
- D3D12_COMMAND_SIGNATURE_DESC: NodeMask メンバーがあります。
- CreateCommandSignature: D3D12_COMMAND_SIGNATURE_DESC 構造からコマンド署名オブジェクトを作成します。
リソース作成 API
次の API はノード マスクを参照します。
- D3D12_HEAP_PROPERTIES: CreationNodeMask と VisibleNodeMask の両方のメンバーを持ちます。
- GetResourceAllocationInfo: 1 つの visibleMask パラメーターを持ちます。
- GetCustomHeapProperties: 1 つの nodeMask パラメーターを持ちます。
予約済みリソースを作成する場合、ノード インデックスまたはマスクは指定されません。 予約済みリソースは、任意のノード上のヒープ上で (クロスノード共有の規則に従って) マップできます。
メソッド MakeResident はアダプタ キューで内部的に動作するため、アプリケーションでこれに対して何かを指定する必要はありません。
次の ID3D12Device API を呼び出す場合、API 呼び出しはすべてのノードに適用されるため、アプリケーションでは API 呼び出しが関連付けられるノードのセットを指定する必要はありません。
- CreateFence
- GetDescriptorHandleIncrementSize
- SetStablePowerState
- CheckFeatureSupport
- CreateSampler
- CopyDescriptors
- CopyDescriptorsSimple
- CreateSharedHandle
- OpenSharedHandleByName
- OpenSharedHandle: パラメーターとして 1 つの "フェンス" を持ちます。 パラメーターとして 1 つの "リソース" または 1 つの "ヒープ" を持つこのメソッドでは、以前に作成したオブジェクトからノード マスクが継承されるため、パラメーターとしてノードを受け入れません。
- CreateCommandAllocator
- CreateConstantBufferView
- CreateRenderTargetView
- CreateUnorderedAccessView
- CreateDepthStencilView
- CreateShaderResourceView