Freigegebene Heaps

Die Freigabe ist nützlich für Architekturen mit mehreren Prozessen und mehreren Adaptern.

Übersicht über die Freigabe

Freigegebene Heaps ermöglichen zwei Dinge: Das Freigeben von Daten in einem Heap über einen oder mehrere Prozesse hinweg und das Schließen einer nicht deterministischen Wahl des nicht definierten Texturlayouts für Ressourcen, die sich innerhalb des Heaps befinden. Die Gemeinsame Nutzung von Heaps über Adapter hinweg entfällt auch das CPU-Marshallen der Daten.

Sowohl Heaps als auch festgelegte Ressourcen können gemeinsam genutzt werden. Beim Freigeben einer gebundenen Ressource wird der implizite Heap zusammen mit der Beschreibung der zugesagten Ressource gemeinsam verwendet, sodass dem Heap von einem anderen Gerät eine kompatible Ressourcenbeschreibung zugeordnet werden kann.

Alle Methoden sind Freithreads und erben die vorhandene D3D11-Semantik des NT-Handle-Freigabeentwurfs.

Prozessübergreifendes Freigeben von Heaps

Freigegebene Heaps werden mit dem D3D12_HEAP_FLAG_SHARED Member der D3D12_HEAP_FLAGS-Enumeration angegeben.

Freigegebene Heaps werden auf CPU-zugänglichen Heaps nicht unterstützt: D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_TYPE_READBACK und D3D12_HEAP_TYPE_CUSTOM ohne D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE.

Eine nicht deterministische Wahl des nicht definierten Texturlayouts kann verzögerte Renderingszenarien auf einigen GPUs erheblich beeinträchtigen, sodass es sich nicht um das Standardverhalten für platzierte und verpflichtete Ressourcen handelt. Das verzögerte Rendering ist bei einigen GPU-Architekturen beeinträchtigt, da deterministische Texturlayouts die effektive Speicherbandbreite verringern, die beim gleichzeitigen Rendern auf mehrere Renderzieltexturen desselben Formats und derselben Größe erreicht wird. GPU-Architekturen entwickeln sich nicht mehr von nicht deterministischen Texturlayouts, um standardisierte Swizzle-Muster und standardisierte Layouts effizient für verzögertes Rendering zu unterstützen.

Freigegebene Heaps sind auch mit anderen geringfügigen Kosten verbunden:

  • Freigegebene Heapdaten können aufgrund von Bedenken zur Offenlegung von Informationen nicht so flexibel wie prozessinterne Heaps wiederverwendet werden, sodass physischer Arbeitsspeicher häufiger 0'ed ist.
  • Es gibt einen geringfügigen zusätzlichen CPU-Mehraufwand und eine erhöhte Systemspeicherauslastung während der Erstellung und Zerstörung von freigegebenen Heaps.

Freigeben von Heaps über Adapter hinweg

Freigegebene Heaps zwischen Adaptern werden mit dem D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER Member der D3D12_HEAP_FLAGS-Enumeration angegeben.

Adapterübergreifende freigegebene Heaps ermöglichen es mehreren Adaptern, Daten gemeinsam zu nutzen, ohne dass die CPU die Daten zwischen ihnen marshallt. Während unterschiedliche Adapterfunktionen bestimmen, wie effiziente Adapter Daten zwischen ihnen übergeben können, erhöht die bloße Aktivierung von GPU-Kopien die effektive Bandbreite. Einige Texturlayouts sind auf adapterübergreifenden Heaps zulässig, um einen Austausch von Texturdaten zu unterstützen, auch wenn solche Texturlayouts sonst nicht unterstützt werden. Für solche Texturen können bestimmte Einschränkungen gelten, z. B. nur die Unterstützung des Kopierens.

Die adapterübergreifende Freigabe funktioniert mit Heaps, die durch Aufrufen von ID3D12Device::CreateHeap erstellt werden. Ihre Anwendung kann dann Ressourcen über CreatePlacedResource erstellen. Sie ist auch von Ressourcen/Heaps zulässig, die von CreateCommittedResource erstellt wurden, jedoch nur für Zeilen-Hauptressourcen D3D12_RESOURCE_DIMENSION_TEXTURE2D (siehe D3D12_RESOURCE_DIMENSION). Die adapterübergreifende Freigabe funktioniert nicht mit CreateReservedResource.

Für die adapterübergreifende Freigabe gelten weiterhin alle üblichen Regeln für die warteschlangenübergreifende Ressourcenfreigabe. Ihre Anwendung muss die entsprechenden Barrieren ausstellen, um eine ordnungsgemäße Synchronisierung und Kohärenz zwischen den beiden Adaptern sicherzustellen. Ihre Anwendung sollte adapterübergreifende Zäune verwenden, um die Planung von Befehlslisten zu koordinieren, die an mehrere Adapter übermittelt werden. Es gibt keinen Mechanismus zum Freigeben adapterübergreifender Ressourcen für D3D-API-Versionen. Adapterübergreifende freigegebene Ressourcen werden nur im Systemspeicher unterstützt. Adapterübergreifende freigegebene Heaps/Ressourcen werden in D3D12_HEAP_TYPE_DEFAULT Heaps und D3D12_HEAP_TYPE_CUSTOM Heaps unterstützt (mit dem L0-Speicherpool und den Eigenschaften der CPU-Seite mit Schreib-Kombination). Treiber müssen sicherstellen, dass GPU-Lese-/Schreibvorgänge für adapterübergreifende freigegebene Heaps mit anderen GPUs im System kohärent sind. Beispielsweise muss der Treiber möglicherweise die Heapdaten aus GPU-Caches ausschließen, die in der Regel nicht geleert werden müssen, wenn die CPU nicht direkt auf die Heapdaten zugreifen kann.

Ihre Anwendung sollte die Verwendung von adapterübergreifenden Heaps nur auf die Szenarien beschränken, die die von ihnen bereitgestellte Funktionalität erfordern. Adapterübergreifende Heaps befinden sich in D3D12_MEMORY_POOL_L0, was nicht immer das ist, was GetCustomHeapProperties vorschlägt. Dieser Speicherpool ist für diskrete/NUMA-Adapterarchitekturen nicht effizient. Und die effizientesten Texturlayouts sind nicht immer verfügbar.

Außerdem gelten die folgenden Einschränkungen:

  • Die Heapflags, die sich auf Heapebenen beziehen, müssen D3D12_HEAP_FLAG_ALLOW_ALL_BUFFERS_AND_TEXTURES sein.
  • D3D12_HEAP_FLAG_SHARED muss ebenfalls festgelegt werden.
  • Entweder muss D3D12_HEAP_TYPE_DEFAULT festgelegt oder mit D3D12_MEMORY_POOL_L0 und D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE D3D12_HEAP_TYPE_CUSTOM werden.
  • Nur Ressourcen mit D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER dürfen auf adapterübergreifenden Heaps platziert werden.
  • Eine geschützte Sitzung kann nicht an die Erstellung des Heap übergeben werden, wenn D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER angegeben ist.

Weitere Informationen zur Verwendung mehrerer Adapter finden Sie im Abschnitt Systeme mit mehreren Adaptern .