Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Když seznam přidělení zmizí, správce paměti videa (VidMm) už nemá přehled o přiděleních odkazovaných v konkrétní vyrovnávací paměti příkazů. V důsledku toho už VidMm není v pozici sledovat využívání alokace a zpracovat související synchronizaci. Tato odpovědnost nyní spadá do ovladače uživatelského režimu (UMD). UMD musí zejména zvládnout synchronizaci s ohledem na přímý přístup CPU k alokaci a přejmenování.
VidMm asynchronně odkládá destrukci přidělení bezpečným způsobem, který je neblokující pro volající vlákno a zároveň výkonově efektivní. Jako takový UMD se nemusí starat o odklad zničení alokace. Když VidMm obdrží žádost o zničení přidělení, ve výchozím nastavení předpokládá, že příkazy ve frontě před touto žádostí mohou potenciálně přistupovat k přidělení, které je likvidováno. VidMm tak odkládá operaci ničení až do doby, kdy se dokončí zařazené příkazy. Pokud UMD ví, že čekající příkazy nemají přístup k přidělení, které je zničeno, může instruovat VidMm zpracovat požadavek bez čekání nastavením příznaku AssumeNotInUse při volání Deallocate2 nebo DestroyAllocation2.
Zámek 2
UmD zodpovídá za zpracování správné synchronizace s ohledem na přímý přístup k procesoru. Zejména se vyžaduje, aby umd:
Podpora sémantik zámku bez přepsání a zahození, což znamená, že UMD musí implementovat své vlastní schéma přejmenování.
U operací mapování vyžadujících synchronizaci (to znamená, že se nejedná o výše uvedenou operaci bez přepsání nebo zahození):
- Vrátit WasStillDrawing, pokud je proveden pokus o přístup k přidělení, které je aktuálně zaneprázdněné, a volající požádal, aby operace Lock neblokuje volající vlákno (D3D11_MAP_FLAG_DO_NOT_WAIT).
- Pokud není příznak D3D11_MAP_FLAG_DO_NOT_WAIT nastavený, počkejte, až bude přidělení dostupné pro přístup k procesoru. UmD musí implementovat nepolující čekání. UmD bude využívat nový mechanismus monitorování kontextu.
Prozatím UMD nadále potřebuje zavolat LockCb/UnlockCb k požádání VidMm, aby nastavil alokaci pro přístup k procesoru. Ve většině případů dokáže UMD udržovat alokaci namapovanou po celou dobu její životnosti. V budoucnu však budou LockCb a UnlockCb vyřazeny ve prospěch nových volání Lock2Cb a Unlock2Cb. Cílem těchto novějších zpětných volání je poskytnout čistou a novou implementaci s novou sadou argumentů a příznaků.
Rozsahy swizzování jsou odstraněny z WDDM verze 2. Je zodpovědností vývojáře ovladače odstranit závislost na předrtěním rozsahů z volání do LockCb, jak se přesouvají k implementaci, která je založená na Lock2Cb.
Lock2Cb je vystaven jako jednoduchá metoda pro získání virtuální adresy k přidělení. Existuje několik omezení na základě typu přidělení a aktuálního segmentu, ve kterém se nachází.
Ovladač označuje, jestli je segment přístupný procesorem prostřednictvím příznaku CpuVisible, který je členem flags DXGK_SEGMENTDESCRIPTOR struktury.
Přidělení přístupná pro CPU:
- Aby bylo možné uzamknout přidělení procesoru dostupné v mezipaměti, musí se nacházet v rámci segmentu clony nebo nesmí být rezidentní. Nemůžeme zaručit koherenci mezipaměti mezi procesorem a segmentem paměti v grafické procesorové jednotce (GPU).
- Přidělení přístupná k procesoru umístěná v plně škálovatelném segmentu paměti (se změněnou velikostí pomocí škálovatelného pruhu) jsou zaručená, že jsou zamknutá a můžou vrátit virtuální adresu. V tomto scénáři nejsou vyžadována žádná zvláštní omezení.
- Přidělení, k nimž má CPU přístup a která jsou umístěna v paměťovém segmentu, do kterého CPU nemá přístup (s nebo bez přístupu k CpuHostAperture), se z různých důvodů mohou nepodařit namapovat na virtuální adresu CPU. Pokud je CpuHostAperture mimo dostupné místo nebo přidělení nezadá aperturový segment, virtuální adresu není možné získat. Z tohoto důvodu musí všechna přidělení přístupná procesoru v segmentech paměti, které procesor nenabízí, v podporované sadě segmentů obsahovat segment apertury. Tento požadavek zaručuje, že VidMm dokáže umístit přidělení do systémové paměti a poskytnout virtuální adresu.
- Přidělení přístupná k procesoru, která jsou již umístěná v systémové paměti (nebo mapované do segmentu clony), je zaručeno, že budou fungovat.
Pro přidělení, která nejsou přístupná procesoru:
- Přidělení přístupná k procesoru jsou zajištěna objekty oddílů, které nemůžou přímo odkazovat na vyrovnávací paměť rámce GPU. Aby bylo možné uzamknout přidělení nepřístupné procesoru, musí přidělení podporovat segment clony v podporované sadě segmentů nebo již se nacházet v systémové paměti (nesmí být na zařízení rezidentní).
Pokud je přidělení úspěšně uzamčeno, zatímco přidělení není v zařízení rezidentní, ale nepodporuje segment clony, nesmí být přidělení potvrzeno do segmentu paměti po dobu trvání zámku.
Lock2 v současné době neobsahuje žádné příznaky a rezervované bity příznaků musí být 0.
CpuHostAperture
K lepší podpoře uzamykání u paměťových segmentů, které nejsou přístupné z CPU, když selže změna velikosti BARu, je v PCI cloně k dispozici CpuHostAperture. CpuHostAperture se chová jako správce založený na stránkách, který lze pak přímo mapovat do oblastí paměti videa prostřednictvím funkce DxgkDdiMapCpuHostAperture rozhraní ovladače zařízení (DDI). VidMm pak může mapovat rozsah virtuálního adresního prostoru přímo na nesouvislý rozsah CpuHostAperture a poté namapovat CpuHostAperture na paměť videa bez nutnosti změny rozsahů.
Maximální množství zamknutelné paměti, na kterou může CPU odkazovat v rámci segmentů paměti nepřístupných procesoru, je omezeno na velikost CpuHostAperture. Podrobnosti o zveřejnění CpuHostAperture grafickému jádru DirectX najdete v části CPU host aperture.
Koherence vstupně-výstupních operací
Na platformě x86/x64 musí všechny gpu podporovat koherenci vstupně-výstupních operací přes PCIe, aby gpu mohl číst nebo zapisovat na plochu paměti systému s možností mezipaměti a udržovat jednotnost procesoru. Když je povrch z pohledu GPU mapován jako koherentní s mezipamětí, musí GPU při přístupu k povrchu prohledávat mezipaměti CPU. Tato forma integrity se obvykle používá pro prostředky, ze nichž se očekává čtení procesoru, například u některých pracovních ploch.
Na některých platformách Arm není koherence vstupně-výstupních operací podporována přímo na hardwaru. Na těchto platformách musí být koherence vstupně-výstupních operací emulována ručním zneplatněním hierarchie mezipaměti procesoru. VidMm to dělá sledováním operací přidělení pocházejících z GPU (operace čtení/zápisu seznamu přidělení) a procesoru (operace mapování, čtení/zápis). Nástroj VidMm vygeneruje neplatnou mezipaměť, když zjistí, že mezipaměť může obsahovat:
- Data, která je potřeba zapsat zpět (zápis procesoru, čtení GPU)
- Zastaralá data, která je potřeba zneplatnit (zápis GPU, čtení procesoru).
Na platformě bez koherence vstupně-výstupních operací spadá odpovědnost za sledování přístupu procesoru a GPU k přidělením do UMD. Grafické jádro poskytuje novou hodnotu DDI Zneplatnit mezipaměť, kterou může UMD použít k zápisu zpět a zneplatnění rozsahu virtuálních adres přidružených k přidělení do mezipaměti. Na platformách, které nepodporují koherenci vstupně-výstupních operací, musí UMD volat tuto funkci po zápisu procesorem a před čtením GPU, a také po zápisu GPU a před čtením procesorem. První z nich se může zdát neintuitivní. Vzhledem k tomu, že CPU mohla spekulativně číst data před tím, než GPU zapsala do paměti, je nutné zneplatnit všechny mezipaměti CPU, aby CPU opět četla data z paměti RAM.