GPU 드라이버 크래시 해결하기

레지스트리 키를 편집하여 Windows의 GPU 드라이버 크래시를 해결하는 방법을 알아보세요.

Choose your operating system:

Windows

macOS

Linux

GPU 크래시 알림

그래픽이 무거운 프로젝트를 작업하다 보면 GPU 크래시가 발생할 수 있습니다. 이 경우 아래와 같은 창이 나타납니다.

GPU 크래시

그리고 보통은 언리얼 엔진 크래시 리포터 창이 표시됩니다.

이미지를 클릭하면 최대 크기로 볼 수 있습니다.

GPU 크래시가 발생하는 이유

Windows에는 메모리를 너무 많이 사용하거나 프로세스 완료에 지나치게 긴 시간이 소요되는 경우처럼 다양한 이유로 애플리케이션이 멈추는 것을 예방하기 위한 보호 장치가 있습니다. 이 경우 Windows가 GPU 드라이버를 중지시켜 애플리케이션 크래시가 발생합니다.

GPU 크래시가 발생하면 콜스택과 로그에 "GPUCrash - exiting due to D3D device being lost - D3D Hung" 및 "DXGI_ERROR_DEVICE_REMOVED with Reason: DXGI_ERROR_DEVICE_HUNG."과 같은 메시지가 나타날 수 있습니다.

GPU 크래시는 아래와 같은 다양한 이유로 발생할 수 있습니다.

  • 메모리 부족(OOM)

  • 비용이 높은 연산 수행 중 타임아웃 발생(TDR 이벤트)

  • 엔진 코드의 버그

  • 드라이버의 버그

  • 운영체제의 버그

  • 하드웨어 문제

따라서 언리얼 엔진과 같은 애플리케이션에서 항상 크래시 발생 이유를 알 수 있는 것은 아니며, 애플리케이션 차원에서 크래시를 피하는 것이 불가능할 수도 있습니다.

아래 섹션에서는 크래시의 근본적인 원인을 파악하는 데 도움이 되는 몇 가지 디버깅 옵션과 가능한 예방 조치를 제시합니다.

GPU 크래시 디버깅

언리얼 엔진에서 크래시가 발생하면 먼저 어떤 상황인지 파악하는 데 도움이 되는 정보를 담고 있는 크래시 리포터(Crash Reporter)의 콜스택과 로그 파일을 살펴보는 것이 좋습니다. 하지만 GPU 크래시가 발생하는 경우, CPU 콜스택은 크래시의 실제 원인이 아니라 GPU 크래시 발생 당시 CPU가 수행하고 있었던 작업만을 알려줍니다. 따라서 CPU 콜스택은 실용적인 정보를 제공하지 않습니다.

아래의 두 가지 디버깅 명령줄 실행인자를 사용하면 유용한 정보가 포함된 로그를 출력할 수 있습니다.

  • -gpucrashdebugging 은 GPU 크래시 디버깅 시 GPU 프로그레스를 수집하고 GPU의 현재 상태를 추적합니다.

  • -d3ddebug 는 D3D 파이프라인에 대한 정보를 제공합니다.

두 명령줄 실행인자는 함께 사용하지 않는 것을 강력히 권장합니다. 각 플래그를 따로 사용해 엔진을 실행하여 로그를 생성해야 합니다.

각 명령줄을 사용하여 엔진을 실행한 뒤 크래시가 발생하면 [프로젝트]/Saved/Logs 폴더에 로그가 저장됩니다.

Windows 애플리케이션에서 크래시가 발생하면 덤프 파일이 생성되는데, 이 파일도 크래시 진단에 도움이 될 수 있습니다. 자세한 사항은 Microsoft의 Visual Studio 문서, Visual Studio 디버거의 덤프 파일에서 확인할 수 있습니다.

GPU 메모리 부족(OOM) 문제 해결하기

GPU 메모리가 부족하면 크래시가 발생할 가능성이 있습니다. 메모리 부족은 사용하는 RHI에 따라 크게 좌우됩니다. 어떤 RHI는 특히 회복력이 있기 때문에 OOM 이벤트 발생 시 중단되는 것이 아니라 느려지기도 합니다.

