HLSL Shader Model 6.0
Popisuje vnitřní funkce vlnové operace přidané do modelu SHADER HLSL 6.0.
- model shaderu 6.0
- terminologie
- Vnitřní funkce jazyka stínování
- vlnový dotaz
- wave vote
- vysílání vln
- redukce vln
- vlnové skenování a předpony
- operací náhodného náhodného prohazu
- funkce hardwaru
- související témata
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.
Související témata
- Průvodce programováním pro HLSL
- vnitřních objektů model shaderu 6