다음을 통해 공유


할당 사용량 추적

할당 목록이 사라지면 비디오 메모리 관리자(VidMm)는 더 이상 특정 명령 버퍼에서 참조되는 할당에 대한 가시성이 없습니다. 따라서 VidMm은 더 이상 할당 사용량을 추적하고 관련 동기화를 처리할 수 있는 위치에 있지 않습니다. 이제 이 책임은 UMD(사용자 모드 드라이버)에 해당합니다. 특히 UMD는 할당 및 이름 바꾸기에 대한 직접 CPU 액세스와 관련하여 동기화를 처리해야 합니다.

VidMm은 호출 스레드 및 성능에 대해 차단되지 않는 안전한 방식으로 할당 삭제를 비동기적으로 연기합니다. 따라서 UMD는 할당 파기를 연기해야 하는 것에 대해 걱정할 필요가 없습니다. VidMm이 할당 소멸 요청을 받으면 기본적으로 소멸 요청 전에 큐에 대기 중인 명령이 잠재적으로 삭제되는 할당에 액세스할 수 있다고 가정합니다. 따라서 VidMm은 큐에 대기된 명령이 완료될 때까지 소멸 작업을 연기합니다. 보류 중인 명령이 삭제되는 할당에 액세스하지 못한다는 것을 UMD가 알고 있는 경우 Deallocate2 또는 DestroyAllocation2를 호출할 때 AssumeNotInUse 플래그를 설정하여 대기하지 않고 VidMm에 요청을 처리하도록 지시할 수 있습니다.

Lock2

UMD는 직접 CPU 액세스와 관련하여 적절한 동기화를 처리해야 합니다. 특히 UMD는 다음을 수행해야 합니다.

  1. UMD가 자체 이름 바꾸기 체계를 구현해야 한다는 것을 의미하는 잠금 의미 체계를 덮어쓰지 않고 삭제를 지원합니다.

  2. 동기화가 필요한 맵 작업의 경우(즉, 위의 덮어쓰지 않거나 삭제하지 않음):

    • 현재 사용 중인 할당에 액세스하려고 시도하고 호출자가 잠금 작업에서 호출 스레드(D3D11_MAP_FLAG_DO_NOT_WAIT)를 차단하지 않도록 요청한 경우 WasStillDrawing을 반환합니다.
    • 또는 D3D11_MAP_FLAG_DO_NOT_WAIT 플래그가 설정되지 않은 경우 CPU 액세스에 할당을 사용할 수 있게 될 때까지 기다립니다. UMD는 폴링하지 않는 대기를 구현해야 합니다. UMD는 새 컨텍스트 모니터링 메커니즘을 사용합니다.

지금은 UMD가 LockCb UnlockCb/를 호출하여 VidMm에 CPU 액세스에 대한 할당을 설정하도록 요청해야 합니다. 대부분의 경우 UMD는 할당을 전체 수명 동안 매핑된 상태로 유지할 수 있습니다. 그러나 나중에 LockCbUnlockCb 는 새 Lock2CbUnlock2Cb 호출을 위해 더 이상 사용되지 않습니다. 이러한 최신 콜백의 목표는 새로운 인수 및 플래그 집합을 사용하여 새로운 클린 구현을 제공하는 것입니다.

스위즐링 범위는 WDDM 버전 2에서 제거됩니다. Lock2Cb를 기반으로 하는 구현으로 이동할 때 LockCb 호출에서 스위즐링 범위에 대한 종속성을 제거하는 것은 드라이버 개발자의 책임입니다.

Lock2Cb 는 할당에 대한 가상 주소를 가져오기 위한 간단한 방법으로 노출됩니다. 할당 유형 및 현재 상주하는 현재 세그먼트에 따라 몇 가지 제한 사항이 있습니다.

드라이버는 DXGK_SEGMENTDESCRIPTOR 구조체Flags 멤버에 있는 CpuVisible 플래그를 통해 세그먼트가 CPU에 액세스할 수 있는지 여부를 나타냅니다.

CPU 액세스 가능 할당의 경우:

  • 캐시된 CPU 액세스 가능 할당은 조리개 세그먼트 내에 있어야 하며 잠기려면 상주하지 않아야 합니다. CPU와 GPU(그래픽 처리 장치)의 메모리 세그먼트 간의 캐시 일관성을 보장할 수 없습니다.
  • 완전히 CPU에 액세스할 수 있는 메모리 세그먼트에 있는 CPU 액세스 가능 할당(크기 조정 가능한 BAR를 사용하여 크기 조정)은 잠금이 가능하고 가상 주소를 반환할 수 있도록 보장됩니다. 이 시나리오에서는 특별한 제약 조건이 필요하지 않습니다.
  • CPU 액세스가 불가능한 메모리 세그먼트 내에 있는 CPU 액세스 가능 할당( CpuHostAperture에 대한 액세스 여부에 관계없이)은 여러 가지 이유로 CPU 가상 주소에 매핑되지 않을 수 있습니다. CpuHostAperture가 사용 가능한 공간이 부족하거나 할당이 조리개 세그먼트를 지정하지 않으면 가상 주소를 가져올 수 없습니다. 이러한 이유로 CPU에 액세스할 수 없는 메모리 세그먼트의 모든 CPU 액세스 가능 할당은 지원되는 세그먼트 집합에 조리개 세그먼트를 포함해야 합니다. 이 요구 사항은 VidMm이 시스템 메모리 내에 할당을 배치하고 가상 주소를 제공할 수 있도록 보장합니다.
  • 시스템 메모리 내에 이미 있는 CPU 액세스 가능 할당(및/또는 조리개 세그먼트에 매핑됨)이 작동하도록 보장됩니다.

