GPU 선점

Windows 8 시작하여 최신 GPU 선점 모델을 사용할 수 있었습니다. 이 모델에서 운영 체제는 더 이상 GPU DMA(직접 메모리 액세스) 패킷의 선점 기능을 사용하지 않도록 설정할 수 없으며, TDR(시간 제한 검색 및 복구) 프로세스가 시작되기 전에 선점 요청이 GPU로 전송되도록 보장합니다.

요구 사항 Description
최소 WDDM(Windows 디스플레이 드라이버 모델) 버전 1.2
최소 Windows 버전 8
드라이버 구현 - 전체 그래픽 및 렌더링만 필수
WHLK 요구 사항 및 테스트 Device.Graphics... 선점 테스트, Device.Graphics... FlipOnVSyncMmIo

장기 실행 패킷을 성공적으로 선점할 수 없는 경우 DWM(데스크톱 창 관리자)에 필요한 작업과 같은 우선 순위가 높은 GPU 작업이 지연되어 창 전환 및 애니메이션 중에 결함이 발생할 수 있습니다. 또한 선점할 수 없는 장기 실행 GPU 패킷으로 인해 TDR 프로세스가 GPU를 반복적으로 재설정할 수 있으며 결국 시스템 버그 검사가 발생할 수 있습니다.

참고 모든 WDDM 1.2 디스플레이 미니포트 드라이버는 Windows 8 선점 모델을 지원해야 합니다. 그러나 작동 중인 경우 WDDM 1.2 드라이버는 Windows 8 선점 모델을 거부하고 Microsoft DirectX 그래픽 커널 하위 시스템 스케줄러의 Windows 7 동작을 유지할 수도 있습니다.

GPU 선점 디바이스 드라이버 인터페이스(DPI)

디스플레이 미니포트 드라이버에서 Windows 8 GPU 선점 모델을 구현하는 데 사용할 수 있는 DPI(디바이스 드라이버 인터페이스)는 다음과 같습니다.

미니포트 드라이버 구현 표시

다음 일반적인 단계에 따라 디스플레이 미니포트 드라이버에서 Windows 8 GPU 선점 모델을 구현합니다.

  1. DXGKDDI_INTERFACE_VERSION=DXGKDDI_INTERFACE_VERSION_WIN8> 헤더에 대해 드라이버를 컴파일합니다.
  2. DXGK_VIDSCHCAPS 구조체의 PreemptionAwareMultiEngineAware 멤버를 1로 설정하여 Windows 8 GPU 선점 모델에 대한 지원을 선언합니다. Windows 7 선점 모델을 지원하려면 PreemptionAware를 0으로 설정합니다.
  3. D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY 및 D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY열거형의 상수 값을 사용하는 D3DKMDT_PREEMPTION_CAPS 구조에서 지원되는 선점 세분성 수준을 지정합니다.
  4. 하드웨어가 지연 컨텍스트 전환을 지원하는 경우 DxgkDdiSubmitCommand 함수에 길이가 0인 버퍼를 제출하고 pSubmitCommand-Flags-ContextSwitch>> 멤버를 1로 설정합니다. DXGK_SUBMITCOMMANDFLAGS 구조체의 ContextSwitch 멤버 아래에 설명된 내용에 유의하세요.
  5. DxgkCbCreateContextAllocation 함수를 호출하여 GPU 컨텍스트 할당 및 디바이스 컨텍스트 할당을 설정합니다. 함수에 대한 설명에 지정된 특정 지침 및 제한 사항에 유의하세요.
  6. DxgkCbCreateContextAllocation을 사용하여 만든 GPU 컨텍스트 할당 및 디바이스 컨텍스트 할당을 삭제하려면 DxgkCbDestroyContextAllocation 함수를 호출합니다.
  7. DxgkDdiBuildPagingBuffer 함수 호출에 대한 응답으로 DMA 버퍼를 준비하는 경우 DXGKARG_BUILDPAGINGBUFFER 구조 내에서 InitContextResource 내부 구조를 입력하여 컨텍스트 리소스를 초기화합니다. 컨텍스트 리소스가 제거되거나 재배치되는 경우 비디오 메모리 관리자는 컨텍스트 리소스의 콘텐츠를 유지합니다.
  8. 드라이버는 다음 세로 동기화에서 메모리 매핑 I/O 대칭 이동을 지원해야 합니다. Windows 8 GPU 스케줄러는 대칭 이동이 보류 중인 경우에도 하드웨어를 선점하려고 시도합니다. 따라서 아티팩트가 찢어지고 렌더링되지 않도록 하려면 드라이버가 메모리 매핑 I/O 대칭 이동 모델을 지원해야 하며 DXGK_FLIPCAPS 구조체의 FlipOnVSyncMmIo 멤버를 1로 설정하고 FlipOnVSyncMmIo에 설명된 작업을 지원해야 합니다.