메모리 부족 크래시가 발생할 수 있는 이유를 이해하려면 먼저 Windows 작업 관리자성능 탭을 확인해야 합니다. 우선 GPU를 선택(1)하고 가용 메모리와 현재 소모되고 있는 메모리를 확인(2)합니다.

Windows 작업 관리자 - 성능 탭에 표시되는 가용 GPU 메모리 및 현재 소모량

GPU의 가용 메모리와 현재 메모리 소모량을 비롯한 현재 상태가 표시되어 있는 Windows 작업 관리자.

프로젝트를 열고 실행하면 가용 메모리 대비 얼마나 많은 GPU 메모리가 소모되는지 확인할 수 있습니다. 가용 메모리 한계치에 가까워졌다면 메모리 부족이 크래시의 원인일 가능성이 높습니다. 이 경우 아래 방법을 시도해 보시기 바랍니다.

  • GPU 메모리를 많이 소모할 수 있는 다른 프로그램을 닫습니다.

  • 저해상도 텍스처 사용, 저해상도 메시 사용, 컬링을 통한 씬 오브젝트 줄이기 등의 방법으로 씬을 간소화합니다.

  • 화면 해상도를 낮춥니다.

    • 에디터에서 작업하는 동안 레벨 뷰포트의 화면 퍼센티지(Screen Percentage) 를 사용하여 저해상도로 렌더링할 수 있습니다.

  • 에디터에서 작업하는 동안 여러 뷰포트가 열려 있다면 하나만 남기고 모두 닫습니다.

  • 나이아가라, 레이 트레이싱 등 주요 기능을 비활성화하는 것은 피합니다.

    • 이러한 컴포넌트를 우회하면 많은 변경 사항이 발생하기 때문에 GPU 크래시의 원인과 관련해 유효하지 않은 결론이 도출될 수 있습니다.

높은 연산 비용으로 인해 발생하는 GPU 타임아웃 이해하기(TDR 이벤트)

CPU는 GPU에게 컴퓨팅 명령을 전송할 때 타이머를 설정해서 GPU가 연산을 완료하는 데 필요한 시간을 측정합니다. 연산에 소요되는 시간이 너무 길어지면 CPU는 드라이버를 초기화하고, GPU 크래시가 발생하게 됩니다. Windows의 디폴트 타임아웃 시간은 2초입니다. 이 현상을 TDR 이벤트 또는 타임아웃 감지 및 복구라고 합니다.

이상적으로 엔진이 GPU에 TDR 이벤트가 발생할 정도의 작업량을 전송해서는 안 됩니다. 대신 엔진은 TDR을 피하기 위해 작업을 작은 청크로 분할할 수 있어야 합니다. Windows 레지스트리를 편집하여 타임아웃이 발생하기까지 걸리는 시간을 늘리면 TDR 이벤트를 방지할 수 있습니다. 자세한 방법은 아래의 TDR 이벤트 해결 방법 을 참조하시기 바랍니다.

레이 트레이싱과 TDR 이벤트

하드웨어 레이 트레이싱은 특히 비용이 높기 때문에 활성화 시 TDR 이벤트를 유발할 가능성이 더 높습니다. 아주 높은 해상도의 레이 트레이싱 글로벌 일루미네이션처럼 비용이 높은 일부 레이 트레이싱 패스는 렌더링에 소요되는 시간이 길어 TDR 이벤트를 유발할 수 있습니다.

글로벌 일루미네이션, 리플렉션 등 비용이 가장 높은 레이 트레이싱 패스의 경우에는 아래와 같은 콘솔 변수를 사용하여 패스를 하나의 패스가 아닌 여러 타일로 렌더링할 수 있습니다.

  • r.RayTracing.GlobalIllumination.RenderTileSize

  • r.RayTracing.Reflections.RenderTileSize

패스의 크기가 0보다 크면 패스가 N x N 픽셀 크기의 타일로 렌더링되고, 각 타일은 별도의 GPU 명령 버퍼로 제출됩니다. 이 방법을 사용하면 타임아웃 감지 없이 높은 퀄리티로 렌더링을 수행할 수 있습니다.

