Utiliser ordinateur pour diagnostiquer les erreurs GPU

DRED est l’acronyme de Device Removed Extended Data. DRED est un ensemble évolutif de fonctionnalités de diagnostic conçues pour vous aider à identifier la cause des erreurs inattendues de suppression d’appareil. Sur le matériel qui prend en charge les fonctionnalités nécessaires (comme défini ci-dessous), DRED fournit des navigations automatiques ainsi que des rapports d’erreurs de page GPU.

Navigation automatique

Pour définir la scène pour la navigation automatique, nous allons d’abord mention la variété manuelle. En prévision de l’éventualité d’une détection et d’une récupération de délai d’expiration (TDR), vous pouvez utiliser la méthode ID3D12GraphicsCommandList2::WriteBufferImmediate pour placer des navigations dans le flux de commandes GPU, afin de suivre la progression du GPU.

Il s’agit d’une approche raisonnable si vous souhaitez créer une implémentation personnalisée à faible surcharge. Mais il peut manquer de la polyvalence d’une solution standardisée, comme les extensions de débogueur ou la création de rapports via Rapport d'erreurs Windows (WER) (également appelé Watson).

Par conséquent, la navigation automatique de DRED appelle WriteBufferImmediate pour placer des compteurs de progression dans le flux de commandes GPU. DRED insère un fil d’ariane après chaque opération de rendu, ce qui signifie chaque opération qui aboutit à un travail GPU (par exemple, Draw, Dispatch, Copy, Resolve, etc.). Si l’appareil est supprimé au milieu d’une charge de travail GPU, la valeur de navigation DRED est essentiellement une collection des opérations de rendu qui se sont terminées avant l’erreur.

La mémoire tampon d’anneau d’historique de navigation conserve jusqu’à 64 Ko d’opérations dans une liste de commandes donnée. S’il y a plus de 65536 opérations dans une liste de commandes, seules les dernières opérations de 64 Ko sont stockées, en remplaçant d’abord les opérations les plus anciennes. Toutefois, la valeur du compteur de navigation continue de compter jusqu’à UINT_MAX. Par conséquent, LastOpIndex = (BreadcrumbCount - 1) % 65536.

