共有ヒープ

共有は、マルチプロセス アーキテクチャとマルチアダプター アーキテクチャに役立ちます。

共有の概要

共有ヒープにより次の 2 つのことが可能になります。1 つは、1 つ以上のプロセス間でヒープ内のデータを共有することです。もう 1 つは、ヒープ内に配置されているリソースに対して未定義のテクスチャ レイアウトが無作為に選択されないようにすることです。 アダプター間でヒープを共有することで、データの CPU マーシャリングも不要になります。

ヒープとコミット済みリソースの両方を共有できます。 コミット済みリソースを共有すると、コミット済みリソース記述とともに暗黙的なヒープが実際に共有され、互換性のあるリソース記述を別のデバイスからヒープにマップできるようになります。

すべてのメソッドがフリー スレッドであり、NT ハンドル共有設計の既存の D3D11 セマンティクスを継承します。

プロセス間でのヒープの共有

共有ヒープは、 D3D12_HEAP_FLAGS列挙型の D3D12_HEAP_FLAG_SHARED メンバーで指定されます。

共有ヒープは、CPU アクセス可能なヒープ (D3D12_HEAP_TYPE_UPLOAD、D3D12_HEAP_TYPE_READBACK、D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLEなしのD3D12_HEAP_TYPE_CUSTOM) ではサポートされていません。

未定義のテクスチャ レイアウトが無作為に選択されないようにすることで、一部の GPU で遅延レンダリング シナリオに悪影響を及ぼす可能性があります。このため、これは、配置済みリソースおよびコミット済みリソースの既定の動作ではありません。 一部の GPU アーキテクチャでは、遅延レンダリングに悪影響があります。これは、同じ形式およびサイズの複数のレンダー ターゲット テクスチャを同時にレンダリングするときに実現されるメモリ帯域幅の効率性が、確定的なテクスチャ レイアウトによって低下するためです。 GPU アーキテクチャは、無作為のテクスチャ レイアウトを活用することとは違う方向に発展しています。これは、遅延レンダリングに対して標準化されたスウィズル パターンと標準化されたレイアウトを効率的にサポートするためです。

共有ヒープには、その他にも次のような軽微なコストが伴います。

  • 共有ヒープ データは、情報漏えいの懸念があるため、インプロセス ヒープほど柔軟にリサイクルすることはできません。そのため、物理メモリはゼロになる頻度が高くなります。
  • 共有ヒープの作成時および破棄時に軽微な CPU オーバーヘッドが追加され、システム メモリの使用量が増加します。

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

アダプター間の共有ヒープは、 D3D12_HEAP_FLAGS列挙型の D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER メンバーで指定されます。

アダプター間の共有ヒープにより、複数のアダプターは、アダプター間でのデータの CPU マーシャリングなしでデータを共有できます。 各種のアダプター機能によって、アダプター間でデータをどの程度効率的に渡すことができるかが決まりますが、その一方で単に GPU コピーを有効にすることで、帯域幅の効率性を向上させることができます。 テクスチャ データの交換をサポートするために、アダプター間ヒープでは一部のテクスチャ レイアウトが許可されます (このようなテクスチャ レイアウトがサポートされていない場合でも許可されます)。 このようなテクスチャには、コピーしかサポートされないなど、特定の制限が適用される場合があります。

アダプター間共有は、ID3D12Device::CreateHeap を呼び出して作成したヒープで動作します。 その後、アプリケーションは CreatePlacedResource を使用してリソースを作成できます。 また、 CreateCommittedResource によって作成されたリソース/ヒープでも許可されますが、行メジャー D3D12_RESOURCE_DIMENSION_TEXTURE2D リソースに対してのみ許可されます ( D3D12_RESOURCE_DIMENSIONを参照してください)。 アダプター間共有は、CreateReservedResource では動作しません。

それでもアダプター間共有では、便利なキュー間リソース共有ルールがすべて適用されます。 アプリケーションは、2 つのアダプター間の適切な同期と一貫性を確保するために、適切なバリアを発行する必要があります。 アプリケーションでは、クロスアダプター フェンスを使用して、複数のアダプターに送信されるコマンド リストのスケジュールを調整する必要があります。 D3D API バージョン間でアダプター間リソースを共有するメカニズムはありません。 アダプター間共有リソースは、システム メモリでのみサポートされます。 アダプター間共有ヒープ/リソースは、D3D12_HEAP_TYPE_DEFAULT ヒープとD3D12_HEAP_TYPE_CUSTOM ヒープでサポートされます (L0 メモリ プールと書き込み結合 CPU ページ プロパティを使用)。 アダプター間共有ヒープに対する GPU の読み取り/書き込み操作が、システムのその他の GPU と一貫性を持つようにドライバーで保証する必要があります。 たとえば、ドライバーは、CPU がヒープ データに直接アクセスできないときに通常フラッシュする必要がない GPU キャッシュに存在するヒープ データを除外する必要がある場合があります。

アプリケーションでは、クロス アダプター ヒープの使用を、提供される機能を必要とするシナリオのみに限定する必要があります。 アダプター間ヒープは、 必ずしも GetCustomHeapProperties によって提案されるものではありませんD3D12_MEMORY_POOL_L0にあります。 このメモリ プールは、ディスクリート/NUMA アダプター アーキテクチャでは効率的ではありません。 また、最も効率的なテクスチャ レイアウトがいつも使用できるとは限りません。

また、次の制限事項が適用されます。

  • ヒープ層に関連するヒープ フラグはD3D12_HEAP_FLAG_ALLOW_ALL_BUFFERS_AND_TEXTURESする必要があります。
  • D3D12_HEAP_FLAG_SHAREDも設定する必要があります。
  • D3D12_HEAP_TYPE_DEFAULTを設定するか、D3D12_MEMORY_POOL_L0でD3D12_HEAP_TYPE_CUSTOMし、D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLEを設定する必要があります。
  • アダプター間ヒープに配置できるのは、D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTERを持つリソースのみです。
  • D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTERが指定されている場合、保護されたセッションをヒープの作成に渡すことはできません

複数のアダプターの使用の詳細については、「 マルチアダプター システム 」セクションを参照してください。