Sdílet prostřednictvím


HLSL Shader Model 6.0

Popisuje vnitřní funkce vlnové operace přidané do modelu SHADER HLSL 6.0.

Shader Model 6.0

V případě dřívějších modelů shaderu zveřejňuje programování HLSL pouze jedno vlákno provádění. K dispozici jsou nové operace na úrovni vln, počínaje modelem 6.0, aby bylo možné explicitně využít paralelismus aktuálních GPU – mnoho vláken může být spuštěno v lockstepu na stejném jádru současně. Například vnitřní objekty modelu 6.0 umožňují odstranění bariérových konstruktorů, pokud je rozsah synchronizace v šířce procesoru SIMD nebo některé jiné sady vláken, o kterých je známo, že jsou atomické vzhledem k sobě.

Mezi potenciální případy použití patří: komprimace datových proudů, snížení, transponace bloků, bitové řazení nebo FFT (Fast Fourier Transforms), binning, odstranění duplicit datových proudů a podobné scénáře.

Většinavnitřních Funkce byly přidány k požadavkům na úroveň funkce DirectX 12.0 v rámci rozhraní API úrovně 12.

Typ <> parametr a návratová hodnota pro tyto funkce implikují typ výrazu, podporované typy jsou ty z následujícího seznamu, které jsou také přítomen v modelu cílového shaderu pro vaši aplikaci:

  • half, half2, half3, half4
  • float, float2, float3, float4
  • double, double2, double3, double4
  • int, int2, int3, int4
  • uint, uint2, uint3, uint4
  • short, short2, short3, short4
  • ushort, ushort2, ushort3, ushort4
  • uint64_t, uint64_t2, uint64_t3, uint64_t4

Některé operace (například bitové operátory) podporují pouze celočíselné typy.

Terminologie

termínu definice
Dráha Jedno vlákno provádění. Modely shaderu před verzí 6.0 zpřístupňují pouze jeden z nich na úrovni jazyka, takže rozšíření paralelního zpracování SIMD zcela do implementace.
Vlna Sada pruhů (závitů) spuštěná současně v procesoru. Nejsou vyžadovány žádné explicitní překážky, aby se zajistilo, že se provádějí paralelně. Podobné koncepty zahrnují "warp" a "wavefront".
Neaktivní pruh Pruh, který se nespustí, například kvůli toku řízení nebo nedostatečné práci k naplnění minimální velikosti vlny.
Aktivní pruh Pruh, pro který se provádí provádění. V pixelových shaderech může obsahovat jakékoli pomocné pixelové pruhy.
Čtyřče Sada 4 sousedních pruhů odpovídajících pixelům uspořádaných do čtverce 2x2. Používají se k odhadu přechodů rozdílem v x nebo y. Vlna se může skládat z několika čtyřúhelníku. Všechny pixely v aktivním čtyřúhelníku se spouští (a mohou být aktivní pruhy), ale ty, které nevytvářejí viditelné výsledky, se označují jako "Pomocné pruhy".
Pomocný pruh Pruh, který se spouští výhradně pro účely přechodů v pixelových shaderových čtyřúhelnících. Výstup takového pruhu se zahodí, takže se nevykreslí na cílový povrch.

Vnitřní funkce stínování jazyka

Všechny operace tohoto modelu shaderu byly přidány do řady vnitřních funkcí.

Vlnový dotaz

Vnitřní objekty pro dotazování na jednu vlnu.

vnitřní popis pixelový shader výpočetního shaderu
WaveGetLaneCount Vrátí počet pruhů v aktuální vlně. * *
WaveGetLaneIndex Vrátí index aktuálního pruhu v aktuální vlně. * *
WaveIsFirstLane Vrátí hodnotu true pouze pro aktivní pruh v aktuální vlně s nejmenším indexem. * *

Wave Vote

Tato sada vnitřních objektů porovnává hodnoty napříč vlákny, která jsou aktuálně aktivní z aktuální vlny.

vnitřní popis pixelový shader výpočetního shaderu
WaveActiveAnyTrue Vrátí hodnotu true, pokud je výraz pravdivý v libovolné aktivní pruhu v aktuální vlně. * *
WaveActiveAllTrue Vrátí hodnotu true, pokud je výraz pravdivý ve všech aktivních pruhech v aktuální vlně. * *
WaveActiveBallot Vrátí 64bitovou celočíselnou masku bez znaménka vyhodnocení logického výrazu pro všechny aktivní pruhy v zadané vlně. * *

Wave Broadcast

Tyto vnitřní vlastnosti umožňují všem aktivním pruhům v aktuální vlně přijímat hodnotu ze zadaného pruhu a efektivně ho vysílat. Vrácená hodnota z neplatného pruhu není definována.

