共有ヒープ
共有は、マルチプロセス アーキテクチャとマルチアダプター アーキテクチャに役立ちます。
共有の概要
共有ヒープにより次の 2 つのことが可能になります。1 つは、1 つ以上のプロセス間でヒープ内のデータを共有することです。もう 1 つは、ヒープ内に配置されているリソースに対して未定義のテクスチャ レイアウトが無作為に選択されないようにすることです。 アダプター間でヒープを共有することで、データの CPU マーシャリングも不要になります。
ヒープとコミット済みリソースの両方を共有できます。 コミット済みリソースを共有すると、コミット済みリソース記述とともに暗黙的なヒープが実際に共有され、互換性のあるリソース記述を別のデバイスからヒープにマップできるようになります。
すべてのメソッドがフリー スレッドであり、NT ハンドル共有設計の既存の D3D11 セマンティクスを継承します。
- ID3D12Device::CreateSharedHandle
- ID3D12Device::OpenSharedHandle
- ID3D12Device::OpenSharedHandleByName
プロセス間でのヒープの共有
共有ヒープは、 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 キャッシュにヒープ データが存在しないよう、ドライバーでヒープ データを除外する必要がある場合があります。
アプリケーションでは、クロス アダプター ヒープの使用を、それらが提供する機能を必要とするシナリオのみに限定する必要があります。 クロスアダプター ヒープは D3D12_MEMORY_POOL_L0 に配置されますが、これは必ずしも GetCustomHeapProperties が示唆するとおりではありません。 このメモリ プールは、ディスクリート/NUMA アダプター アーキテクチャでは効率的ではありません。 また、最も効率的なテクスチャ レイアウトがいつも使用できるとは限りません。
また、次の制限事項が適用されます。
- ヒープ層に関連するヒープ フラグは、D3D12_HEAP_FLAG_ALLOW_ALL_BUFFERS_AND_TEXTURES である必要があります。
- D3D12_HEAP_FLAG_SHARED も設定する必要があります。
- D3D12_HEAP_TYPE_DEFAULT を設定するか、D3D12_HEAP_TYPE_CUSTOM と D3D12_MEMORY_POOL_L0 および D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE を設定する必要があります。
- D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER を持つリソースのみをクロスアダプター ヒープ上に配置できます。
- D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER が指定されている場合、保護されたセッションをヒープの作成に渡すことはできません。
複数のアダプタの使用に関する詳細については、 マルチアダプタ システム セクションを参照してください。