Sdílet prostřednictvím


Optimalizace UMA: Textury přístupné procesorem a standardní swizzle

Gpu UMA (Unified Memory Architecture) nabízejí určité výhody efektivity oproti diskrétním grafickým procesorům, zejména při optimalizaci pro mobilní zařízení. Poskytnutí přístupu k procesoru prostředků v případě, že gpu je UMA, může snížit množství kopírování, ke kterému dochází mezi procesorem a GPU. I když nedoporučujeme aplikace nevidomě udělovat přístup procesoru ke všem prostředkům v návrzích UMA, existují příležitosti ke zlepšení efektivity tím, že poskytují správný přístup k prostředkům procesoru. Na rozdíl od samostatných GPU může procesor technicky mít ukazatel na všechny prostředky, ke kterým může GPU přistupovat.

Přehled textur přístupných k procesoru

Textury přístupné procesorem v grafickém kanálu jsou funkcí architektury UMA, která umožňuje procesorům čtení a zápisu přístup k texturám. Na častějších diskrétních gpu procesor nemá procesor přístup k texturám v grafickém kanálu.

Obecným osvědčeným postupem pro textury je přizpůsobení diskrétních GPU, které obvykle zahrnují následující procesy v nahrávání texturových dat prostřednictvím vyrovnávacích pamětí, shrnuto jako:

  • Nemáte přístup k procesoru pro většinu textur.
  • Nastavení rozložení textury na D3D12_TEXTURE_LAYOUT_UNKNOWN
  • Nahrání textur do GPU s CopyTextureRegion.

V některých případech ale může procesor a GPU interagovat tak často na stejných datech, že mapování textur se hodí k úsporě energie nebo ke zrychlení určitého návrhu na konkrétních adaptérech nebo architekturách. Aplikace by měly tyto případy rozpoznat a optimalizovat nepotřebné kopie. V tomto případě je pro zajištění nejlepšího výkonu potřeba vzít v úvahu následující:

  • Když D3D12_FEATURE_DATA_ARCHITECTURE::UMA je PRAVDA, začněte bavit pouze lepší výkon mapovacích textur. Pak věnujte pozornost CacheCoherentUMA, pokud se rozhodnete, které vlastnosti mezipaměti procesoru zvolit v haldě.

  • Využití přístupu k procesoru pro textury je složitější než u vyrovnávacích pamětí. Nejúčinnější rozložení textury pro GPU jsou zřídka row_major. Některé GPU můžou ve skutečnosti podporovat pouze row_major textury při kopírování dat textury kolem.

  • Grafické procesory UMA by obecně měly těžit z jednoduché optimalizace, aby se snížila doba načítání na úrovni. Po rozpoznání UMA může aplikace optimalizovat počáteční CopyTextureRegion k naplnění textur, které GPU nezmění. Místo vytvoření textury v haldě s D3D12_HEAP_TYPE_DEFAULT a zařazování dat textury prostřednictvím aplikace může použít WriteToSubresource, aby se zabránilo pochopení skutečného rozložení textury.

  • V D3D12 jsou textury vytvořené s D3D12_TEXTURE_LAYOUT_UNKNOWN a žádný přístup k procesoru nejúčinnější pro časté vykreslování a vzorkování GPU. Při testování výkonu by se tyto textury měly porovnávat s D3D12_TEXTURE_LAYOUT_UNKNOWN s přístupem k procesoru a D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE s přístupem k procesoru a D3D12_TEXTURE_LAYOUT_ROW_MAJOR pro podporu křížového adaptéru.

  • Použití D3D12_TEXTURE_LAYOUT_UNKNOWN s přístupem k procesoru umožňuje metody WriteToSubresource, ReadFromSubresource, Map (precludding application access to pointer) a Unmap; ale může obětovat efektivitu přístupu GPU.

  • Použití D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE s přístupem k procesoru umožňuje WriteToSubresource, ReadFromSubresource, Map (který vrací platný ukazatel na aplikaci) a Unmap. Může také obětovat efektivitu přístupu GPU více než D3D12_TEXTURE_LAYOUT_UNKNOWN s přístupem k procesoru.

Přehled služby Standard Swizzle

D3D12 (a D3D11.3) zavádí standardní multidimenzionální rozložení dat. To se provádí tak, aby několik jednotek zpracování fungovalo na stejných datech, aniž byste data zkopírovali nebo je přetáhli mezi několika rozloženími. Standardizované rozložení umožňuje zvýšení efektivity prostřednictvím síťových efektů a umožňuje algoritmům provádět krátké řezy za předpokladu určitého vzoru.

Podrobný popis rozložení textury najdete v D3D12_TEXTURE_LAYOUT.

Upozorňujeme, že tento standard swizzle je hardwarová funkce a nemusí být podporována všemi grafickými procesory.

Základní informace o potáhnutí najdete v křivky pořadí Z.

Rozhraní api

Na rozdíl od D3D11.3 podporuje D3D12 mapování textur ve výchozím nastavení, takže není nutné dotazovat D3D12_FEATURE_DATA_D3D12_OPTIONS. D3D12 však vždy nepodporuje standardní swizzle – tato funkce bude muset být dotazována pomocí volání CheckFeatureSupport a kontrola StandardSwizzle64KBSupported pole D3D12_FEATURE_DATA_D3D12_OPTIONS.

Následující rozhraní API odkazují na mapování textury:

Výčty

  • D3D12_TEXTURE_LAYOUT : řídí vzor swizzle výchozích textur a umožňuje podporu mapování u textur přístupných k procesoru.

Struktury

Metody

Prostředky a nadřazené haldy mají požadavky na sladění:

  • D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT (4 MB) pro textury s více vzorky.
  • D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT (64 kB) pro textury a vyrovnávací paměti s jedním vzorkem.
  • Kopírování lineárního podsourcu musí být zarovnané na D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512 bajtů), přičemž rozteč řádků je zarovnaný na D3D12_TEXTURE_DATA_PITCH_ALIGNMENT (256 bajtů).
  • Zobrazení konstantní vyrovnávací paměti musí být zarovnaná k D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT (256 bajtů).

Textury menší než 64 kB by měly být zpracovány prostřednictvím CreateCommittedResource.

S dynamickými texturami (texturami, které mění každý rámec) procesor zapíše lineárně do haldy pro nahrávání, za kterou následuje operace kopírování GPU.

Při vytváření dynamických prostředků se obvykle vytvoří velká vyrovnávací paměť v haldě pro nahrání (viz suballocation within buffers). Pokud chcete vytvořit přípravné prostředky, vytvořte velkou vyrovnávací paměť v haldě zpětného čtení. Pokud chcete vytvořit výchozí statické prostředky, vytvořte sousední prostředky ve výchozí haldě. Pokud chcete vytvořit výchozí aliasované prostředky, vytvořte překrývající se prostředky ve výchozí haldě.

WriteToSubresource a ReadFromSubresource změnit uspořádání dat textury mezi rozložením hlavního řádku a nedefinovaným rozložením prostředků. Operace je synchronní, takže aplikace by měla mít na paměti plánování procesoru. Aplikace může vždy rozdělit kopírování do menších oblastí nebo naplánovat tuto operaci v jiné úloze. Tyto operace kopírování procesoru nepodporují prostředky MSAA a prostředky podrobného vzorníku s neprůhlhlými rozloženími prostředků a způsobí selhání. Formáty, které nemají velikost prvku power-of-two, se také nepodporují a způsobí také selhání. Může dojít k nedostatku návratových kódů paměti.

základní konstanty

ID3D12Heap

vazby prostředků