다음을 통해 공유


DRED를 사용하여 GPU 오류 진단

DRED는 Device Removed Extended Data(디바이스 제거 확장 데이터)를 의미합니다. DRED는 예기치 않은 디바이스 제거 오류의 원인을 식별할 수 있도록 디자인된 계속 발전하는 진단 기능 세트입니다. 필요한 기능을 지원하는 하드웨어에서(아래에 정의됨) DRED는 GPU 페이지 오류 보고 뿐만 아니라 자동 이동 경로를 제공합니다.

자동 이동 경로

자동 이동 경로의 장면을 설정하기 위해 먼저 수동 다양성을 설명하겠습니다. TDR(제한 시간 탐지 및 복구)의 결과를 예측할 때 GPU 진행 상황을 추적하기 위해 ID3D12GraphicsCommandList2::WriteBufferImmediate 메서드를 사용하여 GPU 명령 스트림에 이동 경로를 배치할 수 있습니다.

이 방법은 오버헤드가 낮은 사용자 지정 구현을 만들려는 경우에 적절합니다. 그렇지만 표준화된 솔루션의 기능[예: 디버거 확장 또는 WER(Windows 오류 보고)(Watson이라고도 함)을 통한 보고]이 부족할 수 있습니다.

따라서 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년 10월 업데이트)에 처음 포함되었으며, 기본적인 자동 이동 경로를 노출합니다. 그러나 해당 API가 없었으며, DRED 1.0을 사용하도록 설정하는 유일한 방법은 피드백 허브를 사용하여 앱 및 게임>게임 성능 및 호환성의 TDR 재생을 캡처하는 것이었습니다. DRED 1.0의 주요 목적은 고객 피드백을 통해 게임 충돌의 근본 원인을 분석하도록 지원하는 것이었습니다.

제한 사항

  • GPU는 과도하게 파이프라인되므로 이동 경로 카운터가 실패한 정확한 작업을 나타낸다고 보장할 수 없습니다. 사실, 일부 타일 기반 지연 렌더링 디바이스에서 이동 경로 카운터가 전체 리소스 또는 UAV(순서가 지정되지 않은 액세스 뷰)의 장애 요인이 되어 실제 GPU 진행 상태를 제대로 인식하지 못하게 할 수 있습니다.
  • 디스플레이 드라이버는 명령을 다시 정렬하거나, 명령을 실행하기 전에 리소스 메모리에서 적절히 프리페치하거나, 명령 완료 후 캐시된 메모리를 적절히 플러시할 수 있습니다. 이러한 문제는 GPU 오류를 생성할 수 있습니다. 이러한 경우, 자동 이동 경로 카운터가 덜 유용하거나 잘못된 결과를 가져올 수 있습니다.

성능

자동 이동 경로는 낮은 오버헤드를 발생하도록 디자인되었지만 무료는 아닙니다. 경험적 측정에 따르면 일반적인 AAA Direct3D 12 그래픽 게임 엔진에서 2~5%의 성능 저하를 나타냅니다. 따라서 자동 이동 경로는 기본적으로 해제됩니다.

하드웨어 요구 사항

디바이스 제거 후에도 이동 경로 카운터 값을 유지해야 하므로 이동 경로를 포함하는 리소스가 시스템 메모리에 존재해야 하며 디바이스 제거 시에도 지속되어야 합니다. 즉, 디스플레이 드라이버는 D3D12_FEATURE_EXISTING_HEAPS를 지원해야 합니다. 다행히도 Windows 10, 버전 1903에 있는 대부분의 Direct3D 12 디스플레이 드라이버가 여기에 해당합니다.

GPU 페이지 폴드 보고

DRED 1.1에 새로 제공된 기능은 DRED GPU 페이지 폴트 보고입니다. GPU 페이지 폴트는 일반적으로 다음과 같은 상황 중 하나에서 발생합니다.

  1. 애플리케이션이 삭제된 개체를 참조하는 GPU에서 실수로 작업을 실행하는 경우. 예기치 않은 디바이스 제거의 주요 이유 중 하나입니다.
  2. 애플리케이션이 제거된 리소스 또는 비상주 타일에 액세스하는 작업을 GPU에서 실수로 실행하는 경우
  3. 셰이더가 초기화되지 않은 설명자 또는 부실 설명자를 참조하는 경우
  4. 루트 바인딩 끝을 벗어나는 셰이더 인덱스

DRED는 기존 또는 최근에 해제된 API 개체 중에서 GPU가 보고한 페이지 폴트의 VA(가상 주소)와 일치하는 이름 및 형식을 보고하여 이러한 시나리오 일부를 해결하려고 합니다.

주의 사항

모든 GPU가 페이지 폴트를 지원하는 것은 아닙니다(지원하는 경우가 많음). 일부 GPU는 비트 버킷 쓰기를 통해 메모리 오류에 응답합니다. 시뮬레이션된 데이터 읽기(예: 0) 또는 단순히 매달려 있습니다. 그러나 GPU가 즉시 중단되지 않는 경우에는 TDR(제한 시간 탐지 및 복구)이 파이프 뒷부분에서 발생하여 근본 원인을 찾기가 더 어려울 수 있습니다.

성능

Direct3D 12 런타임은 VA(가상 주소)로 인덱싱할 수 있는 기존 및 최근에 삭제된 API 개체의 컬렉션을 적극적으로 조정해야 합니다. 이로 인해 시스템 메모리 오버헤드가 증가하고, 개체 생성 및 소멸 시 성능이 약간 저하됩니다. 따라서 이 동작은 기본적으로 꺼져 있습니다.

하드웨어 요구 사항

페이지 폴트를 지원하지 않는 GPU는 자동 이동 경로 기능을 여전히 활용할 수 있습니다.

코드에서 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 데이터 액세스

디바이스 제거가 감지되면(예를 들어 PresentDXGI_ERROR_DEVICE_REMOVED 반환) ID3D12DeviceRemovedExtendedData 인터페이스의 메서드를 사용하여 제거된 디바이스에 대한 DRED 데이터에 액세스합니다.

ID3D12DeviceRemovedExtendedData 인터페이스를 검색하려면 ID3D12Device(또는 파생) 인터페이스에서 QueryInterface를 호출하고 ID3D12DeviceRemovedExtendedData의 IID(인터페이스 식별자)를 제공합니다.

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에 대한 디버거 액세스

디버거는 d3d12! D3D12DeviceRemovedExtendedData 데이터 내보내기를 통해 DRED 데이터에 액세스합니다.

WinDbg 사용자의 경우 Direct3D 12 DRED 상태를 훨씬 쉽게 디버그할 수 있는 WinDBG 확장에 대한 DirectX-Debugging-Tools GitHub 리포지토리를 참조하세요.

DRED 원격 분석

애플리케이션은 DRED API를 사용하여 DRED 기능을 제어하고, 문제 분석에 도움이 되는 원격 분석을 수집할 수 있습니다. 이를 통해 재생하기 어려운 TDR을 보다 안정적으로 포착할 수 있습니다.

Windows 10, 버전 1903에서 모든 사용자 모드 디바이스 제거 이벤트가 Watson이라고도 하는 WER(Windows 오류 보고)에 보고됩니다. 애플리케이션, GPU 및 디스플레이 드라이버의 특정 조합이 충분한 수의 디바이스 제거 이벤트를 생성할 경우, 비슷한 구성에서 동일한 애플리케이션을 시작하는 고객에 대해 일시적으로 DRED를 사용하도록 설정할 수 있습니다.

DRED에 대한 자세한 정보