Dela via


Kontextövervakning

Den här artikeln innehåller information om kontextövervakning, som introducerades i Windows 10 (WDDM 2.0).

Kontextövervakning möjliggör flexibel synkronisering mellan GPU-motorer eller över processorkärnor och GPU-motorer. Ett övervakat staketobjekt är en avancerad form av stängselsynkronisering som gör att antingen en CPU-kärna eller en GPU-motor kan signalera eller vänta på ett visst stängselobjekt.

Övervakad anläggning av staket

Direct3D-körningen skapar ett övervakat stängselobjekt genom att anropa användarlägesdrivrutinens (UMD) pfnCreateSynchronizationObject2Cb callback med en D3DDDICB_CREATESYNCHRONIZATIONOBJECT2 struktur. Den här strukturens Info medlem är en D3DDDI_SYNCHRONIZATIONOBJECTINFO2 struktur som beskriver synkroniseringsobjektet som ska skapas. Körningstiden ställer in Info.Type till D3DDDI_MONITORED_FENCE för att indikera att strukturen Info.MonitoredFence ska användas under skapandet.

Det skapade övervakade stängselobjektet har följande attribut:

  • Ett initialt stängselvärde.
  • Flaggor som anger dess väntande och signaleringsbeteende.

Vid skapandet returneras ett övervakat stängselobjekt med följande information:

Sak Beskrivning
hSyncObject Handtag för synkroniseringsobjektet. Det här handtaget används i efterföljande anrop till Dxgkrnl.
FenceValueCPUVirtualAddress Skrivskyddad mappning av stängselvärdet (64 bitar) för processorn. Den här adressen är mappad som WB (cachebar) sett från processorns perspektiv på plattformar som stöder I/O-koherens, UC (icke-cachelagrad) på andra plattformar. Gör att processorn kan hålla reda på stängsel förloppet genom att bara läsa den här minnesplatsen. Processorn kan inte skriva till den här minnesplatsen. För att signalera till stängslet måste processorn anropa SignalSynchronizationObjectFromCpuCb. Kort som stöder IoMmu bör använda den här adressen för GPU-åtkomst. Adressen mappas som läs- och skrivbar i det här fallet.
FenceValueGPUVirtualAddress Läs-/skrivmappning av stängselvärdet (64 bitar) för GPU:n. Den här adressen mappas som krävs för I/O-koherens på plattformar som stöder det. För att signalera stängslet kan GPU:n skriva direkt till den här virtuella GPU-adressen. IoMmu-GPU:er bör inte använda den här adressen.

Stängselvärdet är ett 64-bitars värde med sina respektive virtuella adresser justerade på en 64-bitarsgräns. GPU:er bör deklarera om de kan atomiskt uppdatera 64-bitarsvärden som visas av processorn via den tillagda DXGK_VIDSCHCAPS::No64BitAtomics flagga. Om en GPU endast kan uppdatera 32-bitarsvärden atomiskt hanterar operativsystemet stängselomslutningen automatiskt. Men det placerar en begränsning att väntande vänte- och signalbarriärvärden inte kan vara mer än UINT_MAX/2 bort från värdet för den senaste signalerade barriären.

GPU-signal

Om en GPU-motor inte kan skriva till ett övervakat staket med hjälp av sin virtuella adress använder UMD SignalSynchronizationObjectFromGpuCb återanropet för att köa ett mjukvarusignalpaket till GPU-kontexten.

För att signalera stängslet från GPU:n infogar UMD ett stängselskrivningskommando i en kontextkommandoström direkt utan att gå igenom kernelläget. Den mekanism genom vilken kärnan övervakar spärrens framsteg varierar beroende på huruvida en viss GPU-enhet stödjer den grundläggande eller avancerade implementeringen av den övervakade spärren.

När en kommandobuffert slutför körningen av GPU:n Dxgkrnl:

  • Går igenom listan över stängselobjekt med väntande väntetider som kan signaleras för den här processen.
  • Läser deras aktuella stängselvärde.
  • Avgör om det finns några väntetider som måste brytas.

GPU-väntan

För att vänta på en övervakad fence på en GPU-motor måste UMD först flusha sin väntande kommandobuffer och sedan anropa WaitForSynchronizationObjectFromGpuCb och ange fence-objektet (hSyncObject) samt fence-värdet som man väntar på. Dxgkrnl köar beroendet till den interna databasen och återgår sedan omedelbart till UMD så att det kan fortsätta att köa arbetet bakom vänteåtgärden. Kommandobuffertar som skickas in efter vänteåtgärden kommer inte att schemaläggas för körning förrän vänteåtgärden är uppfylld.

CPU-signal

SignalSynchronizationObjectFromCpuCb callback lades till för att tillåta processorn att signalera ett övervakat fence-objekt. När processorn signalerar ett övervakat staketobjekt uppdaterar Dxgkrnl platsen för stängslets minne med det signalerade värdet. Det här värdet blir omedelbart synligt för alla läsare i användarläge och frigör omedelbart alla nöjda väntetider.

CPU-väntan

En callback-funktion WaitForSynchronizationObjectFromCpuCb lades till för att möjliggöra att processorn kan vänta på ett övervakat staketobjekt. Det finns två typer av vänteåtgärder:

  • I den första formen WaitForSynchronizationObjectFromCpuCb blockerar tills väntetiden är avklarad.
  • I den andra formen WaitForSynchronizationObjectFromCpuCb hanterar en CPU-händelse som signaleras så snart väntevillkoret är uppfyllt.