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 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 .