다음을 통해 공유


할당 알림

Important

일부 정보는 상용 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적, 또는 묵시적인 보증을 하지 않습니다.

페이징 제거 또는 승격 작업을 수행하려는 할당에 대해 특정 작업을 수행해야 하는 경우가 있습니다. 예를 들어 할당은 디바이스 액세스에 있을 때 압축될 수 있습니다. 해당 할당이 제거되는 경우(즉, 디바이스 액세스에서 더 이상 없음) KMD(커널 모드 드라이버)는 먼저 실제 제거 전에 압축을 해제해야 합니다. DXGK_OPERATION_NOTIFY_ALLOC 페이징 작업은 이러한 용도로 설계되었습니다. 이 작업은 Windows 11 버전 24H2(WDDM 3.2)부터 사용할 수 있습니다.

할당 알림을 요청하는 방법

시스템이 DxgkDdiCreateAllocation을 호출하여 할당을 만들 때 KMD는 DXGK_ALLOCATIONINFOFLAGS2 플래그를 설정하여 Dxgkrnl에 DXGK_OPERATION_NOTIFY_ALLOC 페이징 작업을 수행하도록 지시할 수 있습니다. 현재 알림 플래그는 다음과 같습니다.

  • NotifyEviction
  • NotifyIoMmuUnmap

DDI 변경 내용

DXGK_OPERATION_NOTIFY_ALLOC 페이징 작업이 추가됨

  • DXGK_OPERATION_NOTIFY_ALLOC 페이징 작업이 DXGK_BUILDPAGINGBUFFER_OPERATION 추가됩니다.

  • DXGK_BUILDPAGINGBUFFER_NOTIFYALLOC 구조체는 DXGK_OPERATION_NOTIFY_ALLOC 작업에 사용하기 위해 추가됩니다.

DXGK_ALLOCATIONINFOFLAGS2 추가된 플래그

다음 플래그가 DXGK_ALLOCATIONINFOFLAGS2 추가됩니다.

  • NotifyEviction

    KMD는 DxgkDdiCreateAllocation 구현에서 NotifyEviction 플래그를 설정합니다. 이 플래그는 Dxgkrnl이 할당을 제거하기 전에 드라이버에 DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction 작업을 실행해야 임을 나타냅니다.

    플래그가 지정되고 할당이 제거될 때:

    • Dxgkrnl은 할당을 페이징 프로세스의 VA(GPU 가상 주소) 공간에 매핑합니다.
    • Dxgkrnl은 DXGK_OPERATION_NOTIFY_ALLOC 작업 및 NotifyEviction 플래그를 사용하여 DxgkDdiBuildPagingBuffer호출합니다.
    • 드라이버는 페이징 DMA 버퍼에서 명령을 빌드합니다.
    • 페이징 DMA 버퍼는 시스템 컨텍스트에서 실행을 위해 제출됩니다.
    • Dxgkrnl 은 페이징 프로세스 GPU VA 공간에서 할당의 매핑을 해제합니다.

    할당 크기가 페이징 프로세스 GPU VA 공간의 크기보다 큰 경우 이러한 단계를 여러 번 실행할 수 있습니다.

    Dxgkrnl 은 할당이 조리개 세그먼트 또는 암시적 시스템 메모리 세그먼트에서 제거되는 경우에만 드라이버에 알림을 보냅니다.

  • NotifyIoMmuUnmap

    KMD는 DxgkDdiCreateAllocation 함수에서 NotifyIoMmuUnmap 플래그를 설정합니다. 이 플래그는 Dxgkrnl이 IOMMU에서 할당을 매핑 해제하기 전에 DXGK_OPERATION_NOTIFY_ALLOC NotifyIoMmuUnmap 작업을 실행해야 했음을 나타냅니다. 드라이버는 내부 캐시를 지울 수 있습니다. 드라이버는 페이징 작업에서 반환된 후 할당 GPU VA에 액세스하지 않도록 해야 합니다.

    플래그가 지정되고 제거 중에 IOMMU에서 할당이 매핑 해제되는 경우:

    • Dxgkrnl은 DXGK_OPERATION_NOTIFY_ALLOC 작업 및 NotifyIoMmuUnmap 플래그를 사용하여 DxgkDdiBuildPagingBuffer를 호출합니다.
    • 드라이버는 페이징 DMA 버퍼에서 명령을 빌드합니다.
    • 페이징 DMA 버퍼는 시스템 컨텍스트에서 실행을 위해 제출됩니다.
    • Dxgkrnl 은 모든 페이징 작업이 완료되기를 기다립니다.
    • 할당이 IOMMU에서 매핑되지 않습니다.

    알림은 디바이스가 GpuVaIoMmu 또는 GpuVaIoMmuGlobal 가상 주소 지정 모델을 지원하는 경우에만 전송됩니다.

페이징 프로세스 GPU VA 공간 크기

페이징 프로세스 GPU VA 공간의 크기를 가져오기 위해 DXGKQAITYPE_PAGINGPROCESSGPUVASIZE DXGK_QUERYADAPTERINFOTYPE 열거형에 추가됩니다.

DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction 작업을 수행하려면 해당 할당을 페이징 프로세스 GPU VA 공간에 매핑해야 합니다. Dxgkrnl 은 로컬 메모리 세그먼트가 있거나 하드웨어 예약이 사용하도록 설정된 경우에만 페이징(시스템) 프로세스에 GPU VA 공간을 할당합니다. GPU VA 공간의 크기는 가장 큰 로컬 메모리 세그먼트의 4분의 1 또는 하드웨어 예약 로그 버퍼의 크기 중 더 큽니다. 결과 GPU VA 크기는 전체 할당을 매핑하기 위해 작을 수 있습니다. 이 경우 드라이버는 페이징 프로세스 GPU VA 공간의 크기를 지정해야 합니다.

Dxgkrnl은 다음과 같이 DXGKARG_QUERYADAPTERINFO 구조로 DxgkDdiQueryAdapterInfo를 호출하여 페이징 프로세스 GPU VA 공간의 크기를 가져옵니다.

  • 형식이 DXGKQAITYPE_PAGINGPROCESSGPUVASIZE 설정됩니다.
  • pInputData 는 LDA 구성에서 실제 어댑터 인덱스를 지정하는 UINT 값을 가리킵니다. Dxgkrnl은 비 LDA 구성에 대해 0으로 설정합니다.
  • InputDataDataSizesizeof(UINT).
  • pOutputData 는 드라이버가 페이징 프로세스 GPU VA 공간의 크기를 MB 단위로 반환하는 UINT 값을 가리킵니다.
  • OutputDataSizesizeof(UINT).

드라이버가 호출에 실패하거나 pOutputData 값 0을 반환하는 경우 OS는 페이징 프로세스 GPU VA 크기를 결정합니다.

어댑터에 큰 로컬 메모리 세그먼트가 있는 경우 드라이버는 OS가 페이징 프로세스 GPU VA 공간의 크기를 선택할 수 있도록 0을 반환해야 합니다. VA 공간이 클수록 페이징 프로세스 GPU 페이지 테이블에 더 많은 메모리가 필요합니다. 페이지 테이블은 항상 상주하므로 드라이버는 VA 공간에 불필요한 큰 크기를 지정해서는 안 됩니다.

페이징 작업(채우기, 전송, 할당 알림)은 할당 크기가 페이징 프로세스 GPU VA 공간 크기를 초과할 때 청크 단위로 수행됩니다.