Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 Thread der Ausführung verfügbar. Neue Vorgänge auf Wellenebene werden bereitgestellt, beginnend mit Modell 6.0, um explizit die Parallelität aktueller GPUs zu nutzen – viele Threads können gleichzeitig in Sperre auf demselben Kern ausgeführt werden. Beispielsweise ermöglichen die systeminternen Modell 6.0 die Beseitigung von Barrierekonstrukten, wenn sich der Synchronisierungsbereich in der Breite des SIMD-Prozessors befindet, oder ein anderer Satz von Threads, die als atomisch relativ zueinander bekannt sind.
Mögliche Anwendungsfälle sind: Streamkomprimierung, Reduzierungen, Blocktransponierung, Bitonic-Sortierung oder Fast Fourier Transforms (FFT), Binning, Streamdeduplizierung und ähnliche Szenarien.
Die meisten systeminternen Elemente werden in Pixelshadern und Compute-Shadern angezeigt, es gibt jedoch einige Ausnahmen (die für jede Funktion angegeben sind). Die Funktionen wurden den Anforderungen für DirectX-Featureebene 12.0 unter API-Ebene 12 hinzugefügt.
Der <Typ> Parameter und 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:
- Hälfte, Hälfte2, Hälfte3, Hälfte4
- float, float2, float3, float4
- double, double2, double3, double4
- 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 ganzzahligen Typen.
Terminologie
Ausdrucks- | Definition |
---|---|
Gasse | Ein einzelner Thread der Ausführung. Die Shadermodelle vor Version 6.0 machen nur eine dieser Modelle auf Sprachebene verfügbar, wodurch die Erweiterung auf parallele SIMD-Verarbeitung vollständig bis zur Implementierung erfolgt. |
Welle | Eine Reihe von Lanes (Threads), die gleichzeitig im Prozessor ausgeführt werden. Es sind keine expliziten Barrieren erforderlich, um sicherzustellen, 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 Kontrollflusses, oder unzureichende Arbeit, um die Mindestgröße der Welle zu füllen. |
Aktive Spur | Eine Spur, für die die Ausführung ausgeführt wird. In Pixelshadern kann es alle Hilfspixelspuren enthalten. |
Viereck | Eine Gruppe von 4 angrenzenden Gassen, die Pixeln entsprechen, die in einem Quadrat von 2 x 2 angeordnet sind. Sie werden verwendet, um Farbverläufe durch Unterschiede in x oder y zu schätzen. Eine Welle kann aus mehreren Quads bestehen. Alle Pixel in einem aktiven Quad werden ausgeführt (und können "Active Lanes") sein, aber diejenigen, die keine sichtbaren Ergebnisse erzeugen, werden als "Hilfsspuren" 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 der Zieloberfläche gerendert. |
Systeminterne Schattierungssprache
Alle Vorgänge dieses Shadermodells wurden in einer Reihe systeminterner Funktionen hinzugefügt.
Wave Query
Die systeminternen Abfragen einer einzelnen Welle.
systeminterne | Beschreibung | Pixelshader- | Compute-Shader- |
---|---|---|---|
WaveGetLaneCount- | Gibt die Anzahl der Fahrspuren 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. | * | * |
Wellenstimme
Dieser Satz systeminterner Elemente vergleicht Werte über Threads hinweg, die derzeit aus der aktuellen Welle aktiv sind.
systeminterne | Beschreibung | Pixelshader- | Compute-Shader- |
---|---|---|---|
WaveActiveAnyTrue | Gibt true zurück, wenn der Ausdruck in einer beliebigen aktiven Spur in der aktuellen Welle wahr ist. | * | * |
WaveActiveAllTrue- | Gibt true zurück, wenn der Ausdruck in allen aktiven Lanes in der aktuellen Welle wahr ist. | * | * |
WaveActiveBallot | Gibt eine 64-Bit-ganzzahlige Bitmaske der Auswertung des booleschen Ausdrucks für alle aktiven Spur in der angegebenen Welle zurück. | * | * |
Wave Broadcast
Diese systeminternen Elemente ermöglichen es allen aktiven Bahnen in der aktuellen Welle, den Wert von der angegebenen Spur zu empfangen und effektiv zu übertragen. Der Rückgabewert von einer ungültigen Spur ist nicht definiert.
systeminterne | Beschreibung | Pixelshader- | Compute-Shader- |
---|---|---|---|
WaveReadLaneAt- | Gibt den Wert des Ausdrucks für den angegebenen Spurindex 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. | * | * |
Wellenreduzierung
Diese systeminternen Vorgänge berechnen den angegebenen Betrieb über alle aktiven Bahnen in der Welle und übertragen das Endergebnis auf alle aktiven Lanes. Daher wird die endige Ausgangsleistung über die Welle hinweg einheitlich gewährleistet.
systeminterne | Beschreibung | Pixelshader- | Compute-Shader- |
---|---|---|---|
WaveActiveAllEqual- | Gibt "true" zurück, wenn der Ausdruck für jede aktive Spur in der aktuellen Welle gleich ist (und somit einheitlich). | * | * |
WaveActiveBitAnd | Gibt den bitweisen UND-Wert aller Werte des Ausdrucks über alle aktiven Bahnen in der aktuellen Welle zurück und repliziert das Ergebnis auf alle Bahnen in der Welle. | * | * |
WaveActiveBitOr- | Gibt den bitweisen OR aller Werte des Ausdrucks über alle aktiven Bahnen in der aktuellen Welle zurück und repliziert das Ergebnis auf alle Bahnen in der Welle. | * | * |
WaveActiveBitXor- | Gibt den bitweisen exklusiven ODER-Wert aller Werte des Ausdrucks über alle aktiven Spur in der aktuellen Welle zurück und repliziert das Ergebnis auf alle Bahnen in der Welle. | * | * |
WaveActiveCountBits- | Zählt die Anzahl boolescher Variablen, die in allen aktiven Bahnen in der aktuellen Welle als wahr ausgewertet werden, und repliziert das Ergebnis auf alle Bahnen in der Welle. | * | * |
WaveActiveMax | Berechnet den Maximalwert des Ausdrucks über alle aktiven Bahnen in der aktuellen Welle und repliziert das Ergebnis auf alle Bahnen in der Welle. | * | * |
WaveActiveMin | Berechnet den Minimalwert des Ausdrucks über alle aktiven Bahnen in der aktuellen Welle und repliziert das Ergebnis auf alle Bahnen in der Welle. | * | * |
WaveActiveProduct- | Multipliziert die Werte des Ausdrucks über alle aktiven Bahnen in der aktuellen Welle und repliziert das Ergebnis auf alle Bahnen in der Welle. | * | * |
WaveActiveSum | Summiert den Wert des Ausdrucks über alle aktiven Bahnen in der aktuellen Welle 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 Vorgänge wenden den Betrieb auf jede Spur an und verlassen jedes Teilergebnis der Berechnung in der entsprechenden Spur.
systeminterne | Beschreibung | Pixelshader- | Compute-Shader- |
---|---|---|---|
WavePrefixCountBits | Gibt die Summe aller angegebenen booleschen Variablen zurück, die auf "true" auf alle aktiven Lanes mit Indizes festgelegt sind, die kleiner als die aktuelle Spur 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 Fahrspuren vor dieser einer der angegebenen Welle zurück. | * | * |
Vierfache Shuffle-Vorgänge
Diese systeminternen Vorgänge führen Swap-Operationen 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 der Scanzeilen- oder Lesereihenfolge definiert – wobei die Koordinaten innerhalb eines Quads sind:
+---------> X
| [0] [1]
| [2] [3]
v
Y
Diese Routinen funktionieren entweder in Compute-Shadern oder Pixelshadern. In Computeshadern werden sie in Quads ausgeführt, 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 werden, andernfalls werden Die Ergebnisse nicht definiert.
systeminterne | Beschreibung | Pixelshader- | Compute-Shader- |
---|---|---|---|
QuadReadLaneAt- | Gibt den angegebenen Quellwert zurück, der von der Spur 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 aus der anderen Spur in dieser Viererrichtung in X-Richtung zurück. | * | |
QuadReadAcrossY | Gibt den angegebenen Quellwert zurück, der aus der anderen Spur in dieser Viererrichtung gelesen wird. | * |
Hardwarefunktion
Rufen Sie ID3D12Device::CheckFeatureSupportauf, um zu überprüfen, ob die Wellenoperationsfunktionen auf einer bestimmten Hardware verfügbar sind, indem Sie die Beschreibung und Verwendung der D3D12_FEATURE_DATA_D3D12_OPTIONS1 Struktur notieren.