HLSL Shader Model 6.0
Beschreibt die systeminternen Wellenoperationen, die dem HLSL-Shadermodell 6.0 hinzugefügt wurden.
Shadermodell 6.0
Bei früheren Shadermodellen macht die HLSL-Programmierung nur einen einzelnen Ausführungsthread verfügbar. Ab Modell 6.0 werden neue Vorgänge auf Wellenebene bereitgestellt, um die Parallelität aktueller GPUs explizit zu nutzen. Viele Threads können im Sperrschritt gleichzeitig auf demselben Kern ausgeführt werden. Beispielsweise ermöglichen die systeminternen Modell 6.0 die Beseitigung von Barrierkonstrukten, wenn der Synchronisierungsbereich innerhalb der Breite des SIMD-Prozessors liegt, oder einen anderen Satz von Threads, die bekannt sind, dass sie relativ zueinander atomisch sind.
Mögliche Anwendungsfälle sind: Streamverdichtung, Reduzierungen, Blocktransponierung, bitonic Sortierung oder Fast Fourier Transforms (FFT), Binning, Streamdeduplizierung und ähnliche Szenarien.
Die meisten systeminternen Elemente werden in Pixel-Shadern und Compute-Shadern angezeigt, obwohl es einige Ausnahmen gibt (für jede Funktion angegeben). Die Funktionen wurden den Anforderungen für DirectX-Featureebene 12.0 unter API-Ebene 12 hinzugefügt.
Der <Typparameter> und der Rückgabewert für diese Funktionen impliziert den Typ des Ausdrucks. Die unterstützten Typen sind diejenigen aus der folgenden Liste, die auch im Ziel-Shadermodell für Ihre App vorhanden sind:
- 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
Einige Vorgänge (z. B. die bitweisen Operatoren) unterstützen nur die Ganzzahltypen.
Begriff
Begriff | Definition |
---|---|
Bereich | Ein einzelner Ausführungsthread. Die Shadermodelle vor Version 6.0 machen nur eines auf Sprachebene verfügbar, sodass die Erweiterung der parallelen SIMD-Verarbeitung vollständig der Implementierung überlassen bleibt. |
Wave | Eine Reihe von Lanes (Threads), die gleichzeitig im Prozessor ausgeführt werden. Es sind keine expliziten Barrieren erforderlich, um zu gewährleisten, dass sie parallel ausgeführt werden. Ähnliche Konzepte umfassen "Warp" und "Wavefront". |
Inaktive Spur | Eine Spur, die nicht ausgeführt wird, z. B. aufgrund des Ablaufs der Steuerung oder aufgrund unzureichender Arbeit, um die Mindestgröße der Welle auszufüllen. |
Aktive Spur | Eine Spur, für die die Ausführung ausgeführt wird. In Pixel-Shadern kann er beliebige Hilfspixelspuren enthalten. |
Viereck | Ein Satz von vier angrenzenden Lanes, die Pixeln entsprechen, die in einem 2x2-Quadrat angeordnet sind. Sie werden verwendet, um Farbverläufe durch Differenzierung in x oder y abzuschätzen. Eine Welle kann aus mehreren Quads bestehen. Alle Pixel in einem aktiven Quad werden ausgeführt (und können "Aktive Lanes" sein), aber diejenigen, die keine sichtbaren Ergebnisse erzeugen, werden als "Hilfsgassen" bezeichnet. |
Hilfsspur | Eine Spur, die ausschließlich zum Zweck von Farbverläufen in Pixel-Shader-Quads ausgeführt wird. Die Ausgabe einer solchen Spur wird verworfen und daher nicht auf die Zieloberfläche gerendert. |
Intrinsische Schattierungssprache
Alle Vorgänge dieses Shadermodells wurden in einer Reihe von systeminternen Funktionen hinzugefügt.
Wave-Abfrage
Die systeminternen Funktionen zum Abfragen einer einzelnen Welle.
Intrinsic | Beschreibung | Pixel-Shader | Compute-Shader |
---|---|---|---|
WaveGetLaneCount | Gibt die Anzahl der Lanes in der aktuellen Welle zurück. | * | * |
WaveGetLaneIndex | Gibt den Index der aktuellen Spur innerhalb der aktuellen Welle zurück. | * | * |
WaveIsFirstLane | Gibt true nur für die aktive Spur in der aktuellen Welle mit dem kleinsten Index zurück. | * | * |
Wellenabstimmung
Dieser Satz von systeminternen Werten vergleicht Werte zwischen Threads, die derzeit aus der aktuellen Welle aktiv sind.
Intrinsic | Beschreibung | Pixel-Shader | Compute-Shader |
---|---|---|---|
WaveActiveAnyTrue | Gibt true zurück, wenn der Ausdruck in einer beliebigen aktiven Lane in der aktuellen Welle true ist. | * | * |
WaveActiveAllTrue | Gibt true zurück, wenn der Ausdruck in allen aktiven Lanes in der aktuellen Welle true ist. | * | * |
WaveActiveBallot | Gibt eine 64-Bit-Ganzzahl-Bitmaske ohne Vorzeichen der Auswertung des booleschen Ausdrucks für alle aktiven Lanes in der angegebenen Welle zurück. | * | * |
Wave Broadcast
Diese systeminternen Elemente ermöglichen es allen aktiven Lanes in der aktuellen Welle, den Wert von der angegebenen Spur zu empfangen und ihn effektiv zu übertragen. Der Rückgabewert einer ungültigen Spur ist nicht definiert.
Intrinsic | Beschreibung | Pixel-Shader | Compute-Shader |
---|---|---|---|
WaveReadLaneAt | Gibt den Wert des Ausdrucks für den angegebenen Lane-Index innerhalb der angegebenen Welle zurück. | * | * |
WaveReadLaneFirst | Gibt den Wert des Ausdrucks für die aktive Spur der aktuellen Welle mit dem kleinsten Index zurück. | * | * |
Wellenreduktion
Diese systeminternen Daten berechnen den angegebenen Vorgang über alle aktiven Lanes in der Welle und senden das Endergebnis an alle aktiven Lanes. Daher ist die Endausgabe für die gesamte Welle gleichmäßig.
Intrinsic | Beschreibung | Pixel-Shader | Compute-Shader |
---|---|---|---|
WaveActiveAllEqual | Gibt true zurück, wenn der Ausdruck für jede aktive Spur in der aktuellen Welle gleich ist (und somit einheitlich über sie hinweg). | * | * |
WaveActiveBitAnd | Gibt das bitweise AND aller Werte des Ausdrucks über alle aktiven Lanes in der aktuellen Welle zurück und repliziert das Ergebnis auf alle Bahnen in der Welle. | * | * |
WaveActiveBitOr | Gibt das bitweise OR aller Werte des Ausdrucks über alle aktiven Lanes in der aktuellen Welle zurück und repliziert das Ergebnis auf alle Bahnen in der Welle. | * | * |
WaveActiveBitXor | Gibt das bitweise exklusive OR aller Werte des Ausdrucks über alle aktiven Lanes in der aktuellen Welle hinweg zurück und repliziert das Ergebnis auf alle Bahnen in der Welle. | * | * |
WaveActiveCountBits | Zählt die Anzahl der booleschen Variablen, die für alle aktiven Lanes in der aktuellen Welle als true ausgewertet werden, und repliziert das Ergebnis auf alle Bahnen in der Welle. | * | * |
WaveActiveMax | Berechnet den maximalen Wert des Ausdrucks über alle aktiven Lanes in der aktuellen Welle und repliziert das Ergebnis auf alle Lanes in der Welle. | * | * |
WaveActiveMin | Berechnet den Minimalwert des Ausdrucks über alle aktiven Lanes in der aktuellen Welle und repliziert das Ergebnis auf alle Lanes in der Welle. | * | * |
WaveActiveProduct | Multipliziert die Werte des Ausdrucks über alle aktiven Lanes in der aktuellen Welle und repliziert das Ergebnis auf alle Bahnen in der Welle. | * | * |
WaveActiveSum | Summiert den Wert des Ausdrucks über alle aktiven Lanes in der aktuellen Welle hinweg und repliziert ihn auf alle Bahnen in der aktuellen Welle und repliziert das Ergebnis auf alle Bahnen in der Welle. | * | * |
Wellenscan und Präfix
Diese systeminternen Funktionen wenden den Vorgang auf jede Spur an und belassen jedes Teilergebnis der Berechnung in der entsprechenden Spur.
Intrinsic | Beschreibung | Pixel-Shader | Compute-Shader |
---|---|---|---|
WavePrefixCountBits | Gibt die Summe aller angegebenen booleschen Variablen zurück, die für alle aktiven Lanes mit Indizes, die kleiner als die aktuelle Lane sind, auf TRUE festgelegt sind. | * | * |
WavePrefixSum | Gibt die Summe aller Werte in den aktiven Lanes mit kleineren Indizes als dieser zurück. | * | * |
WavePrefixProduct | Gibt das Produkt aller Werte in den Lanes vor dieser der angegebenen Welle zurück. | * | * |
Quad-wide Shuffle-Vorgänge
Diese systeminternen Funktionen führen Austauschvorgänge für die Werte über eine Welle aus, die bekanntermaßen Pixelshader-Quads enthält, wie hier definiert. Die Indizes der Pixel im Quad werden in scan-line oder leserichtung definiert, wobei die Koordinaten innerhalb eines Quads wie folgt sind:
+---------> X
| [0] [1]
| [2] [3]
v
J
Diese Routinen funktionieren entweder in Compute-Shadern oder Pixelshadern. In Computeshadern arbeiten sie in Quads, die als gleichmäßig geteilte Gruppen von 4 innerhalb einer SIMD-Welle definiert sind. In Pixelshadern sollten sie für Wellen verwendet werden, die von WaveQuadLanes erfasst wurden, da die Ergebnisse andernfalls nicht definiert sind.
Intrinsic | Beschreibung | Pixel-Shader | Compute-Shader |
---|---|---|---|
QuadReadLaneAt | Gibt den angegebenen Quellwert zurück, der aus der Lane des aktuellen Quads gelesen wird, das durch quadLaneID [0..3] identifiziert wird, das über das Quad einheitlich sein muss. | * | |
QuadReadAcrossDiagonal | Gibt den angegebenen lokalen Wert zurück, der von der diagonal gegenüberliegenden Spur in diesem Quad gelesen wird. | * | |
QuadReadAcrossX | Gibt den angegebenen Quellwert zurück, der von der anderen Spur in diesem Quad in X-Richtung gelesen wird. | * | |
QuadReadAcrossY | Gibt den angegebenen Quellwert zurück, der von der anderen Spur in diesem Quad in Y-Richtung gelesen wird. | * |
Hardwarefunktion
Um zu überprüfen, ob die Funktionen für den Wellenvorgang auf einer bestimmten Hardware verfügbar sind, rufen Sie ID3D12Device::CheckFeatureSupport auf, und beachten Sie dabei die Beschreibung und Verwendung der D3D12_FEATURE_DATA_D3D12_OPTIONS1-Struktur .