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 .