다음을 통해 공유


컨텍스트 모니터링

이 문서에서는 Windows 10(WDDM 2.0)에서 도입된 컨텍스트 모니터링에 대한 정보를 제공합니다.

컨텍스트 모니터링을 사용하면 GPU 엔진 간 또는 CPU 코어와 GPU 엔진 간에 유연한 동기화가 가능합니다. 모니터링되는 펜스 개체 CPU 코어 또는 GPU 엔진이 특정 펜스 개체에 신호를 받거나 대기할 수 있는 고급 형태의 펜스 동기화입니다.

모니터링된 펜스 만들기

Direct3D 런타임은 사용자 모드 드라이버(UMD)의 pfnCreateSynchronizationObject2Cb 콜백을 D3DDDICB_CREATESYNCHRONIZATIONOBJECT2 구조와 함께 호출하여 모니터링 펜스 객체를 생성합니다. 이 구조의 Info 멤버는 생성할 동기화 개체를 설명하는 D3DDDI_SYNCHRONIZATIONOBJECTINFO2 구조체입니다. 런타임은 Info.TypeD3DDDI_MONITORED_FENCE로 설정하여 Info.MonitoredFence 구조를 생성 시 사용할 것임을 나타냅니다.

생성된 모니터링되는 펜스 개체에는 다음과 같은 특성이 있습니다.

  • 초기 펜스 값입니다.
  • 대기 및 신호 동작을 지정하는 플래그입니다.

만들면 모니터링되는 펜스 개체가 다음 정보와 함께 반환됩니다.

항목 묘사
hSyncObject 동기화 개체에 대한 핸들입니다. 이 핸들은 Dxgkrnl후속 호출에 사용됩니다.
FenceValueCPUVirtualAddress CPU의 펜스 값(64비트)에 대한 읽기 전용 매핑입니다. 이 주소는 I/O 일관성을 지원하는 플랫폼의 CPU 관점에서 WB(캐시 가능한)로, 다른 플랫폼에서는 UC(캐시되지 않는)로 매핑됩니다. CPU가 이 메모리 위치를 읽는 것만으로 펜스 진행률을 추적할 수 있습니다. CPU는 이 메모리 위치에 쓸 수 없습니다. 펜스를 신호하려면 CPU가 SignalSynchronizationObjectFromCpuCb호출해야 합니다. IoMmu를 지원하는 어댑터는 GPU 액세스에 이 주소를 사용해야 합니다. 이 경우 주소가 읽기/쓰기로 매핑됩니다.
FenceValueGPUVirtualAddress GPU에 대한 펜스 값(64비트)의 읽기/쓰기 매핑입니다. 이 주소는 지원하는 플랫폼에서 I/O 일관성을 요구하는 것으로 매핑됩니다. 펜스를 신호하기 위해 GPU는 주어진 GPU 가상 주소에 직접 쓸 수 있습니다. IoMmu GPU는 이 주소를 사용하면 안 됩니다.

펜스 값은 각각의 가상 주소가 64비트 경계에 맞춰 정렬된 64비트 값입니다. GPU는 추가된 DXGK_VIDSCHCAPS::No64BitAtomics 플래그를 통해 CPU에서 볼 수 있는 64비트 값을 원자성으로 업데이트할 수 있는지 여부를 선언해야 합니다. GPU가 32비트 값만 원자적으로 업데이트할 수 있는 경우, OS는 펜스 랩어라운드 상황을 자동으로 처리합니다. 그러나 남아있는 대기 및 신호 펜스 값은 마지막으로 신호된 펜스 값에서 UINT_MAX/2 이상으로 떨어져 있을 수 없다는 제한이 있습니다.

GPU 신호

GPU 엔진이 가상 주소를 사용하여 모니터되는 펜스에 기록할 수 없는 경우 UMD는 SignalSynchronizationObjectFromGpuCb 콜백을 사용하여 GPU 컨텍스트에 소프트웨어 신호 패킷을 큐에 추가합니다.

GPU 펜스를 신호하기 위해 UMD는 커널 모드를 거치지 않고 펜스 쓰기 명령을 컨텍스트 명령 스트림에 직접 삽입합니다. 커널이 펜스 진행률을 모니터링하는 메커니즘은 특정 GPU 엔진이 모니터링되는 펜스의 기본 또는 고급 구현을 지원하는지 여부에 따라 달라집니다.

명령 버퍼가 GPU에서 실행을 완료하면 Dxgkrnl:

  • 펜스 개체 목록 중에서 이 프로세스에 대해 신호를 보낼 수 있는 대기가 보류 중인 것을 검토합니다.
  • 현재 펜스 값을 읽습니다.
  • 검토할 대기가 있는지 여부를 결정합니다.

GPU 대기

GPU 엔진에서 모니터링된 펜스를 기다리려면, UMD는 먼저 보류 중인 명령 버퍼를 플러시한 후, WaitForSynchronizationObjectFromGpuCb를 호출하여 대기 중인 펜스 개체(hSyncObject)와 대기 중인 펜스 값을 지정해야 합니다. Dxgkrnl 종속성을 내부 데이터베이스에 큐에 넣은 후, 대기 작업 뒤에 작업을 계속 큐에 대기시킬 수 있도록 즉시 UMD로 반환합니다. 대기 작업 후에 제출된 명령 버퍼는 대기 작업이 충족될 때까지 실행이 예약되지 않습니다.

CPU 신호

CPU가 모니터링되는 펜스 개체에 신호를 보낼 수 있도록 SignalSynchronizationObjectFromCpuCb 콜백이 추가되었습니다. CPU가 모니터링되는 펜스 개체에 신호를 보낼 때 Dxgkrnl 펜스 메모리 위치를 신호 값으로 업데이트합니다. 이 값은 모든 사용자 모드 판독기에서 즉시 표시되고 만족된 모든 대기를 즉시 해제합니다.

CPU 대기

CPU가 모니터링되는 펜스 개체에서 대기할 수 있도록 하기 위해 WaitForSynchronizationObjectFromCpuCb 콜백이 추가되었습니다. 다음 두 가지 형태의 대기 작업을 사용할 수 있습니다.

  • 첫 번째 형태에서 WaitForSynchronizationObjectFromCpuCb는 대기가 충족될 때까지 차단됩니다.
  • 두 번째 형식에서 WaitForSynchronizationObjectFromCpuCb는 대기 조건이 충족되면 신호가 발생하는 CPU 이벤트의 핸들을 가져옵니다.