구현의 메모리 매핑 고려 사항

Windows 8 GPU 선점 모델을 지원하고 다음 지침에 따라 양질의 사용자 환경을 제공하는 강력한 드라이버를 만듭니다.

  • DirectX 그래픽 커널(Dxgkrnl) 스케줄러가 선점 명령을 보낼 때 GPU에서 중간 DMA 버퍼 선점 요청 중간 DMA 버퍼 선점의 세분성이 더 세분화된 하드웨어 디바이스는 더 나은 고객 환경을 생성해야 합니다.
  • 페이징 명령 펜스 ID를 다시 사용할 수 있도록 허용: 선점 요청으로 인해 하드웨어 큐에서 페이징 명령이 선점된 경우 Dxgkrnl 스케줄러는 선점된 페이징 명령을 원래 사용된 것과 동일한 펜스 ID로 다시 제출하며, 페이징 명령은 해당 엔진의 다른 명령 이전에 예약됩니다. 페이징이 아닌 명령은 새로 할당된 펜스 ID로 다시 전송됩니다.
  • 분할 DMA 버퍼에 대한 패치 위치 목록을 제공합니다. DMA 버퍼 분할을 참조하세요.
  • 바인딩 누수 검색이라는 확인 모드는 패치 위치 목록을 안내하고 바인딩을 해제하지 않거나 각 분할 패킷에 대한 할당을 다시 프로그래밍하지 않는 패킷을 거부하는 데 사용할 수 있습니다. 일부 하드웨어는 가상 주소를 지원하므로 이 확인을 불필요하게 만들 수 있는 추가 수준의 간접 참조를 허용합니다. 이러한 경우 드라이버가 확인 모드에서 옵트아웃함을 나타내려면 DXGK_VIDSCHCAPS 구조체의 NoDmaPatching 멤버를 1로 설정합니다.
  • Windows 7에서 Dxgkrnl 스케줄러는 동일한 렌더링 명령에 해당하는 모든 분할 DMA 패킷이 다른 렌더링 컨텍스트로 전환하지 않고 순차적으로 실행되도록 보장합니다. Windows 8 선점 모델에서 스케줄러는 동일한 렌더링 명령에 해당하는 두 분할 패킷 간에 다른 컨텍스트에서 렌더링 패킷을 실행할 수 있습니다. 따라서 선점 사실을 알고 있는 드라이버는 일반 전체 패킷 제출과 동일한 방식으로 분할/부분 DMA 패킷 제출을 처리해야 합니다. 특히 이러한 제출을 위해 경계에서 GPU 상태를 저장하거나 복원해야 합니다.
  • 선점 인식 드라이버는 여러 물리적 GPU가 연결된 LDA(연결된 디스플레이 어댑터) 모드에서 여러 어댑터로 브로드캐스트될 때 분할 DMA 버퍼의 콘텐츠를 변경해서는 안 됩니다. 여기서 여러 물리적 GPU는 단일, 더 빠른 가상 GPU를 형성합니다. Windows 8 선점 모델에서 Dxgkrnl 스케줄러는 다른 컨텍스트로 전환하지 않고 분할 패킷 시퀀스의 동기 실행을 더 이상 보장하지 않으므로 분할 DMA 패킷의 콘텐츠를 변경한 드라이버는 패킷이 다른 엔진에서 실행된 경우 동일한 DMA 버퍼 데이터 복사본에서 작동하기 때문에 패킷 데이터의 무결성을 손상합니다.
  • Windows 8 GPU 선점 모델에서 Dxgkrnl 스케줄러는 "전송 시 신호" 동기화 기본 형식이 연결된 패킷에 대한 선점 기능을 사용하도록 설정합니다. 디바이스가 하드웨어 기반 대기 상태와 함께 "제출 시 신호" 동기화 기본 형식을 사용하는 경우 대기 조건이 충족되기 전에 대기 명령을 선점하는 기능을 지원해야 합니다.

하드웨어 인증 요구 사항

하드웨어 디바이스가 이 기능을 구현할 때 충족해야 하는 요구 사항에 대한 자세한 내용은 Device.Graphics...의 관련 WHCK 설명서를 참조 하세요. 선점 테스트Device.Graphics... FlipOnVSyncMmIo.

Windows 8 추가된 기능에 대한 검토는 WDDM 1.2 기능을 참조하세요.