Heap condivisi

La condivisione è utile per architetture multiprocesso e multi-adapter.

Panoramica della condivisione

Gli heap condivisi consentono due operazioni: la condivisione dei dati in un heap tra uno o più processi e l'isolamento di una scelta non deterministica del layout di trama non definito per le risorse inserite nell'heap. La condivisione degli heap tra schede rimuove anche la necessità di effettuare il marshalling della CPU dei dati.

È possibile condividere sia gli heap che le risorse di cui è stato eseguito il commit. La condivisione di una risorsa di cui è stato eseguito il commit condivide effettivamente l'heap implicito insieme alla descrizione della risorsa di cui è stato eseguito il commit, in modo che una descrizione della risorsa compatibile possa essere mappata all'heap da un altro dispositivo.

Tutti i metodi sono a thread libero e ereditano la semantica D3D11 esistente della progettazione di condivisione dell'handle NT.

Condivisione degli heap tra processi

Gli heap condivisi vengono specificati con il membro D3D12_HEAP_FLAG_SHARED dell'enumerazione D3D12_HEAP_FLAGS .

Gli heap condivisi non sono supportati in heap accessibili dalla CPU: D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_TYPE_READBACK e D3D12_HEAP_TYPE_CUSTOM senza D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE.

La scelta non deterministica del layout di trama non definita può compromettere significativamente gli scenari di rendering posticipati in alcune GPU, quindi non è il comportamento predefinito per le risorse inserite e sottoposte a commit. Il rendering posticipato è compromesso in alcune architetture GPU perché i layout di trama deterministici riducono la larghezza di banda di memoria effettiva ottenuta durante il rendering simultaneo a più trame di destinazione di rendering dello stesso formato e dimensioni. Le architetture GPU sono in continua evoluzione e non sfruttano layout di trama non deterministici per supportare modelli swizzle standardizzati e layout standardizzati in modo efficiente per il rendering posticipato.

Gli heap condivisi sono dotati anche di altri costi minori:

  • I dati dell'heap condivisi non possono essere riciclati in modo flessibile come heap in-process a causa di problemi di divulgazione di informazioni, quindi la memoria fisica è zero'ed più spesso.
  • Durante la creazione e la distruzione di heap condivisi si verifica un minor sovraccarico della CPU e un aumento dell'utilizzo della memoria di sistema.

Condivisione degli heap tra gli adapter

Gli heap condivisi tra gli adapter sono specificati con il membro D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER dell'enumerazione D3D12_HEAP_FLAGS .

Gli heap condivisi tra schede consentono a più adattatori di condividere i dati senza il marshalling della CPU tra di essi. Anche se diverse funzionalità di adattatore determinano il modo in cui gli adattatori efficienti possono passare i dati tra di essi, semplicemente abilitando le copie GPU aumenta la larghezza di banda effettiva ottenuta. Alcuni layout di trama sono consentiti negli heap tra schede per supportare un interscambio di dati di trama, anche se tali layout di trama non sono altrimenti supportati. Alcune restrizioni possono essere applicate a tali trame, ad esempio supportando solo la copia.

La condivisione tra schede funziona con gli heap creati chiamando ID3D12Device::CreateHeap. L'applicazione può quindi creare risorse tramite CreatePlacedResource. È consentito anche dalle risorse/heap create da CreateCommittedResource, ma solo per le risorse di D3D12_RESOURCE_DIMENSION_TEXTURE2D principali di riga (vedere D3D12_RESOURCE_DIMENSION). La condivisione tra schede non funziona con CreateReservedResource.

Per la condivisione tra schede, tutte le normali regole di condivisione delle risorse tra code sono ancora valide. L'applicazione deve emettere le barriere appropriate per garantire una corretta sincronizzazione e coerenza tra le due schede. L'applicazione deve usare i recinti incrociati per coordinare la pianificazione degli elenchi di comandi inviati a più schede. Non esiste alcun meccanismo per condividere le risorse tra adattatori tra le versioni dell'API D3D. Le risorse condivise tra schede sono supportate solo nella memoria di sistema. Gli heap/risorse condivisi tra schede sono supportati in D3D12_HEAP_TYPE_DEFAULT heap e D3D12_HEAP_TYPE_CUSTOM heap (con il pool di memoria L0 e le proprietà della pagina CPU combinate in scrittura). I driver devono essere sicuri che le operazioni di lettura/scrittura GPU per gli heap condivisi tra adattatori siano coerenti con altre GPU nel sistema. Ad esempio, potrebbe essere necessario escludere i dati dell'heap dalle cache GPU che in genere non devono essere scaricati quando la CPU non può accedere direttamente ai dati dell'heap.

L'applicazione deve limitare l'utilizzo degli heap tra schede solo a quelli che richiedono la funzionalità che forniscono. Gli heap tra schede si trovano in D3D12_MEMORY_POOL_L0, che non è sempre ciò che suggerisce GetCustomHeapProperties. Il pool di memoria non è efficiente per architetture di adattatori NUMA discreti/non efficienti. Inoltre, i layout delle trame più efficienti non sono sempre disponibili.

Si applicano le seguenti limitazioni:

  • I flag dell'heap correlati ai livelli heap devono essere D3D12_HEAP_FLAG_ALLOW_ALL_BUFFERS_AND_TEXTURES.
  • D3D12_HEAP_FLAG_SHARED devono essere impostati anche.
  • È necessario impostare D3D12_HEAP_TYPE_DEFAULT o D3D12_HEAP_TYPE_CUSTOM con D3D12_MEMORY_POOL_L0 e D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE.
  • Solo le risorse con D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER possono essere posizionate su heap tra adattatori.
  • Non è possibile passare una sessione protetta alla creazione dell'heap quando si specifica D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER

Per altre informazioni sull'uso di più schede, vedere la sezione Sistemi multi-adattatore .