Ottimizzazioni UMA: trame accessibili dalla CPU e Swizzle Standard

Le GPU UMA (Universal Memory Architecture) offrono alcuni vantaggi di efficienza rispetto alle GPU discrete, soprattutto quando si ottimizzano i dispositivi mobili. Concedere alle risorse l'accesso alla CPU quando la GPU è UMA può ridurre la quantità di copia che si verifica tra CPU e GPU. Anche se non si consiglia alle applicazioni di concedere in modo cieco alla CPU l'accesso a tutte le risorse nelle progettazioni UMA, esistono opportunità per migliorare l'efficienza concedendo alle risorse appropriate l'accesso alla CPU. A differenza delle GPU discrete, la CPU può tecnicamente avere un puntatore a tutte le risorse a cui può accedere la GPU.

Panoramica delle trame accessibili dalla CPU

Le trame accessibili dalla CPU, nella pipeline grafica, sono una funzionalità dell'architettura UMA, consentendo alle CPU l'accesso in lettura e scrittura alle trame. Nelle GPU discrete più comuni, la CPU non ha accesso alle trame nella pipeline grafica.

La procedura consigliata generale per le trame consiste nell'ospitare GPU discrete, che in genere comporta i processi seguenti in Caricamento di dati trama tramite buffer, riepilogati come:

  • Non avere accesso alla CPU per la maggior parte delle trame.
  • Impostazione del layout della trama su D3D12_TEXTURE_LAYOUT_UNKNOWN.
  • Caricamento delle trame nella GPU con CopyTextureRegion.

Tuttavia, per determinati casi, la CPU e la GPU possono interagire così frequentemente sugli stessi dati, che il mapping delle trame diventa utile per risparmiare energia o per velocizzare una progettazione specifica su schede o architetture specifiche. Le applicazioni devono rilevare questi casi e ottimizzare le copie non necessarie. In questo caso, per ottenere prestazioni ottimali, considerare quanto segue:

  • Iniziare a migliorare le prestazioni delle trame di mapping solo quando D3D12_FEATURE_DATA_ARCHITECTURE::UMA è TRUE. Prestare quindi attenzione a CacheCoherentUMA se si decide quali proprietà della cache della CPU scegliere nell'heap.

  • L'uso dell'accesso alla CPU per le trame è più complicato rispetto ai buffer. I layout di trama più efficienti per le GPU sono raramente row_major. Alcune GPU possono infatti supportare solo row_major trame durante la copia dei dati delle trame.

  • Le GPU UMA dovrebbero trarre vantaggio universalmente da una semplice ottimizzazione per ridurre i tempi di caricamento a livello. Dopo aver riconosciuto UMA, l'applicazione può ottimizzare l'oggetto CopyTextureRegion iniziale per popolare le trame che la GPU non modificherà. Anziché creare la trama in un heap con D3D12_HEAP_TYPE_DEFAULT e eseguire il marshalling dei dati della trama tramite, l'applicazione può usare WriteToSubresource per evitare di comprendere il layout effettivo della trama.

  • In D3D12, le trame create con D3D12_TEXTURE_LAYOUT_UNKNOWN e nessun accesso alla CPU sono le più efficienti per il rendering e il campionamento frequenti della GPU. Quando si esegue il test delle prestazioni, tali trame devono essere confrontate con D3D12_TEXTURE_LAYOUT_UNKNOWN con accesso alla CPU e D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE con accesso alla CPU e D3D12_TEXTURE_LAYOUT_ROW_MAJOR per il supporto tra schede.

  • L'uso di D3D12_TEXTURE_LAYOUT_UNKNOWN con accesso alla CPU consente i metodi WriteToSubresource, ReadFromSubresource, Map (precluding l'accesso dell'applicazione al puntatore) e Unmap; ma può sacrificare l'efficienza dell'accesso alla GPU.

  • L'uso di D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE con accesso alla CPU abilita WriteToSubresource, ReadFromSubresource, Map (che restituisce un puntatore valido all'applicazione) e Unmap. Può anche sacrificare l'efficienza dell'accesso gpu più di D3D12_TEXTURE_LAYOUT_UNKNOWN con accesso alla CPU.

Panoramica di Swizzle Standard

D3D12 (e D3D11.3) introducono un layout di dati multidimensionale standard. Questa operazione viene eseguita per consentire a più unità di elaborazione di operare sugli stessi dati senza copiare i dati o scorrere i dati tra più layout. Un layout standardizzato consente un aumento dell'efficienza tramite effetti di rete e consente agli algoritmi di effettuare brevi tagli presupponendo un modello specifico.

Per una descrizione dettagliata dei layout delle trame, vedere D3D12_TEXTURE_LAYOUT.

Si noti tuttavia che questo swizzle standard è una funzionalità hardware e potrebbe non essere supportato da tutte le GPU.

Per informazioni di sfondo sullo scorrimento rapido, fare riferimento alla curva dell'ordine Z.

API

A differenza di D3D11.3, D3D12 supporta il mapping delle trame per impostazione predefinita, quindi non è necessario eseguire query D3D12_FEATURE_DATA_D3D12_OPTIONS. Tuttavia D3D12 non supporta sempre swizzle standard: questa funzionalità dovrà essere eseguita una query con una chiamata a CheckFeatureSupport e controllando il campo StandardSwizzle64KBSupported di D3D12_FEATURE_DATA_D3D12_OPTIONS.

Le API seguenti fanno riferimento al mapping delle trame:

Enumerazioni

  • D3D12_TEXTURE_LAYOUT : controlla il modello swizzle delle trame predefinite e abilita il supporto della mappa sulle trame accessibili dalla CPU.

Strutture

Metodi

Le risorse e gli heap padre hanno requisiti di allineamento:

  • D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT (4 MB) per trame a più campioni.
  • D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT (64 KB) per trame e buffer di esempio singoli.
  • La copia di sottorisorse lineari deve essere allineata a D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512 byte), con un passo di riga allineato a D3D12_TEXTURE_DATA_PITCH_ALIGNMENT (256 byte).
  • Le visualizzazioni buffer costanti devono essere allineate a D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT (256 byte).

Le trame inferiori a 64 KB devono essere elaborate tramite CreateCommittedResource.

Con trame dinamiche (trame che modificano ogni fotogramma) la CPU scriverà in modo lineare nell'heap di caricamento, seguita da un'operazione di copia GPU.

In genere per creare risorse dinamiche creare un buffer di grandi dimensioni in un heap di caricamento (fare riferimento a Suballocation Within Buffers). Per creare risorse di staging, creare un buffer di grandi dimensioni in un heap di readback. Per creare risorse statiche predefinite, creare risorse adiacenti in un heap predefinito. Per creare risorse con alias predefinite, creare risorse sovrapposte in un heap predefinito.

WriteToSubresource e ReadFromSubresource riorganizzare i dati delle trame tra un layout principale della riga e un layout di risorse non definito. L'operazione è sincrona, quindi l'applicazione deve tenere presente la pianificazione della CPU. L'applicazione può sempre suddividere la copia in aree più piccole o pianificare questa operazione in un'altra attività. Le risorse MSAA e le risorse depth-stencil con layout di risorse opache non sono supportate da queste operazioni di copia della CPU e causeranno un errore. Anche i formati che non dispongono di una dimensione di potenza di due elementi non sono supportati e causeranno un errore. I codici restituiti di memoria insufficiente possono verificarsi.

Costanti principali

ID3D12Heap

Associazione di risorse