vnitřní popis pixelový shader výpočetního shaderu
WaveReadLaneAt Vrátí hodnotu výrazu pro daný index pruhu v zadané vlně. * *
WaveReadLaneFirst Vrátí hodnotu výrazu pro aktivní pruh aktuální vlny s nejmenším indexem. * *

Redukce vln

Tyto vnitřní objekty vypočítávají zadanou operaci napříč všemi aktivními pruhy ve vlně a vysílají konečný výsledek do všech aktivních pruhů. Proto je konečný výstup zaručen jednotně napříč vlnou.

vnitřní popis pixelový shader výpočetního shaderu
WaveActiveAllEqual Vrátí hodnotu true, pokud je výraz stejný pro všechny aktivní pruhy v aktuální vlně (a tedy jednotně přes něj). * *
WaveActiveBitAnd Vrátí bitový operátor AND všech hodnot výrazu napříč všemi aktivními pruhy v aktuální vlně a replikuje výsledek do všech pruhů ve vlně. * *
WaveActiveBitOr Vrátí bitové OR všech hodnot výrazu napříč všemi aktivními pruhy v aktuální vlně a replikuje výsledek do všech pruhů ve vlně. * *
WaveActiveBitXor Vrátí bitové výhradní OR všech hodnot výrazu napříč všemi aktivními pruhy v aktuální vlně a replikuje výsledek do všech pruhů ve vlně. * *
WaveActiveCountBits Spočítá počet logických proměnných, které se vyhodnotí jako true napříč všemi aktivními pruhy v aktuální vlně, a replikuje výsledek do všech pruhů ve vlně. * *
WaveActiveMax Vypočítá maximální hodnotu výrazu napříč všemi aktivními pruhy v aktuální vlně a replikuje výsledek do všech pruhů ve vlně. * *
WaveActiveMin Vypočítá minimální hodnotu výrazu napříč všemi aktivními pruhy v aktuální vlně a replikuje výsledek do všech pruhů ve vlně. * *
WaveActiveProduct Vynásobí hodnoty výrazu společně napříč všemi aktivními pruhy v aktuální vlně a výsledek replikuje do všech pruhů ve vlně. * *
WaveActiveSum Sečte hodnotu výrazu napříč všemi aktivními pruhy v aktuální vlně a replikuje ji do všech pruhů v aktuální vlně a výsledek replikuje do všech pruhů ve vlně. * *

Vlnová kontrola a předpona

Tyto vnitřní objekty používají operaci na každý pruh a opouštějí každý částečný výsledek výpočtu v odpovídajícím pruhu.

vnitřní popis pixelový shader výpočetního shaderu
WavePrefixCountBits Vrátí součet všech zadaných logických proměnných nastavených na true napříč všemi aktivními pruhy s indexy menšími než aktuální pruh. * *
WavePrefixSum Vrátí součet všech hodnot v aktivních pruhech s menšími indexy, než je tento. * *
WavePrefixProduct Vrátí součin všech hodnot v pruhech před touto vlnou. * *

Čtyřúhelníkové operace shuffle

Tyto vnitřní objekty provádějí operace prohození s hodnotami napříč vlnou, o které je známo, že obsahují pixelové quads shaderu, jak je zde definováno. Indexy pixelů v čtyřúhelníku jsou definovány v pořadí skenování nebo čtení – kde souřadnice uvnitř čtyřúhelníku jsou:

+---------> X

| [0] [1]

| [2] [3]

v

Y

Tyto rutiny fungují buď ve výpočetních shaderu, nebo v pixelových shaderech. Ve výpočetních shaderech pracují ve čtyřúhelníku definovaných jako rovnoměrně rozdělené skupiny 4 v rámci vlny SIMD. V pixelových shaderech by měly být použity na vlnách zachycených WaveQuadLanes, jinak výsledky nejsou definovány.

vnitřní popis pixelový shader výpočetního shaderu
QuadReadLaneAt Vrátí zadanou hodnotu zdroje přečtenou z pruhu aktuálního čtyřúhelníku identifikovaného quadLaneID [0..3], která musí být jednotná napříč čtyřúhelníkem. *
QuadReadAcrossDiagonal Vrátí zadanou místní hodnotu, která se čte z diagonálně opačného pruhu v tomto čtyřúhelníku. *
QuadReadAcrossX Vrátí zadanou zdrojnou hodnotu přečtenou z druhého pruhu v tomto čtyřúhelníku ve směru X. *
QuadReadAcrossY Vrátí zadanou zdrojnou hodnotu přečtenou z druhého pruhu v tomto čtyřúhelníku ve směru Y. *

Možnosti hardwaru

Pokud chcete zkontrolovat, jestli jsou funkce vlnových operací dostupné na libovolném konkrétním hardwaru, zavolejte ID3D12Device::CheckFeatureSupporta popis a použití struktury D3D12_FEATURE_DATA_D3D12_OPTIONS1.