Sdílet prostřednictvím


Monitorování kontextu

Tento článek obsahuje informace o monitorování kontextu, které bylo zavedeno ve Windows 10 (WDDM 2.0).

Monitorování kontextu umožňuje flexibilní synchronizaci mezi moduly GPU nebo mezi jádry procesoru a moduly GPU. Monitorovaný objekt plotu je pokročilá forma synchronizace plotu, která umožňuje, aby jádro procesoru nebo grafický procesor (GPU) signalizovaly nebo čekaly na konkrétní objekt plotu.

Monitorování vytváření plotu

Modul runtime Direct3D vytvoří monitorovaný objekt plotu voláním ovladače uživatelského režimu (UMD) pfnCreateSynchronizationObject2Cb zpětné volání se strukturou D3DDDICB_CREATESYNCHRONIZATIONOBJECT2. Člen informace této struktury je struktura D3DDDI_SYNCHRONIZATIONOBJECTINFO2, která popisuje synchronizační objekt, který má být vytvořen. Modul runtime nastaví Info.Type na D3DDDI_MONITORED_FENCE, aby označil, že je třeba použít strukturu Info.MonitoredFence při vytváření.

Vytvořený monitorovaný objekt plotu má následující atributy:

  • Počáteční hodnota plotu.
  • Příznaky, které určují způsob čekání a signalizace.

Po vytvoření se monitorovaný objekt plotu vrátí s následujícími informacemi:

Položka Popis
hSyncObject Rukojeť k objektu synchronizace. Tento popisovač se používá při následných voláních Dxgkrnl.
FenceValueCPUVirtualAddress Mapování hodnoty plotu pouze pro čtení (64 bitů) pro procesor Tato adresa je z pohledu procesoru mapována jako WB (cacheovatelná) na platformách podporujících koherenci vstupně-výstupních operací a jako UC (necacheovatelná) na jiných platformách. Umožňuje procesoru sledovat průběh bariéry jednoduše čtením této paměťové lokace. Procesor nemůže zapisovat do tohoto umístění paměti. K signalizaci plotu musí procesor volat SignalSynchronizationObjectFromCpuCb. Adaptéry, které podporují IoMmu, by měly tuto adresu použít pro přístup k GPU. V tomto případě se adresa mapuje jako pro čtení i zápis.
FenceValueGPUVirtualAddress Mapování hodnoty synchronizační bariéry (64 bitů) pro čtení a zápis GPU. Tato adresa je nastavena jako vyžadující koherenci vstupně-výstupních operací na platformách, které ji podporují. Aby mohl GPU signalizovat plot, má povolení zapisovat přímo na tuto virtuální adresu GPU. Grafické procesory IoMmu by neměly používat tuto adresu.

Hodnota plotu je 64bitová hodnota, jejíž odpovídající virtuální adresy jsou zarovnány na 64bitové hranici. GPU by měly deklarovat, zda jsou schopné atomicky aktualizovat 64bitové hodnoty viditelné CPU prostřednictvím přidaného příznaku DXGK_VIDSCHCAPS::No64BitAtomics. Pokud gpu dokáže aktualizovat pouze 32bitové hodnoty atomicky, operační systém automaticky zpracuje případ obtékání plotu. Stanovuje však omezení, že čekací a signální hodnoty plotu nemohou být od poslední signální hodnoty plotu více než UINT_MAX/2.

Signál GPU

Pokud engine GPU není schopen zapisovat do monitorovaného plotu pomocí své virtuální adresy, UMD použije zpětné volání SignalSynchronizationObjectFromGpuCb k zařazení softwarového signálového paketu do kontextu GPU.

K označení plotu z GPU vloží UMD příkaz pro zápis plotu do kontextového příkazového proudu přímo bez procházení režimu jádra. Mechanismus, kterým jádro monitoruje průběh plotu, se liší v závislosti na tom, jestli konkrétní modul GPU podporuje základní nebo pokročilou implementaci monitorovaného plotu.

Po dokončení provádění příkazu ve vyrovnávací paměti na GPU, Dxgkrnl:

  • Prochází seznam plotových objektů s čekajícími požadavky, které by mohly být signalizovány pro tento proces.
  • Čte jejich aktuální hodnotu plotu.
  • Určuje, jestli existují nějaké čekání, které je potřeba zrušit.

Čekání GPU

Aby bylo možné počkat na synchronizační bariéru na motoru GPU, musí UMD nejprve propláchnout čekající vyrovnávací paměť příkazů a potom volat WaitForSynchronizationObjectFromGpuCb s určením synchronizačního objektu (hSyncObject) a hodnotu synchronizace, na kterou se čeká. Dxgkrnl zařadí závislost do své interní databáze, poté se okamžitě vrátí k UMD, aby mohlo pokračovat v zařazování práce za operaci čekání. Vyrovnávací paměti příkazů odeslané po operaci čekání nejsou naplánované na spuštění, dokud nebude operace čekání splněna.

Signál procesoru

Bylo přidáno zpětné volání SignalSynchronizationObjectFromCpuCb, aby procesor mohl signalizovat monitorovaný synchronizační plot. Když procesor signalizuje monitorovaný fencový objekt, Dxgkrnl aktualizuje umístění paměti plotu na signalizovanou hodnotu. Tato hodnota se okamžitě zobrazí všem čtenářům uživatelského režimu a okamžitě ukončí všechny splněné čekací doby.

Čekání procesoru

Bylo přidáno zpětné volání WaitForSynchronizationObjectFromCpuCb, aby procesor mohl čekat na monitorovaný synchro objekt. K dispozici jsou dvě formy čekacích operací:

  • V první podobě WaitForSynchronizationObjectFromCpuCb blokuje, dokud není čekání splněno.
  • Ve druhé formě WaitForSynchronizationObjectFromCpuCb přijímá popisovač události CPU, který je signalizován, jakmile je splněna čekací podmínka.