TDR 이벤트 해결 방법

TDR 이벤트를 피하는 방법 중 하나는 Windows 레지스트리 키를 편집하여 Windows가 TDR 이벤트를 발동시키기까지 걸리는 시간을 늘리는 것입니다. 이 가이드에서는 두 개의 레지스트리 키를 새로 생성합니다. 바로 TdrDelayTdrDiDelay 입니다.

  • TdrDelay 는 타임아웃 한계치를 설정합니다. 이 레지스트리 키는 GPU에서 프로세싱과 메모리(VRAM)를 처리하는 GPU 스케줄러의 선점 요청이 지연되는 시간을 초 단위로 나타냅니다.

  • TdrDdiDelay 는 운영체제(OS)에서 스레드가 드라이버를 빠져나가는 데 주어지는 시간을 설정합니다. 이 시간이 지나면 타임아웃 딜레이 오류가 발생합니다.

레지스트리 키에 대한 자세한 정보는 TDR 레지스트리 키에 대한 Microsoft 문서를 참고하세요.

Windows 운영체제에서 레지스트리 키를 변경하면 예상하지 못한 결과로 Windows 전체를 다시 설치해야 할 수 있습니다. 이 튜토리얼에 따라 레지스트리 키를 추가하거나 편집하는 경우 이러한 문제가 발생하지 않지만, 만약을 대비해 미리 시스템을 백업해 두는 것을 권장합니다. 에픽게임즈는 시스템 레지스트리 수정에 따라 발생하는 시스템 손상에 대해 책임지지 않습니다.

그래픽 드라이버에는 두 개의 레지스트리 키를 추가해야 합니다. 아래 단계에 따라 레지스트리 키를 추가합니다.

  1. Windows 운영체제 검색창에 ‘실행(run)' 을 입력합니다. 실행 애플리케이션을 엽니다.

    이미지를 클릭하면 최대 크기로 볼 수 있습니다.

  2. 검색 필드에 ‘regedit' 을 입력합니다. 예(OK) 를 누르면 레지스트리 편집기가 열립니다.

    이미지를 클릭하면 최대 크기로 볼 수 있습니다.

  3. 레지스트리 편집기 왼쪽에 있는 GraphicsDrivers 섹션으로 이동합니다. 위치는 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers 입니다.

    이미지를 클릭하면 최대 크기로 볼 수 있습니다.

    GraphicsDrivers 폴더에 레지스트리 키를 추가합니다. 하위 폴더에 추가하지 않도록 유의하세요. 올바른 폴더를 선택해야 합니다.

  4. 추가해야 하는 레지스트리 키는 TdrDelay 입니다. 레지스트리 키가 이미 존재한다면 키를 더블클릭한 후 편집합니다. 레지스트리 키가 없다면 오른쪽 패널을 우클릭하고 새로 만들기(New) > DWORD(32비트) 값(DWORD (32-bit) Value) 을 선택합니다.

    새 DWORD 레지스트리 키 생성

  5. 단위(Base)10진수(Decimal) 로 설정합니다. TdrDelay의 값(Value)60 으로 설정합니다. 확인(OK) 을 클릭하여 완료합니다.

    TdrDelay 설정

  6. 두 번째로 추가할 레지스트리 키는 TdrDdiDelay 입니다. 레지스트리 키가 이미 존재한다면 키를 더블클릭한 후 편집합니다. 레지스트리 키가 없다면 오른쪽 패널을 우클릭하고 새로 만들기(New) > DWORD(32비트) 값(DWORD (32-bit) Value) 을 선택해 생성합니다.

  7. 단위(Base)10진수(Decimal) 로 설정합니다. TdrDdiDelay값(Value)60 으로 설정합니다. 확인(OK) 을 클릭하여 완료합니다.

    TdrDdiDelay 설정

  8. 이제 레지스트리에 TdrDelayTdrDdiDelay 가 추가되었습니다.

    이미지를 클릭하면 최대 크기로 볼 수 있습니다.

  9. 레지스트리 편집기를 닫습니다.

  10. 컴퓨터를 재시작하면 변경 사항이 적용됩니다.