DRED 1.0 a d’abord été disponible dans Windows 10, version 1809 (Mise à jour d'octobre 2018 de Windows 10), et il a exposé des navigations automatiques rudimentaires. Toutefois, il n’y avait pas d’API pour cela, et la seule façon d’activer DRED 1.0 était d’utiliser le Hub de commentaires pour capturer une reproduction TDR (repro) pour lesperformances et la compatibilité desjeux d’applications&.> L’objectif principal de DRED 1.0 était d’aider à analyser les incidents de jeu à cause racine via les commentaires des clients.

Mises en garde

  • Étant donné qu’un GPU est fortement pipeline, il n’y a aucune garantie que le compteur de navigation indique l’opération exacte qui a échoué. En fait, sur certains appareils de rendu différé basé sur des vignettes, il est possible que le compteur de navigation soit une ressource complète ou une barrière d’affichage d’accès non ordonné (UAV) derrière la progression réelle du GPU.
  • Un pilote d’affichage peut réorganiser les commandes, pré-extraire de la mémoire de ressource bien avant d’exécuter une commande ou vider la mémoire mise en cache bien après la fin d’une commande. L’un d’entre eux peut produire une erreur GPU. Dans ce cas, les compteurs de navigation automatique peuvent être moins utiles ou trompeurs.

Performances

Bien que les miettes de navigation automatiques soient conçues pour être à faible surcharge, elles ne sont pas gratuites. Les mesures empiriques montrent une perte de performances de 2 à 5 % sur un moteur de jeu graphique AAA Direct3D 12 typique. Pour cette raison, la navigation automatique est désactivée par défaut.

Configuration matérielle requise

Étant donné que les valeurs du compteur de navigation doivent être conservées après la suppression de l’appareil, la ressource qui contient des barres d’accès doit exister dans la mémoire système et elle doit persister en cas de suppression de l’appareil. Cela signifie que le pilote d’affichage doit prendre en charge D3D12_FEATURE_EXISTING_HEAPS. Heureusement, c’est le cas pour la plupart des pilotes d’affichage Direct3D 12 sur Windows 10, version 1903.

Rapport d’erreurs de page GPU

Une fonctionnalité qui est nouvelle pour DRED 1.1 est le rapport d’erreurs de page GPU DRED. Une erreur de page GPU se produit généralement dans l’une de ces conditions.

  1. Une application exécute par erreur le travail sur le GPU qui fait référence à un objet supprimé. Il s’agit de l’une des principales raisons d’une suppression inattendue d’appareil.
  2. Une application exécute par erreur le travail sur le GPU qui accède à une ressource supprimée ou à une vignette non résidente.
  3. Un nuanceur fait référence à un descripteur non initialisé ou obsolète.
  4. Un nuanceur indexe au-delà de la fin d’une liaison racine.

DRED tente de résoudre certains de ces scénarios en signalant les noms et les types de tous les objets API existants ou récemment libérés qui correspondent à l’adresse virtuelle (VA) de l’erreur de page signalée par GPU.

Mise en garde

Tous les GPU ne prennent pas en charge les erreurs de page (bien que beaucoup le font). Certains GPU répondent aux erreurs de mémoire en : écritures de compartiment de bits ; lecture de données simulées (par exemple, des zéros) ; ou simplement en accrochant. Malheureusement, dans les cas où le GPU ne se bloque pas immédiatement, un délai d’attente de détection et de récupération (TDR) peut se produire plus tard dans le canal, ce qui rend encore plus difficile la localisation de la cause racine.

Performances

Le runtime Direct3D 12 doit organiser activement une collection d’objets API existants et récemment supprimés indexables par adresse virtuelle (VA). Cela augmente la surcharge de mémoire système et introduit un petit impact sur les performances pour la création et la destruction d’objets. Pour cette raison, ce comportement est désactivé par défaut.

Configuration matérielle requise

Un GPU qui ne prend pas en charge les erreurs de page peut toujours bénéficier de la fonctionnalité de navigation automatique.

Configuration de DRED dans le code

Les paramètres DRED sont globaux pour le processus et vous devez les configurer avant de créer un appareil Direct3D 12. Pour ce faire, appelez la fonction D3D12GetDebugInterface pour récupérer 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);

Notes

Les modifications apportées aux paramètres DRED n’ont aucun effet sur les appareils déjà créés. Toutefois, les appels suivants à D3D12CreateDevice utilisent les paramètres DRED les plus récents.

Accès aux données DRED dans le code

Une fois la suppression de l’appareil détectée (par exemple, Present retourne DXGI_ERROR_DEVICE_REMOVED), utilisez les méthodes de l’interface ID3D12DeviceRemovedExtendedData pour accéder aux données DRED de l’appareil supprimé.

Pour récupérer l’interface ID3D12DeviceRemovedExtendedData , appelez QueryInterface sur une interface ID3D12Device (ou dérivée), en passant l’identificateur d’interface (IID) d’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...
}

Accès du débogueur à DRED

Les débogueurs ont accès aux données DRED via d3d12 ! Exportation de données D3D12DeviceRemovedExtendedData .

Pour les utilisateurs WinDbg, consultez le référentiel GitHub DirectX-Débogage-Tools pour une extension WinDBG qui facilite considérablement le débogage de l’état DRED Direct3D 12.

Télémétrie DRED

Votre application peut utiliser les API DRED pour contrôler les fonctionnalités DRED et collecter des données de télémétrie pour faciliter l’analyse des problèmes. Cela vous donne un filet beaucoup plus large pour attraper ces TDR difficiles à reproduire.

À compter de Windows 10 version 1903, tous les événements supprimés d’appareil en mode utilisateur sont signalés à Rapport d'erreurs Windows (WER), également appelé Watson. Si une combinaison particulière d’application, de GPU et de pilote d’affichage génère un nombre suffisant d’événements supprimés par l’appareil, il est possible que DRED soit temporairement activé pour les clients qui lancent la même application sur une configuration similaire.

Plus d’informations sur DRED