다음을 통해 공유


컨텍스트 모니터링

이 문서에서는 GPU 엔진 또는 CPU 코어와 GPU 엔진 간에 유연한 동기화를 허용하는 컨텍스트 모니터링에 대한 정보를 제공합니다. 펜스 동기화의 고급 형태인 모니터링된 펜스 개체를 사용하면 CPU 코어 또는 GPU 엔진이 특정 펜스 개체에 신호를 받거나 대기할 수 있습니다.

모니터링된 펜스 만들기

Direct3D 런타임은 D3DDDI_MONITORED_FENCE 동기화 개체 형식으로 UMD(사용자 모드 드라이버) CreateSynchronizationObjectCb 콜백을 호출하여 모니터링되는 펜스 개체를 만듭니다.

모니터링되는 펜스 개체는 다음 특성과 함께 만들어집니다.

  • 초기 값
  • 플래그(대기 및 신호 동작 지정)

생성 시 그래픽 커널은 다음 항목으로 구성된 펜스 개체를 반환합니다.

항목 Description
hSyncObject 동기화 개체에 대한 핸들입니다. 그래픽 커널 호출에서 참조하는 데 사용됩니다.
FenceValueCPUVirtualAddress CPU에 대한 펜스 값(64비트)의 읽기 전용 매핑입니다. 이 주소는 다른 플랫폼에서 I/O 일관성, UC(캐시되지 않음)를 지원하는 플랫폼의 CPU 관점에서 WB(캐시 가능)로 매핑됩니다. 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에서 실행을 완료하면 그래픽 커널:

  • 이 프로세스에 대해 신호를 받을 수 있는 보류 중인 대기가 있는 펜스 개체 목록을 살펴봅니다.
  • 현재 펜스 값을 읽습니다.
  • 해제해야 하는 대기가 있는지 여부를 결정합니다.

GPU 대기

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

CPU 신호

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

CPU 대기

CPU가 모니터링되는 펜스 개체에서 대기할 수 있도록 WaitForSynchronizationObjectFromCpuCb 콜백이 추가되었습니다. 두 가지 형태의 대기 작업을 사용할 수 있습니다. 첫 번째 양식에서 WaitForSynchronizationObjectFromCpuCb 는 대기가 충족될 때까지 차단합니다. 두 번째 형식에서 WaitForSynchronizationObjectFromCpuCb 는 대기 조건이 충족되면 신호를 받는 CPU 이벤트에 대한 핸들을 사용합니다.