Delen via


Gedeelde heaps

Delen is handig voor architecturen met meerdere processen en meerdere adapters.

Overzicht van delen

Gedeelde heaps maken twee dingen mogelijk: het delen van gegevens in een heap over een of meer processen en het voorkomen van een niet-deterministische keuze van niet-gedefinieerde patroonindeling voor resources die in de heap worden geplaatst. Als u heaps deelt tussen adapters, wordt ook de noodzaak voor CPU-marshaling van de gegevens verwijderd.

Zowel heaps als vastgelegde resources kunnen worden gedeeld. Het delen van een vastgelegde resource deelt de impliciete heap samen met de vastgelegde resourcebeschrijving, zodat een compatibele resourcebeschrijving kan worden toegewezen aan de heap vanaf een ander apparaat.

Alle methoden zijn gratis threads en nemen de bestaande D3D11-semantiek van het NT-handle sharing-ontwerp over.

Heaps delen tussen processen

Gedeelde heaps worden opgegeven met het D3D12_HEAP_FLAG_SHARED lid van de D3D12_HEAP_FLAGS enum.

Gedeelde heaps worden niet ondersteund op cpu-toegankelijke heaps: D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_TYPE_READBACK en D3D12_HEAP_TYPE_CUSTOM zonder D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE.

Door een niet-deterministische keuze van een niet-gedefinieerde patroonindeling te kiezen, kan dit de uitgestelde renderingscenario's op sommige GPU's aanzienlijk beïnvloeden, dus is dit niet het standaardgedrag voor geplaatste en vastgelegde resources. Uitgestelde rendering is nadelig voor sommige GPU-architecturen, omdat deterministische patroonindelingen de effectieve geheugenbandbreedte verlagen die wordt bereikt bij het gelijktijdig weergeven van meerdere doeltextuurs van dezelfde indeling en grootte. GPU-architecturen ontwikkelen zich af van het gebruik van niet-deterministische patroonindelingen om gestandaardiseerde draaipatronen en gestandaardiseerde indelingen efficiënt te ondersteunen voor uitgestelde rendering.

Gedeelde heaps worden ook geleverd met andere kleine kosten:

  • Gedeelde heapgegevens kunnen niet zo flexibel worden gerecycled als in-process heaps vanwege zorgen over openbaarmaking van informatie, dus fysiek geheugen is vaker nul.
  • Er is een kleine extra CPU-overhead en verhoogd systeemgeheugengebruik tijdens het maken en vernietigen van gedeelde heaps.

Heaps delen tussen adapters

Gedeelde heaps tussen adapters wordt opgegeven met het D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER lid van de D3D12_HEAP_FLAGS enum.

Gedeelde heaps tussen meerdere adapters stellen meerdere adapters in staat om gegevens te delen zonder de CPU-marshaling van de gegevens ertussen. Hoewel verschillende adaptermogelijkheden bepalen hoe efficiënte adapters er gegevens tussen kunnen doorgeven, verhoogt het inschakelen van GPU-kopieën de effectieve bandbreedte die wordt bereikt. Sommige patroonindelingen zijn toegestaan op crossadapter-heaps ter ondersteuning van een uitwisseling van patroongegevens, zelfs als dergelijke patroonindelingen anders niet worden ondersteund. Bepaalde beperkingen kunnen van toepassing zijn op dergelijke patronen, zoals alleen ondersteuning voor kopiëren.

Delen van meerdere adapters werkt met heaps die zijn gemaakt door ID3D12Device::CreateHeap-aan te roepen. Uw toepassing kan vervolgens resources maken via CreatePlacedResource. Het is ook toegestaan door resources/heaps die zijn gemaakt door CreateCommittedResource, maar alleen voor D3D12_RESOURCE_DIMENSION_TEXTURE2D-resources (raadpleeg D3D12_RESOURCE_DIMENSION). Het delen van meerdere adapters werkt niet met CreateReservedResource-.

Voor het delen van meerdere adapters zijn alle gebruikelijke regels voor het delen van resources in meerdere wachtrijen nog steeds van toepassing. Uw toepassing moet de juiste barrières uitgeven om een juiste synchronisatie en samenhang tussen de twee adapters te garanderen. Uw toepassing moet gebruikmaken van omheiningen voor meerdere adapters om de planning van opdrachtlijsten te coördineren die naar meerdere adapters worden verzonden. Er is geen mechanisme voor het delen van resources tussen meerdere adapters in D3D-API-versies. Gedeelde resources voor meerdere adapters worden alleen ondersteund in het systeemgeheugen. Gedeelde heaps/resources voor meerdere adapters worden ondersteund in D3D12_HEAP_TYPE_DEFAULT heaps en D3D12_HEAP_TYPE_CUSTOM heaps (met de L0-geheugengroep en eigenschappen voor cpu-schrijfbewerkingen combineren). Stuurprogramma's moeten ervoor zorgen dat GPU-lees-/schrijfbewerkingen voor gedeelde heaps van meerdere adapters coherent zijn met andere GPU's op het systeem. Het is bijvoorbeeld mogelijk dat het stuurprogramma de heap-gegevens moet uitsluiten van verblijf in GPU-caches die doorgaans niet hoeven te worden leeggemaakt wanneer de CPU geen rechtstreeks toegang heeft tot de heap-gegevens.

Uw toepassing moet het gebruik van crossadapter-heaps beperken tot alleen de scenario's waarvoor de functionaliteit is vereist die ze bieden. Cross-adapter heaps bevinden zich in D3D12_MEMORY_POOL_L0, wat niet altijd GetCustomHeapProperties suggereert. Deze geheugengroep is niet efficiënt voor discrete/ NUMA-adapterarchitecturen. En de meest efficiënte patroonindelingen zijn niet altijd beschikbaar.

De volgende beperkingen zijn ook van toepassing:

  • De heap-vlaggen met betrekking tot heap-lagen moeten D3D12_HEAP_FLAG_ALLOW_ALL_BUFFERS_AND_TEXTURES zijn.
  • D3D12_HEAP_FLAG_SHARED moet ook worden ingesteld.
  • D3D12_HEAP_TYPE_DEFAULT moet worden ingesteld of D3D12_HEAP_TYPE_CUSTOM met D3D12_MEMORY_POOL_L0 en D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE moet worden ingesteld.
  • Alleen resources met D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER kunnen op meerdere adapter-heaps worden geplaatst.
  • Een beveiligde sessie kan niet worden doorgegeven aan het maken van de heap wanneer D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER is opgegeven

Raadpleeg de sectie multiadaptersystemen voor meer informatie over het gebruik van meerdere adapters.