CPU에 액세스할 수 없는 할당의 경우:

  • CPU 액세스 가능 할당은 GPU 프레임 버퍼를 직접 가리킬 수 없는 섹션 개체에 의해 지원됩니다. CPU에 액세스할 수 없는 할당을 잠그려면 할당이 지원되는 세그먼트 집합의 조리개 세그먼트를 지원하거나 이미 시스템 메모리에 있어야 합니다(디바이스에 상주하지 않아야 함).

할당이 디바이스에 상주하지 않지만 조리개 세그먼트를 지원하지 않는 동안 할당이 성공적으로 잠겨 있으면 잠금 기간 동안 메모리 세그먼트에 할당을 커밋해서는 안 됩니다.

Lock2 에는 현재 플래그가 없으며 예약된 플래그 비트는 모두 0이어야 합니다.

CpuHostAperture

BAR 크기 조정이 실패할 때 CPU에 액세스할 수 없는 메모리 세그먼트를 사용하여 잠금을 더 잘 지원하기 위해 PCI 조리개에 CpuHostAperture 가 제공됩니다. CpuHostApertureDxgkDdiMapCpuHostAperture DDI(디바이스 드라이버 인터페이스) 함수를 통해 비디오 메모리 영역에 직접 매핑할 수 있는 페이지 기반 관리자로 작동합니다. 그런 다음 VidMm은 가상 주소 공간 범위를 CpuHostAperture의 인접하지 않은 범위에 직접 매핑하고 CpuHostAperture 를 가진 다음, 스위즐링 범위 없이 비디오 메모리에 매핑할 수 있습니다.

CPU에서 액세스할 수 없는 메모리 세그먼트 내에서 CPU가 참조할 수 있는 잠금 가능한 메모리의 최대 크기는 CpuHostAperture의 크기로 제한됩니다. CpuHostAperture를 DirectX 그래픽 커널에 노출하기 위한 세부 정보는 CPU 호스트 조리개에서 찾을 수 있습니다.

I/O 일관성

현재 x86/x64에서 모든 GPU는 GPU가 캐시 가능한 시스템 메모리 표면에 읽거나 쓰고 CPU와의 일관성을 유지하기 위해 PCIe에 대한 I/O 일관성을 지원해야 합니다. 표면이 GPU의 관점에서 캐시 일관성으로 매핑되는 경우 GPU는 표면에 액세스할 때 CPU 캐시를 스누핑해야 합니다. 이러한 형태의 일관성은 일반적으로 CPU가 읽을 것으로 예상되는 리소스(예: 일부 스테이징 표면)에 사용됩니다.

일부 Arm 플랫폼에서는 I/O 일관성이 하드웨어에서 직접 지원되지 않습니다. 이러한 플랫폼에서는 CPU 캐시 계층 구조를 수동으로 무효화하여 I/O 일관성을 에뮬레이트해야 합니다. VidMm은 GPU(할당 목록 읽기/쓰기 작업) 및 CPU(맵 작업, 읽기/쓰기)에서 오는 할당에 대한 작업을 추적하여 수행합니다. VidMm은 캐시에 다음 중 하나가 포함될 수 있다고 판단할 때 캐시 무효화를 내보낸다.

  • 다시 작성해야 하는 데이터(CPU 쓰기, GPU 읽기)
  • 무효화해야 하는 부실 데이터(GPU 쓰기, CPU 읽기).

I/O 일관성이 없는 플랫폼에서 할당에 대한 CPU 및 GPU 액세스를 추적하는 책임은 UMD에 해당합니다. 그래픽 커널은 UMD가 캐시 가능한 할당과 연결된 가상 주소 범위를 다시 작성하고 무효화하는 데 사용할 수 있는 새 Invalidate CacheDDI를 노출합니다. I/O 일관성을 지원하지 않는 플랫폼에서 UMD는 CPU 쓰기 후와 GPU 읽기 전, 쓰기 후 및 CPU 읽기 전에 이 함수를 호출해야 합니다. 후자는 처음에는 적합하지 않은 것처럼 보일 수 있습니다. 그러나 CPU가 메모리에 쓰기 전에 데이터를 추측적으로 읽을 수 있으므로 CPU가 RAM에서 데이터를 다시 읽을 수 있도록 모든 CPU 캐시를 무효화해야 합니다.