Condividi tramite


Usare DRED per diagnosticare gli errori GPU

DRED è l'acronimo di Device Removed Extended Data. DRED è un set in continua evoluzione di funzionalità di diagnostica progettate per identificare la causa di errori di rimozione imprevisti del dispositivo. Nell'hardware che supporta le funzionalità necessarie (come definito di seguito), DRED offre la barra di navigazione automatica e la segnalazione degli errori di pagina GPU.

Percorsi di navigazione automatici

Per introdurre il tema della navigazione automatica, è necessario prima menzionare la varietà manuale. In previsione dell'eventualità di un di rilevamento e ripristino di timeout (TDR), è possibile usare il metodo ID3D12GraphicsCommandList2::WriteBufferImmediate per inserire segnaposti nel flusso di comandi GPU, per monitorare l'avanzamento della GPU.

Si tratta di un approccio ragionevole se si vuole creare un'implementazione personalizzata a basso sovraccarico. Tuttavia, potrebbe non essere disponibile una certa versatilità di una soluzione standardizzata, ad esempio le estensioni del debugger o la creazione di report tramite segnalazione errori Windows (WER) (noto anche come Watson).

Quindi, i percorsi di navigazione automatici di DRED chiamano WriteBufferImmediate per inserire i contatori di avanzamento nel flusso di comandi GPU. DRED inserisce un indicatore di percorso dopo ogni operazione di rendering , ovvero ogni operazione che comporta il lavoro della GPU (ad esempio, Draw, Dispatch, Copy, Resolvee altri). Se il dispositivo viene rimosso nel mezzo di un carico di lavoro GPU, il valore breadcrumb DRED è essenzialmente una raccolta delle operazioni di rendering completate prima dell'errore.

Il buffer circolare della cronologia dei breadcrumbs mantiene fino a 64 KiB in una determinata lista di comandi. Se sono presenti più di 65536 operazioni in un elenco di comandi, vengono archiviate solo le ultime 64 KiB di operazioni, sovrascrivendo prima le operazioni meno recenti. Tuttavia, il valore del contatore breadcrumb continua a incrementare fino a UINT_MAX. Pertanto, LastOpIndex = (BreadcrumbCount - 1) % 65536.

DRED 1.0 è stato disponibile per la prima volta in Windows 10, versione 1809 (Windows 10 October 2018 Update) e introdusse percorsi di navigazione automatici rudimentali. Tuttavia, non c'erano API disponibili e l'unico modo per abilitare DRED 1.0 era usare Hub di Feedback per acquisire una riproduzione TDR (repro) per App & Giochi>Prestazioni e Compatibilità. Lo scopo principale di DRED 1.0 era aiutare a identificare la causa principale dei bloccarsi del gioco tramite i feedback dei clienti.

Avvertenze

  • Poiché una GPU è pesantemente a pipeline, non c'è alcuna garanzia che il contatore di breadcrumb indichi l'operazione esatta che è fallita. Infatti, in alcuni dispositivi di rendering posticipato basati su tile, è possibile che il contatore breadcrumb sia una risorsa completa o costituisca una barriera di accesso non ordinato che rallenta l'avanzamento effettivo della GPU.
  • Un driver di visualizzazione può riordinare i comandi, eseguire il recupero preliminare dalla memoria delle risorse prima di eseguire un comando o scaricare correttamente la memoria memorizzata nella cache dopo il completamento di un comando. Uno di questi può generare un errore GPU. In questi casi, i contatori di navigazione automatica possono essere meno utili o fuorvianti.

Prestazione

Anche se i percorsi di navigazione automatici sono progettati per essere a basso sovraccarico, non sono gratuiti. Le misurazioni empiriche mostrano una perdita di prestazioni da 2 a 5% in un tipico motore di gioco grafico AAA Direct3D 12. Per questo motivo, i percorsi di navigazione automatici sono disattivati per impostazione predefinita.

Requisiti hardware

Poiché i valori dei contatori di breadcrumb devono essere preservati dopo la rimozione del dispositivo, la risorsa che contiene breadcrumb deve esistere nella memoria di sistema e deve rimanere persistente in caso di rimozione del dispositivo. Ciò significa che il driver di visualizzazione deve supportare D3D12_FEATURE_EXISTING_HEAPS. Fortunatamente, questo è il caso per la maggior parte dei driver di visualizzazione Direct3D 12 in Windows 10 versione 1903.

Segnalazione errori di pagina GPU

Una funzionalità nuova per DRED 1.1 è la segnalazione degli errori di pagina della GPU DRED. Un errore di pagina GPU si verifica in genere in una di queste condizioni.

  1. Un'applicazione esegue erroneamente il lavoro sulla GPU che fa riferimento a un oggetto eliminato. Questo è uno dei motivi principali per una rimozione imprevista del dispositivo.
  2. Un'applicazione esegue erroneamente operazioni sulla GPU che accedono a una risorsa rimossa o a un tile non residente.
  3. Uno shader fa riferimento a un descrittore non inizializzato o non aggiornato.
  4. Un indice shader supera la fine di un'associazione radice.

