マルチアダプター システム

複数のアダプターがインストールされているシステムのDirect3D 12のサポートについて説明します。アプリケーションが複数の GPU アダプターを明示的に対象とするシナリオと、ドライバーがアプリケーションの代わりに複数の GPU アダプターを暗黙的に使用するシナリオについて説明します。

マルチアダプターの概要

GPU アダプターには、Direct3D 12をサポートする任意の製造元の任意のアダプター (グラフィックスまたはコンピューティング、ディスクリートまたは統合) を使用できます。

複数のアダプターが ノードとして参照されます。 キューなどの要素の数が各ノードに適用されるため、2 つのノードがある場合、既定の 3D キューが 2 つになります。 パイプラインの状態やルート署名、コマンド署名などの他の要素は、図に示すように、1 つ以上またはすべてのノードを参照できます。

各グラフィックス アダプターに適用されるキュー

アダプター間でのヒープの共有

「共有ヒープ」トピックを参照してください。

マルチアダプター API とノード マスク

以前の Direct3D API と同様に、リンクされたアダプターの各セットは 1 つの IDXGIAdapter3 オブジェクトとして列挙されます。 リンク内のすべてのアダプターにアタッチされたすべての出力は、単一の IDXGIAdapter3 オブジェクトにアタッチされたのものとして列挙されます。

アプリケーションは、 ID3D12Device::GetNodeCount を呼び出すことによって、特定のデバイスに関連付けられている物理アダプターの数を決定できます。

Direct3D 12の多くの API は、ノード マスク (ビット マスク) を受け入れます。これは、API 呼び出しが参照するノードのセットを示します。 各ノードには、0 から始まるインデックスがあります。 ただし、ノード マスクでは、0 はビット 1 に変換されます。1 はビット 2 に変換されます。などなど。

単一ノード

次の (単一ノード) API を呼び出すとき、アプリケーションは API 呼び出しが関連付けられる単一のノードを指定します。 ほとんどの場合、これはノード マスクによって指定されます。 マスク内の各ビットは、単一ノードに対応します。 このセクションで説明するすべての API では、ノード マスクに 1 ビットを設定する必要があります。

複数のノード

次の (複数のノード) API を呼び出すとき、アプリケーションは API 呼び出しを関連付けるノードのセットを指定します。 ノード アフィニティはノード マスクとして指定します。複数のビットが設定されている可能性があります。 アプリケーションがこのビット マスクに対して 0 を渡した場合、Direct3D 12 ドライバーはその値をビット マスク 1 に変換します (オブジェクトがノード 0 に関連付けられていることを示します)。

リソース作成 API

次の API はノード マスクを参照します。

予約済みリソースを作成する場合、ノード インデックスまたはマスクは指定されません。 予約済みリソースは、任意のノード上のヒープ上で (クロスノード共有の規則に従って) マップできます。

MakeResident メソッドはアダプター キューで内部的に動作します。アプリケーションでこれを指定する必要はありません。

次の ID3D12Device API を呼び出すとき、API 呼び出しがすべてのノードに適用されるため、API 呼び出しが関連付けられるノードのセットをアプリケーションで指定する必要はありません。

Direct3D 12 プログラミング ガイド