Диагностика сбоев GPU с помощью DRED
DRED обозначает расширенные данные об удалённом устройстве. DRED — это развивающийся набор диагностических функций, предназначенных для выявления причины непредвиденных ошибок удаления устройств. На оборудовании, поддерживающем необходимые функции (как определено ниже), DRED предоставляет автоматические отчеты об ошибках страницы GPU.
Автоматические хлебные крошки
Чтобы подготовить основу для автоматических хлебных крошек, давайте сначала упомянем ручное их разнообразие. В ожидании возможности обнаружения и восстановлениявремени ожидания (TDR) можно использовать метод ID3D12GraphicsCommandList2::WriteBufferImmediate, чтобы поместить в поток команд GPU для отслеживания хода выполнения GPU.
Это разумный подход, если вы хотите создать пользовательскую реализацию с минимальными издержками. Но это может быть недостаточно универсальности стандартного решения, например расширений отладчика или отчетов с помощью отчетов об ошибках Windows (WER) (также известный как Уотсон).
Таким образом, функция автоматической навигации DRED вызывает WriteBufferImmediate для размещения счетчиков хода выполнения в поток команд GPU. DRED вставляет хлебную крошку после каждой операции отрисовки, что означает каждую операцию, которая приводит к работе GPU (например, отрисовка, диспетчеризация, копирование, разрешениеи т. д.). Если устройство удаляется в середине обработки GPU, то значение "хлебной крошки" DRED представляет собой, по сути, набор операций отрисовки, завершенных до ошибки.
Кольцевой буфер истории сохраняет до 64KiB операций в заданном списке команд. Если в списке команд есть более 65536 операций, то сохраняются только последние 64KiB-операции— перезаписывание старейших операций. Однако значение счетчика продолжает увеличиваться до UINT_MAX
. Следовательно, LastOpIndex = (BreadcrumbCount - 1) % 65536.
DRED 1.0 был впервые доступен в Windows 10, версии 1809 (Обновление Windows 10 октября 2018 г.), и предоставил базовые автоматические навигационные подсказки. Однако для этого не было API, и единственным способом включения DRED 1.0 было использование Концентратора отзывов для записи воспроизведения TDR (repro) для Приложений и & Игр>Производительности игр и совместимости. Основной целью DRED 1.0 была помощь в устранении сбоев игры с помощью отзывов клиентов.
Предостережения
- Так как графический процессор использует конвейерную обработку, не гарантируется, что счетчик выполнения указывает на точную операцию, которая завершилась сбоем. На самом деле, на некоторых устройствах отложенной отрисовки на основе плиток, счетчик может быть полным ресурсом или барьером неупорядоченного представления доступа (UAV) позади фактического прогресса GPU.
- Драйвер отображения может переупорядочить команды, предварительно извлекать данные из памяти ресурсов задолго до выполнения команды, или очистить кэшированную память после завершения команды. Любой из них может привести к ошибке GPU. В таких случаях счетчики автонастроек могут быть менее полезными или вводят в заблуждение.
Производительность
Хотя авто-хлебные крошки предназначены для низкой нагрузки, они не бесплатны. Эмпирические измерения показывают потерю производительности 2-5% на типичном графическом игровом механизме AAA Direct3D 12. По этой причине авто хлебные крошки выключены по умолчанию.
Требования к оборудованию
Поскольку значения счетчика хлебных крошек должны быть сохранены после удаления устройства, ресурс, содержащий хлебные крошки, должен существовать в системной памяти и должен сохраняться в случае удаления устройства. Это означает, что драйвер отображения должен поддерживать D3D12_FEATURE_EXISTING_HEAPS. К счастью, это относится к большинству драйверов отображения Direct3D 12 в Windows 10 версии 1903.
Отчеты об ошибке страницы GPU
Новая функция для DRED 1.1 — это сообщение об ошибке страницы GPU DRED. Ошибка страницы GPU обычно возникает в одном из этих условий.
- Приложение ошибочно выполняет работу с GPU, ссылающейся на удаленный объект. Это одна из основных причин неожиданного удаления устройства.
- Приложение ошибочно выполняет работу на GPU, которая обращается к вытесненному ресурсу или нерезидентной плитке.
- Шейдер ссылается на неинициализированный или устаревший дескриптор.
- Индексация шейдера выходит за пределы корневой привязки.
DRED пытается устранить некоторые из этих сценариев, сообщая имена и типы всех существующих или недавно освобожденных объектов API, которые соответствуют виртуальному адресу (VA) ошибки страницы, сообщаемой GPU.
Предостережение
Не все графические процессоры поддерживают ошибки страниц (хотя, многие делают). Некоторые графические процессоры реагируют на ошибки памяти: записи в бит-бак; чтение имитированных данных (например, нулей); или просто ожидание. К сожалению, в случаях, когда работа GPU не сразу останавливается, обнаружение и восстановление (TDR) может произойти позже в процессе, что делает еще труднее найти первопричину.
Производительность
Среда выполнения Direct3D 12 должна активно курировать коллекцию существующих и недавно удаленных объектов API, индексируемых по виртуальному адресу (VA). Это увеличивает нагрузку на память системы и приводит к небольшому снижению производительности при создании и уничтожении объектов. По этой причине это поведение по умолчанию отключено.
Требования к оборудованию
Графический процессор, который не поддерживает обработку ошибок страниц, по-прежнему может воспользоваться функцией автоматических пометок.
Настройка DRED в коде
Параметры DRED являются глобальными для процесса и необходимо настроить их перед созданием устройства Direct3D 12. Для этого вызовите функцию D3D12GetDebugInterface, чтобы получить 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);
Заметка
Изменения параметров DRED не влияют на уже созданные устройства. Но последующие вызовы D3D12CreateDevice используют последние параметры DRED.
Доступ к данным DRED в коде
После обнаружения удаления устройства (например, Present возвращается DXGI_ERROR_DEVICE_REMOVED), используйте методы интерфейса ID3D12DeviceRemovedExtendedData для доступа к данным DRED для удаленного устройства.
Чтобы получить интерфейс ID3D12DeviceRemovedExtendedData, выполните вызов QueryInterface на интерфейсе ID3D12Device (или производном), передав идентификатор интерфейса (IID) 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...
}
Доступ отладчика к DRED
Отладчики имеют доступ к данным DRED через d3d12! D3D12DeviceRemovedExtendedData экспорт данных.
Для пользователей WinDbg см. репозиторий DirectX-Debugging-Tools GitHub для расширения WinDBG, которое делает отладку состояния Direct3D 12 DRED значительно проще.
Телеметрия DRED
Приложение может использовать API DRED для управления функциями DRED и сбора данных телеметрии для анализа проблем. Это дает вам гораздо более широкие возможности для поимки этих трудно воспроизводимых TDR.
Начиная с Windows 10 версии 1903, все события, связанные с удалением устройств в пользовательском режиме, сообщаются в Windows Error Reporting (WER), также известной как Уотсон. Если определенная комбинация приложения, GPU и драйвера отображения создает достаточное количество событий удаления устройства, то возможно временное включение DRED для клиентов, запускающих то же приложение в аналогичной конфигурации.
Дополнительные сведения о DRED
- Репозиторий GitHub DirectX-Debugging-Tools
- расширение отладчика для записи блога drED
- DRED версии 1.2 поддерживает маркеры PIX и строки событий в записи блога auto-Breadcrumbs