Uso de DRED para diagnosticar errores de GPU

DRED significa Device Removed Extended Data (Datos extendidos eliminados del dispositivo). DRED es un conjunto en constante evolución de características de diagnóstico diseñadas para ayudarle a identificar la causa de errores inesperados de eliminación de dispositivos. En el hardware que admite las características necesarias (como se define a continuación), DRED ofrece rutas de navegación automáticas, así como informes de errores de página de GPU.

Rutas de navegación automáticas

Para establecer la escena de las rutas de navegación automáticas, vamos a mencionar primero la variedad manual. En previsión de la eventualidad de un método de detección y recuperación de tiempo de espera (TDR), puede usar el método ID3D12GraphicsCommandList2::WriteBufferImmediatepara colocar rutas de navegación en el flujo de comandos de GPU, con el fin de realizar un seguimiento del progreso de la GPU.

Este es un enfoque razonable si desea crear una implementación personalizada de baja sobrecarga. Sin embargo, puede faltar parte de la versatilidad de una solución estandarizada, como extensiones de depurador o informes a través de Informe de errores de Windows (WER) (también conocido como Watson).

Por lo tanto, las rutas de navegación automáticas de DRED llaman a WriteBufferImmediate para colocar contadores de progreso en el flujo de comandos de GPU. DRED inserta una ruta de navegación después de cada operación de representación, lo que significa que cada operación que da como resultado el trabajo de GPU (por ejemplo, Draw, Dispatch, Copy, Resolve y otros). Si el dispositivo se quita en medio de una carga de trabajo de GPU, el valor de la ruta de navegación DRED es básicamente una colección de las operaciones de representación que se completaron antes del error.

El búfer de anillo de historial de ruta de navegación conserva hasta 64KiB operaciones en una lista de comandos determinada. Si hay más de 65536 operaciones en una lista de comandos, solo se almacenan las últimas 64KiB, sobrescribir primero las operaciones más antiguas. Sin embargo, el valor del contador de ruta de navegación continúa contando hasta UINT_MAX. Por lo tanto, LastOpIndex = (BreadcrumbCount - 1) % 65536.

DRED 1.0 estaba disponible por primera vez en Windows 10, versión 1809 (Actualización de octubre de 2018 de Windows 10) y expone rutas de navegación automática rudimentarias. Sin embargo, no había API para él, y la única manera de habilitar DRED 1.0 era usar el Centro de opiniones para capturar una reproducción de TDR (reproducción) para aplicaciones & Juegos>de rendimiento y compatibilidad. El propósito principal de DRED 1.0 era ayudar a analizar los bloqueos del juego a causa principal a través de los comentarios de los clientes.

Advertencias

  • Dado que una GPU está muy canalización, no hay ninguna garantía de que el contador de ruta de navegación indique la operación exacta que produjo un error. De hecho, en algunos dispositivos de representación diferidos basados en iconos, es posible que el contador de ruta de navegación sea un recurso completo o una barrera de vista de acceso desordenada (UAV) detrás del progreso real de la GPU.
  • Un controlador de pantalla puede reordenar los comandos, recuperar previamente la memoria de recursos antes de ejecutar un comando o vaciar la memoria almacenada en caché correctamente después de completar un comando. Cualquiera de estos puede producir un error de GPU. En tales casos, los contadores de ruta de navegación automática pueden ser menos útiles o engañosos.

Rendimiento

Aunque las rutas de navegación automáticas están diseñadas para ser de baja sobrecarga, no son gratuitas. Las mediciones empíricas muestran una pérdida de rendimiento del 2 al 5 % en un típico motor de juego gráfico de Direct3D 12 AAA. Por este motivo, las rutas de navegación automáticas están desactivadas de forma predeterminada.

Requisitos de hardware

