HLSL Shader Model 6.0
Beschrijft de intrinsieke golfbewerkingen die zijn toegevoegd aan HLSL Shader Model 6.0.
Shader Model 6.0
Voor eerdere shader-modellen maakt HLSL-programmering slechts één thread van uitvoering beschikbaar. Er worden nieuwe bewerkingen op golfniveau geleverd, te beginnen met model 6.0, om expliciet te profiteren van het parallellisme van huidige GPU's. Veel threads kunnen tegelijkertijd in lockstep op dezelfde kern worden uitgevoerd. Het model 6.0 maakt het bijvoorbeeld mogelijk om barrièreconstructies te verwijderen wanneer het synchronisatiebereik binnen de breedte van de SIMD-processor ligt, of een andere set threads die atomisch ten opzichte van elkaar zijn.
Mogelijke gebruiksvoorbeelden zijn: stroomcompressie, reducties, bloktransponeren, bitonische sortering of Fast Fourier Transforms (FFT), binning, stream deduplicatie en vergelijkbare scenario's.
De meeste intrinsieke waarden worden weergegeven in pixel-shaders en compute-shaders, hoewel er enkele uitzonderingen zijn (vermeld voor elke functie). De functies zijn toegevoegd aan de vereisten voor DirectX-functieniveau 12.0, onder API-niveau 12.
Het <type> parameter en retourwaarde voor deze functies impliceert het type van de expressie. De ondersteunde typen zijn die uit de volgende lijst die ook aanwezig zijn in het doel-shadermodel voor uw app:
- 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
Sommige bewerkingen (zoals de bitsgewijze operators) ondersteunen alleen de typen gehele getallen.
Terminologie
term | definitie |
---|---|
Steeg | Eén thread van uitvoering. De shader-modellen vóór versie 6.0 maken slechts één van deze beschikbaar op taalniveau, waardoor uitbreiding tot parallelle SIMD-verwerking volledig tot aan de implementatie wordt overgelaten. |
Golf | Een reeks lanes (threads) die tegelijkertijd in de processor worden uitgevoerd. Er zijn geen expliciete barrières vereist om te garanderen dat ze parallel worden uitgevoerd. Vergelijkbare concepten zijn 'warp' en 'wavefront'. |
Inactieve baan | Een baan die niet wordt uitgevoerd, bijvoorbeeld vanwege de stroom van controle of onvoldoende werk om de minimale grootte van de golf te vullen. |
Actieve baan | Een baan waarvoor uitvoering wordt uitgevoerd. In pixel-shaders kan het eventuele helper pixel lanes bevatten. |
Quad | Een set van 4 aangrenzende banen die overeenkomen met pixels die zijn gerangschikt in een 2x2-vierkant. Ze worden gebruikt om kleurovergangen te schatten door differentiëren in x of y. Een golf kan bestaan uit meerdere quads. Alle pixels in een actieve quad worden uitgevoerd (en kunnen 'Active Lanes' zijn), maar die geen zichtbare resultaten produceren, worden 'Helper Lanes' genoemd. |
Helper Lane | Een baan die uitsluitend wordt uitgevoerd voor kleurovergangen in pixel gearceerde quads. De uitvoer van een dergelijke baan wordt verwijderd en wordt dus niet weergegeven op het doeloppervlak. |
Arceringstaal intrinsieken
Alle bewerkingen van dit shader-model zijn toegevoegd in een reeks intrinsieke functies.
Golfquery
De intrinsieke kenmerken voor het uitvoeren van query's op één golf.
Intrinsieke | beschrijving | Pixel-shader | compute-shader |
---|---|---|---|
WaveGetLaneCount- | Retourneert het aantal banen in de huidige golf. | * | * |
WaveGetLaneIndex | Retourneert de index van de huidige baan binnen de huidige golf. | * | * |
WaveIsFirstLane- | Retourneert alleen waar voor de actieve baan in de huidige golf met de kleinste index | * | * |
Wave Vote
Deze set intrinsieken vergelijkt waarden tussen threads die momenteel actief zijn vanuit de huidige golf.
Intrinsieke | beschrijving | Pixel-shader | compute-shader |
---|---|---|---|
WaveActiveAnyTrue- | Retourneert waar als de expressie waar is in een actieve baan in de huidige golf. | * | * |
WaveActiveAllTrue- | Retourneert waar als de expressie waar is in alle actieve banen in de huidige golf. | * | * |
WaveActiveBallot- | Retourneert een 64-bits niet-ondertekend geheel getal van de evaluatie van de Boole-expressie voor alle actieve banen in de opgegeven golf. | * | * |
Wave Broadcast
Met deze intrinsieke waarden kunnen alle actieve banen in de huidige golf de waarde van de opgegeven baan ontvangen, waardoor deze effectief wordt uitgezonden. De retourwaarde van een ongeldige rijstrook is niet gedefinieerd.
Intrinsieke | beschrijving | Pixel-shader | compute-shader |
---|---|---|---|
WaveReadLaneAt- | Retourneert de waarde van de expressie voor de opgegeven rijstrookindex binnen de opgegeven golf. | * | * |
WaveReadLaneFirst- | Retourneert de waarde van de expressie voor de actieve baan van de huidige golf met de kleinste index. | * | * |
Golfreductie
Deze intrinsieke functies berekenen de opgegeven bewerking voor alle actieve banen in de golf en zenden het uiteindelijke resultaat uit naar alle actieve banen. Daarom is de uiteindelijke uitvoer gegarandeerd uniform over de golf.
Intrinsieke | beschrijving | Pixel-shader | compute-shader |
---|---|---|---|
WaveActiveAllEqual- | Retourneert waar als de expressie hetzelfde is voor elke actieve baan in de huidige golf (en dus uniform over de strook). | * | * |
WaveActiveBitAnd | Retourneert de bitsgewijze EN van alle waarden van de expressie over alle actieve banen in de huidige golf en repliceert het resultaat naar alle banen in de golf. | * | * |
WaveActiveBitOr- | Retourneert de bitsgewijze OF van alle waarden van de expressie over alle actieve banen in de huidige golf en repliceert het resultaat naar alle banen in de golf. | * | * |
WaveActiveBitXor- | Retourneert de bitsgewijze Exclusieve OF van alle waarden van de expressie voor alle actieve banen in de huidige golf en repliceert het resultaat naar alle banen in de golf. | * | * |
WaveActiveCountBits- | Telt het aantal Booleaanse variabelen dat resulteert in waar voor alle actieve banen in de huidige golf en repliceert het resultaat naar alle banen in de golf. | * | * |
WaveActiveMax | Berekent de maximumwaarde van de expressie voor alle actieve banen in de huidige golf en repliceert het resultaat naar alle banen in de golf. | * | * |
WaveActiveMin- | Berekent de minimumwaarde van de expressie voor alle actieve banen in de huidige golf en repliceert het resultaat naar alle banen in de golf. | * | * |
WaveActiveProduct | Vermenigvuldigt de waarden van de expressie in alle actieve banen in de huidige golf en repliceert het resultaat naar alle banen in de golf. | * | * |
WaveActiveSum- | Somt de waarde van de expressie op over alle actieve banen in de huidige golf en repliceert deze naar alle banen in de huidige golf en repliceert het resultaat naar alle banen in de golf. | * | * |
Golfscan en voorvoegsel
Deze intrinsieke elementen passen de bewerking toe op elke rijstrook en laten elk gedeeltelijk resultaat van de berekening in de bijbehorende baan achter.
Intrinsieke | beschrijving | Pixel-shader | compute-shader |
---|---|---|---|
WavePrefixCountBits- | Retourneert de som van alle opgegeven booleaanse variabelen die zijn ingesteld op true voor alle actieve lanes met indexen die kleiner zijn dan de huidige rijstrook. | * | * |
WavePrefixSum- | Retourneert de som van alle waarden in de actieve banen met kleinere indexen dan deze. | * | * |
WavePrefixProduct | Retourneert het product van alle waarden in de banen vóór deze opgegeven golf. | * | * |
Quad-wide Shuffle-bewerkingen
Deze intrinsiek voeren wisselbewerkingen uit op de waarden in een golf die bekend staat om pixel shader quads te bevatten, zoals hier gedefinieerd. De indexen van de pixels in de quad worden gedefinieerd in scanlijn of leesrichting, waarbij de coördinaten binnen een quad zijn:
+---------> X
| [0] [1]
| [2] [3]
v
Y
Deze routines werken in compute-shaders of pixel-shaders. In compute-shaders werken ze in quads die zijn gedefinieerd als gelijkmatig verdeelde groepen van 4 binnen een SIMD-golf. In pixel-shaders moeten ze worden gebruikt op golven die worden vastgelegd door WaveQuadLanes, anders zijn de resultaten niet gedefinieerd.
Intrinsieke | beschrijving | Pixel-shader | compute-shader |
---|---|---|---|
QuadReadLaneAt- | Retourneert de opgegeven bronwaarde die wordt gelezen uit de rijstrook van de huidige quad die is geïdentificeerd door quadLaneID [0..3] die uniform moet zijn over de quad. | * | |
QuadReadAcrossDiagonal | Retourneert de opgegeven lokale waarde die wordt gelezen van de diagonale tegenovergestelde rijstrook in deze quad. | * | |
QuadReadAcrossX- | Retourneert de opgegeven bronwaarde die is gelezen uit de andere rijstrook in deze quad in de X-richting. | * | |
QuadReadAcrossY- | Retourneert de opgegeven bronwaarde die is gelezen uit de andere rijstrook in deze quad in de Y-richting. | * |
Hardwaremogelijkheid
Als u wilt controleren of de golfbewerkingsfuncties beschikbaar zijn op een specifieke hardware, roept u ID3D12Device::CheckFeatureSupportaan, waarbij u de beschrijving en het gebruik van de D3D12_FEATURE_DATA_D3D12_OPTIONS1 structuur noteert.