위 레지스트리 키를 추가하면 60초가 지나야 Windows가 애플리케이션의 프로세스에 너무 오랜 시간이 걸린다고 판단합니다.

이 방법은 렌더링으로 인한 GPU 크래시를 피하는 데 효과적이지만 모든 크래시를 해결해 주지는 않습니다. 한 번에 너무 많은 데이터를 처리하려고 하면 타임아웃 딜레이에 설정한 시간과 관계없이 GPU 타임아웃이 발생할 수 있습니다. 이 해결책은 그래픽 카드의 처리 시간을 좀 더 확보해 주기 위한 용도로만 만들어졌습니다.

엔진 코드, 드라이버, 운영체제의 버그 조사하기

엔진 코드, 드라이버, 운영체제의 버그도 GPU 크래시를 유발할 수 있습니다. 아래에서는 GPU 크래시의 근본적인 원인이 OOM과 TDR이 아닌 경우 GPU 크래시의 원인 조사를 시작할 때 시도해볼 수 있는 대표적인 몇 가지 방법을 소개합니다.

  • 위에서 설명한 것처럼 -gpucrashdebugging-d3ddebug 를 따로 사용하여 엔진을 실행합니다.

  • -onethread-forcerhibypass 를 사용하여 엔진을 하나의 스레드로만 실행되도록 강제합니다. 이 방법은 원인이 스레딩/타이밍 문제인지 확인하는 데 도움이 됩니다.

  • r.RDG.Debug=1 로 엔진을 실행하여 올바르게 설정되지 않은 렌더 패스 관련 정보를 확인합니다.

  • r.RDG.ImmediateMode=1 로 엔진을 실행하여 렌더 종속성 그래프가 생성 즉시 패스를 실행하도록 강제합니다. 보다 유의미한 콜스택을 확인할 수 있습니다. 이 경우 다른 요소도 변경되므로 잘못된 단서를 얻게 될 수 있다는 점을 유념하시기 바랍니다. 그래도 조사 목적으로는 시도할 가치가 있는 방법입니다.

  • RHI를 변경합니다. 예를 들어, DirectX 12(DX12)를 사용 중이라면 DirectX 11(DX11)로 변경합니다. 한 RHI에서만 크래시가 발생하는 경우 높은 수준의 문제인지, 낮은 수준의 문제인지 확인하는 데 도움이 됩니다. 일부 기능은 특정 RHI에서만 동작합니다. 예를 들어, 하드웨어 레이 트레이싱은 DX12에서만 지원됩니다.

  • 씬에 A/B 테스트를 시행합니다.

    • 렌더링 패스를 켜고 꺼서 크래시가 발생하는지 확인합니다. 패스 오류가 문제인 경우도 많기 때문에 이 방법으로 오류를 확인하면 현재 상황을 파악하는 데 좋은 단서를 얻을 수 있습니다.

    • 루멘, 나나이트, 레이 트레이싱과 같은 렌더링 기능을 켜고 끕니다. 일부 기능은 시스템 재시작이 필요할 수 있습니다.

    • 씬의 특정 오브젝트를 숨기거나 표시합니다. 특정 에셋과 관련된 문제를 파악할 수 있습니다.

GPU 크래시가 특정 드라이버와 관련되어 있을 가능성을 고려하고 있다면 위의 모든 정보가 적용됩니다. 또한, 최신 드라이버를 설치해야 합니다. 해당 드라이버가 유발할 수 있는 알려진 문제가 있는지 제조사에 문의하는 것도 좋은 방법입니다.

GPU 크래시가 운영체제와 관련되어 있을 가능성을 고려하고 있다면 위의 모든 정보가 적용됩니다. 또한, Windows의 경우 버전 20H2 사용을 적극 권장합니다. 현재 사용 중인 Windows 버전은 Windows 키를 누르고 winver 를 입력하면 확인할 수 있습니다.