Dado que los valores del contador de ruta de navegación deben conservarse después de la eliminación del dispositivo, el recurso que contiene rutas de navegación debe existir en la memoria del sistema y debe conservarse en caso de eliminación de dispositivos. Esto significa que el controlador de pantalla debe admitir D3D12_FEATURE_EXISTING_HEAPS. Afortunadamente, este es el caso de la mayoría de los controladores de pantalla de Direct3D 12 en Windows 10, versión 1903.

Informes de errores de página de GPU

Una característica que es nueva para DRED 1.1 es la notificación de errores de la página DRED GPU. Un error de página de GPU suele producirse en una de estas condiciones.

  1. Una aplicación ejecuta erróneamente el trabajo en la GPU que hace referencia a un objeto eliminado. Esta es una de las principales razones para una eliminación inesperada de dispositivos.
  2. Una aplicación ejecuta erróneamente el trabajo en la GPU que accede a un recurso expulsado o un icono no residente.
  3. Un sombreador hace referencia a un descriptor no inicializado o obsoleto.
  4. Un sombreador indexa más allá del final de un enlace raíz.

DRED intenta abordar algunos de estos escenarios notificando los nombres y tipos de los objetos de API existentes o liberados recientemente que coincidan con la dirección virtual (VA) del error de la página notificada por GPU.

Advertencia

No todas las GPU admiten errores de página (aunque muchos sí). Algunas GPU responden a errores de memoria por: escrituras de cubos de bits; leer datos simulados (por ejemplo, ceros); o simplemente colgando. Desafortunadamente, en los casos en los que la GPU no se bloquea inmediatamente, una detección de tiempo de espera y recuperación (TDR) puede ocurrir más adelante en la canalización, lo que dificulta aún más la localización de la causa principal.

Rendimiento

El entorno de ejecución de Direct3D 12 debe conservar activamente una colección de objetos de API existentes y eliminados recientemente indexables por dirección virtual (VA). Esto aumenta la sobrecarga de memoria del sistema e introduce un pequeño impacto de rendimiento en la creación y destrucción de objetos. Por ese motivo, este comportamiento está desactivado de forma predeterminada.

Requisitos de hardware

Una GPU que no admite errores de página todavía puede beneficiarse de la característica de rutas de navegación automáticas.

Configuración de DRED en código

La configuración de DRED es global para el proceso y debe configurarlas antes de crear un dispositivo Direct3D 12. Para ello, llame a la función D3D12GetDebugInterface para recuperar 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

Las modificaciones en la configuración de DRED no tienen ningún efecto en los dispositivos ya creados. Pero las llamadas posteriores a D3D12CreateDevice usan la configuración de DRED más reciente.

Acceso a datos DRED en el código

Una vez detectada la eliminación del dispositivo (por ejemplo, Present devuelve DXGI_ERROR_DEVICE_REMOVED), use los métodos de la interfaz ID3D12DeviceRemovedExtendedData para acceder a los datos DRED del dispositivo quitado.

Para recuperar la interfaz ID3D12DeviceRemovedExtendedData , llame a QueryInterface en una interfaz ID3D12Device (o derivada), pasando el identificador de interfaz (IID) de 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...
}

Acceso del depurador a DRED

Los depuradores tienen acceso a los datos DRED a través de d3d12. Exportación de datos D3D12DeviceRemovedExtendedData .

Para los usuarios de WinDbg, consulte el repositorio de GitHub DirectX-Debugging-Tools para una extensión winDBG que facilita mucho la depuración del estado DRED de Direct3D 12.

Telemetría DRED

La aplicación puede usar las API de DRED para controlar las características de DRED y recopilar datos de telemetría para ayudar a analizar problemas. Esto le proporciona una red mucho más amplia para detectar esos TDR difíciles de reproducir.

A partir de Windows 10, versión 1903, todos los eventos eliminados del dispositivo en modo de usuario se notifican a Informe de errores de Windows (WER), también conocido como Watson. Si una combinación determinada de aplicación, GPU y controlador de pantalla genera un número suficiente de eventos eliminados del dispositivo, es posible que DRED se habilite temporalmente para que los clientes inicien la misma aplicación en una configuración similar.

Más información sobre DRED