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 shading
- query wave
- Wave Vote
- Wave Broadcast
- di riduzione delle onde
- scan d'onda e prefisso
- operazioni shuffle a larghezza quad
- 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 contemporaneamente nello stesso core. Ad esempio, gli intrinseci del modello 6.0 consentono l'eliminazione di costrutti di barriera quando l'ambito della sincronizzazione rientra nella larghezza del processore SIMD o un altro set di thread che sono noti per essere atomici rispetto l'uno all'altro.
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 delle funzioni intrinseche viene visualizzata nei pixel shader e negli shader di calcolo, anche se esistono alcune eccezioni (annotate per ogni funzione). Le funzioni sono state aggiunte ai requisiti per il livello di funzionalità DirectX 12.0, nel livello API 12.
Il tipo <> parametro e valore restituito per queste funzioni implica il tipo dell'espressione, i tipi supportati sono quelli dell'elenco seguente che sono 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. |
Onda | 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 di lavoro insufficiente per riempire le dimensioni minime dell'onda. |
Corsia attiva | Corsia per la quale viene eseguita l'esecuzione. Negli shader pixel 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 del 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.
intrinseci | 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.
intrinseci | 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 dell'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. | * | * |
Onda broadcast
Queste funzioni intrinseche 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.
intrinseci | 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 dell'onda e trasmettono il risultato finale a tutte le corsie attive. Pertanto, l'output finale è garantito uniforme attraverso l'onda.
intrinseci | Descrizione | pixel shader | compute shader |
---|---|---|---|
WaveActiveAllEqual | Restituisce true se l'espressione è la stessa per ogni corsia attiva nell'onda corrente e quindi uniforme su 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 restituiscono true in tutte le corsie attive dell'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 dell'onda corrente e replica il risultato in tutte le corsie dell'onda. | * | * |
WaveActiveSum | Somma il valore dell'espressione in tutte le corsie attive dell'onda corrente e la replica in tutte le corsie dell'onda corrente e replica il risultato in tutte le corsie dell'onda. | * | * |
Analisi delle onde e prefisso
Queste funzioni intrinseche applicano l'operazione a ogni corsia e lasciano ogni risultato parziale del calcolo nella corsia corrispondente.
intrinseci | Descrizione | pixel shader | compute shader |
---|---|---|---|
WavePrefixCountBits | Restituisce la somma di tutte le variabili booleane specificate impostate su true in tutte le corsie attive con indici inferiori 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 dell'onda specificata. | * | * |
Operazioni shuffle a larghezza quad
Questi oggetti intrinseci eseguono operazioni di scambio sui valori in un'onda nota per contenere quadr pixel shader, come definito qui. Gli indici dei pixel nel quad sono definiti in ordine di scansione o lettura, dove le coordinate all'interno di un quad sono:
+---------> X
| [0] [1]
| [2] [3]
v
Y
Queste routine funzionano in shader di calcolo o pixel shader. Nei compute shader operano in quad definiti come gruppi equamente 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.
Funzionalità hardware
Per verificare che le funzionalità dell'operazione d'onda siano disponibili in qualsiasi hardware specifico, chiamare ID3D12Device::CheckFeatureSupport, notando la descrizione e l'uso della struttura D3D12_FEATURE_DATA_D3D12_OPTIONS1.
Argomenti correlati
- Guida alla programmazione di per HLSL
- intrinseci del modello shader 6