Modello shader HLSL 6.0
Descrive gli intrinseci dell'operazione d'onda aggiunti al modello shader HLSL 6.0.
- Modello shader 6.0
- Terminologia
- Intrinseci del linguaggio di ombreggiatura
- Funzionalità hardware
- Argomenti correlati
Modello shader 6.0
Per i modelli shader precedenti, la programmazione HLSL espone solo un singolo thread di esecuzione. Vengono fornite nuove operazioni a livello di onda, a partire dal modello 6.0, per sfruttare in modo esplicito il parallelismo delle GPU correnti. Molti thread possono essere eseguiti nello stesso core contemporaneamente. Ad esempio, gli intrinseci del modello 6.0 consentono l'eliminazione di costrutti di barriere quando l'ambito della sincronizzazione si trova all'interno della larghezza del processore SIMD o di altri set di thread che sono noti per essere atomici tra loro.
I casi d'uso potenziali includono: compattazione del flusso, riduzioni, trasposizione di blocchi, ordinamento bitonico o trasformazioni Fast Fourier (FFT), binning, deduplicazione del flusso e scenari simili.
La maggior parte degli oggetti intrinseci viene visualizzata nei pixel shader e negli shader di calcolo, anche se esistono alcune eccezioni (indicate per ogni funzione). Le funzioni sono state aggiunte ai requisiti per il livello di funzionalità DirectX 12.0, nel livello API 12.
Il <parametro di tipo> e il valore restituito per queste funzioni implicano il tipo di espressione, i tipi supportati sono quelli dell'elenco seguente presenti anche nel modello di shader di destinazione per l'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
Alcune operazioni, ad esempio gli operatori bit per bit, supportano solo i tipi integer.
Terminologia
Termine | Definizione |
---|---|
Corsia | Un singolo thread di esecuzione. I modelli shader precedenti alla versione 6.0 espongono solo uno di questi a livello di linguaggio, lasciando l'espansione all'elaborazione SIMD parallela interamente fino all'implementazione. |
Wave | Set di corsie (thread) eseguiti simultaneamente nel processore. Non sono necessarie barriere esplicite per garantire che vengano eseguite in parallelo. I concetti simili includono "warp" e "wavefront". |
Corsia inattiva | Corsia che non viene eseguita, ad esempio a causa del flusso di controllo, o lavoro insufficiente per riempire le dimensioni minime dell'onda. |
Corsia attiva | Corsia per la quale viene eseguita l'esecuzione. Nei pixel shader può includere qualsiasi corsia pixel helper. |
Quad | Set di 4 corsie adiacenti corrispondenti ai pixel disposti in un quadrato 2x2. Vengono usati per stimare i gradienti in base alla differenza in x o y. Un'onda può essere costituita da più quad. Tutti i pixel in un quad attivo vengono eseguiti (e possono essere "Corsie attive"), ma quelli che non producono risultati visibili sono detti "Corsie helper". |
Corsia helper | Corsia eseguita esclusivamente ai fini delle sfumature nei quad pixel shader. L'output di tale corsia verrà rimosso e quindi non verrà eseguito il rendering sulla superficie di destinazione. |
Intrinseci del linguaggio di ombreggiatura
Tutte le operazioni di questo modello di shader sono state aggiunte in una gamma di funzioni intrinseche.
Wave Query
Oggetti intrinseci per l'esecuzione di query su una singola onda.
Intrinsic | Descrizione | Pixel shader | Compute shader |
---|---|---|---|
WaveGetLaneCount | Restituisce il numero di corsie nell'onda corrente. | * | * |
WaveGetLaneIndex | Restituisce l'indice della corsia corrente all'interno dell'onda corrente. | * | * |
WaveIsFirstLane | Restituisce true solo per la corsia attiva nell'onda corrente con l'indice più piccolo | * | * |
Voto d'onda
Questo set di oggetti intrinseci confronta i valori tra i thread attualmente attivi dall'onda corrente.
Intrinsic | Descrizione | Pixel shader | Compute shader |
---|---|---|---|
WaveActiveAnyTrue | Restituisce true se l'espressione è true in qualsiasi corsia attiva nell'onda corrente. | * | * |
WaveActiveAllTrue | Restituisce true se l'espressione è true in tutte le corsie attive nell'onda corrente. | * | * |
WaveActiveBallot | Restituisce una maschera di bit integer senza segno a 64 bit della valutazione dell'espressione booleana per tutte le corsie attive nell'onda specificata. | * | * |
Trasmissione d'onda
Questi intrinseci consentono a tutte le corsie attive nell'onda corrente di ricevere il valore dalla corsia specificata, trasmettendolo in modo efficace. Il valore restituito da una corsia non valida non è definito.
Intrinsic | Descrizione | Pixel shader | Compute shader |
---|---|---|---|
WaveReadLaneAt | Restituisce il valore dell'espressione per l'indice di corsia specificato all'interno dell'onda specificata. | * | * |
WaveReadLaneFirst | Restituisce il valore dell'espressione per la corsia attiva dell'onda corrente con l'indice più piccolo. | * | * |
Riduzione delle onde
Questi intrinseci calcolano l'operazione specificata in tutte le corsie attive nell'onda e trasmettono il risultato finale a tutte le corsie attive. Pertanto, l'output finale è garantito uniforme attraverso l'onda.
Intrinsic | Descrizione | Pixel shader | Compute shader |
---|---|---|---|
WaveActiveAllEqual | Restituisce true se l'espressione è uguale per ogni corsia attiva nell'onda corrente (e quindi uniforme tra di essa). | * | * |
WaveActiveBitAnd | Restituisce l'and bit per bit di tutti i valori dell'espressione in tutte le corsie attive nell'onda corrente e replica il risultato in tutte le corsie dell'onda. | * | * |
WaveActiveBitOr | Restituisce l'OR bit per bit di tutti i valori dell'espressione in tutte le corsie attive nell'onda corrente e replica il risultato in tutte le corsie dell'onda. | * | * |
WaveActiveBitXor | Restituisce l'OR esclusivo bit per bit di tutti i valori dell'espressione in tutte le corsie attive nell'onda corrente e replica il risultato in tutte le corsie dell'onda. | * | * |
WaveActiveCountBits | Conta il numero di variabili booleane che valutano true in tutte le corsie attive nell'onda corrente e replica il risultato in tutte le corsie dell'onda. | * | * |
WaveActiveMax | Calcola il valore massimo dell'espressione in tutte le corsie attive nell'onda corrente e replica il risultato in tutte le corsie dell'onda. | * | * |
WaveActiveMin | Calcola il valore minimo dell'espressione in tutte le corsie attive nell'onda corrente e replica il risultato in tutte le corsie dell'onda. | * | * |
WaveActiveProduct | Moltiplica i valori dell'espressione in tutte le corsie attive nell'onda corrente e replica il risultato in tutte le corsie dell'onda. | * | * |
WaveActiveSum | Somma il valore dell'espressione in tutte le corsie attive nell'onda corrente e lo replica in tutte le corsie dell'onda corrente e replica il risultato in tutte le corsie dell'onda corrente. | * | * |
Analisi delle onde e prefisso
Questi intrinseci applicano l'operazione a ogni corsia e lasciano ogni risultato parziale del calcolo nella corsia corrispondente.
Intrinsic | Descrizione | Pixel shader | Shader di calcolo |
---|---|---|---|
WavePrefixCountBits | Restituisce la somma di tutte le variabili booleane specificate impostate su true in tutte le corsie attive con indici più piccoli rispetto alla corsia corrente. | * | * |
WavePrefixSum | Restituisce la somma di tutti i valori nelle corsie attive con indici più piccoli di questo. | * | * |
WavePrefixProduct | Restituisce il prodotto di tutti i valori nelle corsie precedenti a questa delle onde specificate. | * | * |
Operazioni di shuffle a larghezza quadre
Queste intrinseche eseguono operazioni di scambio sui valori in un'onda nota per contenere quad pixel shader come definito qui. Gli indici dei pixel nel quad sono definiti nell'ordine di analisi o lettura, dove le coordinate all'interno di un quad sono:
+---------> X
| [0] [1]
| [2] [3]
v
S
Queste routine funzionano in shader di calcolo o pixel shader. Negli shader di calcolo operano in quad definiti come gruppi uniformemente divisi di 4 all'interno di un'onda SIMD. Nei pixel shader devono essere usati sulle onde acquisite da WaveQuadLanes, altrimenti i risultati non sono definiti.
Intrinsic | Descrizione | Pixel shader | Shader di calcolo |
---|---|---|---|
QuadReadLaneAt | Restituisce il valore di origine specificato letto dalla corsia del quad corrente identificato da quadLaneID [0..3] che deve essere uniforme nel quad. | * | |
QuadReadAcrossDiagonal | Restituisce il valore locale specificato letto dalla corsia opposta diagonalmente in questo quad. | * | |
QuadReadAcrossX | Restituisce il valore di origine specificato letto dall'altra corsia in questo quad nella direzione X. | * | |
QuadReadAcrossY | Restituisce il valore di origine specificato letto dall'altra corsia in questo quad nella direzione Y. | * |
Funzionalità hardware
Per verificare che le funzionalità dell'operazione wave siano disponibili in qualsiasi hardware specifico, chiamare ID3D12Device::CheckFeatureSupport, notando la descrizione e l'uso della struttura D3D12_FEATURE_DATA_D3D12_OPTIONS1 .