DrED tenta di risolvere alcuni di questi scenari segnalando i nomi e i tipi di qualsiasi oggetto API esistente o liberato di recente che corrispondono all'indirizzo virtuale (VA) dell'errore della pagina segnalata dalla GPU.

Avvertimento

Non tutte le GPU supportano gli errori di pagina (anche se molti lo fanno). Alcune GPU rispondono agli errori di memoria con: scritture in un bit bucket; lettura di dati simulati (ad esempio, zeri); o semplicemente bloccarsi. Sfortunatamente, nei casi in cui la GPU non si blocca immediatamente, un rilevamento di timeout e ripristino (TDR) può verificarsi successivamente nel flusso, rendendo ancora più difficile individuare la causa principale.

Prestazione

Il runtime Direct3D 12 deve curare attivamente una raccolta di oggetti API esistenti e eliminati di recente indicizzabili dall'indirizzo virtuale (VA). Ciò aumenta il sovraccarico della memoria di sistema e introduce un piccolo riscontro sulle prestazioni per la creazione e la distruzione degli oggetti. Per questo motivo, questo comportamento è disattivato per impostazione predefinita.

Requisiti hardware

Una GPU che non supporta l'errore di pagina può comunque trarre vantaggio dalla funzionalità dei breadcrumb automatici.

Configurazione di DRED nel codice

Le impostazioni DRED sono globali per il processo ed è necessario configurarle prima di creare un dispositivo Direct3D 12. A tale scopo, chiamare la funzione D3D12GetDebugInterface per recuperare un ID3D12DeviceRemovedExtendedDataSettings.

CComPtr<ID3D12DeviceRemovedExtendedDataSettings> pDredSettings;
VERIFY_SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&pDredSettings)));

// Turn on auto-breadcrumbs and page fault reporting.
pDredSettings->SetAutoBreadcrumbsEnablement(D3D12_DRED_ENABLEMENT_FORCED_ON);
pDredSettings->SetPageFaultEnablement(D3D12_DRED_ENABLEMENT_FORCED_ON);

Nota

Le modifiche alle impostazioni DRED non hanno alcun effetto sui dispositivi già creati. Tuttavia, le chiamate successive a D3D12CreateDevice usano le impostazioni drED più recenti.

Accesso ai dati DRED nel codice

Dopo aver rilevato la rimozione del dispositivo (ad esempio, Present restituisce DXGI_ERROR_DEVICE_REMOVED), usare i metodi dell'interfaccia ID3D12DeviceRemovedExtendedData per accedere ai dati DRED per il dispositivo rimosso.

Per recuperare l'interfaccia ID3D12DeviceRemovedExtendedData, chiamare QueryInterface sull'interfaccia ID3D12Device (o derivata), passando l'identificatore di interfaccia (IID) di ID3D12DeviceRemovedExtendedData.

void MyDeviceRemovedHandler(ID3D12Device * pDevice)
{
    CComPtr<ID3D12DeviceRemovedExtendedData> pDred;
    VERIFY_SUCCEEDED(pDevice->QueryInterface(IID_PPV_ARGS(&pDred)));
    D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT DredAutoBreadcrumbsOutput;
    D3D12_DRED_PAGE_FAULT_OUTPUT DredPageFaultOutput;
    VERIFY_SUCCEEDED(pDred->GetAutoBreadcrumbsOutput(&DredAutoBreadcrumbsOutput));
    VERIFY_SUCCEEDED(pDred->GetPageFaultAllocationOutput(&DredPageFaultOutput));
    // Custom processing of DRED data can be done here.
    // Produce telemetry...
    // Log information to console...
    // break into a debugger...
}

Accesso del debugger a DRED

I debugger hanno accesso ai dati DRED tramite l'esportazione di dati d3d12!D3D12DeviceRemovedExtendedData.

Per gli utenti di WinDbg, vedere il repository GitHub DirectX-Debugging-Tools per un'estensione WinDBG che semplifica notevolmente il debug dello stato DRED di Direct3D 12.

Telemetria DRED

L'applicazione può usare le API DRED per controllare le funzionalità dred e raccogliere i dati di telemetria per analizzare i problemi. In questo modo è possibile ottenere una rete molto più ampia per rilevare i TDR difficili da riprodurre.

A partire da Windows 10, versione 1903, tutti gli eventi di rimozione del dispositivo in modalità utente vengono segnalati a Segnalazione errori Windows (WER), noto anche come Watson. Se una particolare combinazione di applicazioni, GPU e driver di visualizzazione genera un numero sufficiente di eventi rimossi dal dispositivo, è possibile che DRED venga temporaneamente abilitato per i clienti che avviano la stessa applicazione in una configurazione simile.

Altre informazioni su DRED