Usare DRED per diagnosticare gli errori GPU

DRED è l'acronimo di Device Removed Extended Data (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 impostare la scena per la navigazione automatica, è prima necessario menzionare la varietà manuale. In previsione dell'eventuale verifica di un timeout rilevamento e ripristino (TDR), è possibile usare il metodo ID3D12GraphicsCommandList2::WriteBufferImmediate per inserire i percorsi di navigazione nel flusso di comandi GPU, per tenere traccia dello stato 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 stato nel flusso di comandi GPU. DRED inserisce un percorso di navigazione dopo ogni operazione di rendering, ovvero ogni operazione che comporta il lavoro della GPU (ad esempio, Draw, Dispatch, Copy, Resolve e altri). Se il dispositivo viene rimosso al centro di un carico di lavoro GPU, il valore di navigazione DRED è essenzialmente una raccolta delle operazioni di rendering completate prima dell'errore.

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

DrED 1.0 è stato disponibile per la prima volta in Windows 10, versione 1809 (Aggiornamento di Windows 10 (ottobre 2018)) ed è stato esposto un percorso di navigazione automatico rudimentale. Tuttavia, non c'erano API per esso, e l'unico modo per abilitare DRED 1.0 era usare l'hub di Feedback per acquisire una riproduzione TDR (riprova) per le app e giochi>prestazioni e compatibilità del gioco. Lo scopo principale per DRED 1.0 è stato quello di aiutare ad analizzare gli arresti anomali del gioco a causa radice tramite feedback dei clienti.

Precisazioni

  • Poiché una GPU è fortemente con pipeline, non esiste alcuna garanzia che il contatore di navigazione indichi l'operazione esatta che ha avuto esito negativo. Infatti, in alcuni dispositivi di rendering posticipati basati su riquadri, è possibile che il contatore di navigazione sia una risorsa completa o una barriera di visualizzazione di accesso non ordinata dietro lo stato 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.

Prestazioni

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 del 2-5% su 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 navigazione devono essere mantenuti dopo la rimozione del dispositivo, la risorsa che contiene percorsi di navigazione deve esistere nella memoria di sistema e deve essere mantenuta in caso di rimozione del dispositivo. Ciò significa che il driver di visualizzazione deve supportare D3D12_FEATURE_EXISTING_HEpiattaforma di strumenti analitici. 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 il lavoro sulla GPU che accede a una risorsa rimossa o a un riquadro 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: scritture di bit-bucket; lettura di dati simulati (ad esempio, zeri); o semplicemente appeso. Sfortunatamente, nei casi in cui la GPU non si blocca immediatamente, un timeout rilevamento e ripristino (TDR) può verificarsi in un secondo momento nella pipe, rendendo ancora più difficile individuare la causa radice.

Prestazioni

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à di navigazione automatica.

Configurazione del ripristino di emergenza 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 ID3D12DeviceRemovedExtendedData Impostazioni.

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 su un'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 al debugger a DRED

I debugger hanno accesso ai dati DRED tramite d3d12 . D3D12DeviceRemovedExtendedData data export.

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 rimossi dal 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