Использование DRED для диагностики ошибок GPU
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). Это увеличивает затраты на память системы и приводит к небольшому удару по производительности для создания и уничтожения объектов. По этой причине это поведение по умолчанию отключено.
Требования к аппаратному обеспечению
Gpu, который не поддерживает сбой страницы, по-прежнему может воспользоваться функцией автонастроек.
Настройка DRED в коде
Параметры DRED являются глобальными для процесса и необходимо настроить их перед созданием устройства Direct3D 12. Для этого вызовите функцию D3D12GetDebugInterface, чтобы получить идентификатор ID3D12DeviceRemovedExtendedData Параметры.
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), используйте методы интерфейса ID3D12Device DeleteExtendedData для доступа к данным 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 см . репозиторий GitHub DirectX-Debuging-Tools для расширения WinDBG, что упрощает отладку состояния Direct3D 12 DRED.
Телеметрия DRED
Приложение может использовать API DRED для управления функциями DRED и сбора данных телеметрии для анализа проблем. Это дает вам гораздо более широкую сеть для перехвата этих трудно воспроизводимых TDR.
По состоянию на Windows 10 версии 1903 все события, удаленные устройства в режиме пользователя, передаются в отчеты об ошибках Windows (WER), также известные как Уотсон. Если определенное сочетание приложений, GPU и драйвера отображения создает достаточное количество событий, удаленных устройством, то возможно, что DRED будет временно включен для клиентов, запускающих то же приложение в аналогичной конфигурации.