Condividi tramite


Modello shader HLSL 6.0

Descrive gli intrinseci dell'operazione d'onda aggiunti al modello shader HLSL 6.0.

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.

intrinseci Descrizione pixel shader compute shader
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 d'onda siano disponibili in qualsiasi hardware specifico, chiamare ID3D12Device::CheckFeatureSupport, notando la descrizione e l'uso della struttura D3D12_FEATURE_DATA_D3D12_OPTIONS1.

  • Guida alla programmazione di per HLSL
  • intrinseci del modello shader 6