Delade högar

Delning är användbart för arkitekturer med flera processer och flera kort.

Delningsöversikt

Delade heaps möjliggör två saker: att dela data i en heap i en eller flera processer och att förecludera ett icke-deterministiskt val av odefinierad strukturlayout för resurser som placeras i heapen. Att dela heaps mellan kort tar också bort behovet av CPU-marshaling av data.

Både heaps och incheckade resurser kan delas. Delning av en bekräftad resurs delar faktiskt den implicita heapen tillsammans med den bekräftade resursbeskrivningen, så att en kompatibel resursbeskrivning kan mappas till heapen från en annan enhet.

Alla metoder är fritrådade och ärver befintliga D3D11-semantik i NT-referensdelningsdesignen.

Dela högar mellan processer

Delade heaps anges med D3D12_HEAP_FLAG_SHARED medlem i D3D12_HEAP_FLAGS uppräkning.

Delade heaps stöds inte på processortillgängliga heaps: D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_TYPE_READBACK och D3D12_HEAP_TYPE_CUSTOM utan D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE.

Om du utesluter ett icke-deterministiskt val av odefinierad texturlayout kan det avsevärt försämra scenarier för uppskjuten återgivning på vissa GPU:er, så det är inte standardbeteendet för placerade och incheckade resurser. Uppskjuten återgivning är nedsatt i vissa GPU-arkitekturer eftersom deterministiska texturlayouter minskar den effektiva minnesbandbredd som uppnås vid återgivning samtidigt till flera renderade målstrukturer med samma format och storlek. GPU-arkitekturer utvecklas bort från att utnyttja icke-deterministiska texturlayouter för att stödja standardiserade swizzle-mönster och standardiserade layouter effektivt för uppskjuten återgivning.

Delade heaps levereras också med andra mindre kostnader:

  • Delade heap-data kan inte återvinnas lika flexibelt som pågående heaps på grund av informationsutlämnande, så fysiskt minne är noll'ed oftare.
  • Det finns en mindre extra CPU-belastning och ökad användning av systemminne under skapandet och förstörelsen av delade heaps.

Dela högar mellan kort

Delade heaps mellan kort anges med D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER medlem i D3D12_HEAP_FLAGS uppräkning.

Med delade heaps för flera kort kan flera kort dela data utan att PROCESSORn konverterar data mellan dem. Även om olika kortfunktioner avgör hur effektiva kort kan skicka data mellan dem, ökar bara aktivering av GPU-kopior den effektiva bandbredden som uppnås. Vissa texturlayouter tillåts på korskortshögar för att stödja ett utbyte av texturdata, även om sådana texturlayouter annars inte stöds. Vissa begränsningar kan gälla för sådana texturer, till exempel endast stöd för kopiering.

Delning mellan kort fungerar med heaps som skapats genom att anropa ID3D12Enhet::CreateHeap. Ditt program kan sedan skapa resurser via CreatePlacedResource. Det tillåts också av resurser/heaps som skapats av CreateCommittedResource men endast för D3D12_RESOURCE_DIMENSION_TEXTURE2D resurser (se D3D12_RESOURCE_DIMENSION). Delning mellan kort fungerar inte med CreateReservedResource.

För delning mellan kort gäller fortfarande alla vanliga regler för resursdelning mellan köer. Programmet måste utfärda lämpliga hinder för att säkerställa korrekt synkronisering och enhetlighet mellan de två korten. Ditt program bör använda stängsel mellan kort för att samordna schemaläggningen av kommandolistor som skickas till flera kort. Det finns ingen mekanism för att dela resurser mellan kort i D3D API-versioner. Delade resurser mellan kort stöds endast i systemminnet. Delade heaps/resurser för flera kort stöds i D3D12_HEAP_TYPE_DEFAULT heaps och D3D12_HEAP_TYPE_CUSTOM heaps (med L0-minnespoolen och egenskaper för skriv-kombinera cpu-sida). Drivrutiner måste vara säkra på att GPU:s läs-/skrivåtgärder för delade högar mellan kort överensstämmer med andra GPU:er i systemet. Drivrutinen kan till exempel behöva undanta heapdata från att lagras i GPU-cacheminnen som vanligtvis inte behöver tömmas när processorn inte har direkt åtkomst till heap-data.

Ditt program bör begränsa användningen av korskortshögar till endast de scenarier som kräver de funktioner som de tillhandahåller. Cross-adapter heaps finns i D3D12_MEMORY_POOL_L0, vilket inte alltid är vad GetCustomHeapProperties föreslår. Den minnespoolen är inte effektiv för diskreta/NUMA-adapterarkitekturer. Och de mest effektiva texturlayouterna är inte alltid tillgängliga.

Följande begränsningar gäller också:

  • Heapflaggor som är relaterade till heap-nivåer måste vara D3D12_HEAP_FLAG_ALLOW_ALL_BUFFERS_AND_TEXTURES.
  • D3D12_HEAP_FLAG_SHARED måste också anges.
  • Antingen måste D3D12_HEAP_TYPE_DEFAULT anges eller D3D12_HEAP_TYPE_CUSTOM med D3D12_MEMORY_POOL_L0 och D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE måste anges.
  • Endast resurser med D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER får placeras på flera korthögar.
  • Det går inte att skicka en skyddad session till skapandet av heapen när D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER anges

Mer information om hur du använder flera kort finns i avsnittet system med flera kort.