sincronizzazione (sm5 - asm)

Barriera di sincronizzazione o memoria del gruppo di thread.

sync[_uglobal|_ugroup][_g][_t]

 

Commenti

La sincronizzazione include opzioni _uglobal, _ugroup, _g e _t.

Nel pixel shader è consentito solo sync_uglobal .

Nell'shader di calcolo è necessario specificare _uglobal o _ugroup*) e/o _g. _t è facoltativo.

_uglobal

Recinzione di memoria U# globale (UAV).

Tutte le letture/scritture di memoria u# precedenti da questo thread nell'ordine di programma vengono rese visibili a tutti i thread sull'intera GPU prima di qualsiasi accesso di memoria u# successivo da questo thread. L'intera parte GPU della definizione viene sostituita da un ambito minore di globale in un caso, descritto di seguito.

Ciò si applica a tutte le memoria UAV associate alla fase dello shader corrente.

_uglobal è disponibile nello shader di calcolo o nel pixel shader.

Per qualsiasi UAV associato che non è stato dichiarato dallo shader come coerente a livello globale, la recinzione di memoria u# _uglobal ha visibilità solo all'interno del thread-group dello shader di calcolo corrente per tale UAV, come se sia _ugroup anziché _uglobal. Questo problema si applica solo allo shader di calcolo, poiché lo shader pixel deve dichiarare tutti gli UAV come coerenti a livello globale.

_ugroup

Recinto di memoria UAV (Thread group scope u#).

Tutte le letture o le scritture di memoria u# precedenti da questo thread nell'ordine di programma vengono rese visibili a tutti i thread del gruppo di thread prima di qualsiasi accesso di memoria u# successivo da questo thread.

Ciò si applica a tutte le memoria UAV associate alla fase dello shader corrente.

_ugroup è disponibile solo nell'shader di calcolo.

Se _ugroup viene esposto, per alcune implementazioni. Il vantaggio di specificare _ugroup anziché _uglobal è che l'operazione di sincronizzazione può completare più rapidamente.

Altre implementazioni non distingueno _ugroup da _uglobal, quindi entrambe le operazioni sono equivalenti e si comportano come _uglobal. Le applicazioni possono specificare la loro finalità richiedendo l'ambito di sincronizzazione più stretto necessario.

Anche se un determinato UAV viene dichiarato come coerente a livello globale, un'operazione di sincronizzazione _ugroup funzionerà in modo più efficiente su tale UAV se una barriera globale non è necessaria.

_g

recinzione g# (memoria condivisa del gruppo di thread).

Tutte le letture o le scritture di memoria g# precedenti da questo thread nell'ordine di programma vengono rese visibili a tutti i thread del gruppo di thread prima di qualsiasi accesso alla memoria g# successiva da questo thread.

Ciò si applica a tutta la memoria condivisa g# del gruppo di thread corrente.

_g è disponibile solo nell'shader di calcolo.

_t

Sincronizzazione del gruppo di thread. Tutti i thread all'interno di un singolo gruppo di thread (quelli che possono condividere l'accesso a un set comune di spazio di registrazione condiviso) verranno eseguiti fino al punto in cui raggiungono questa istruzione prima che qualsiasi thread possa continuare.

_t non può essere inserito nel controllo flusso dinamico, (rami che possono variare all'interno di un gruppo di thread), ma possono essere presenti nel controllo flusso uniforme, in cui tutti i thread del gruppo selezionano lo stesso percorso.

_t è disponibile solo nell'shader di calcolo.

Di seguito è riportato un elenco di varianti di compute shader 'sync'.

  • sync_g
  • sync_ugroup*
  • sync_uglobal
  • sync_g_t
  • sync_ugroup_t*
  • sync_uglobal_t
  • sync_ugroup_g*
  • sync_uglobal_g
  • sync_ugroup_g_t*
  • sync_uglobal_g_t

*Le varianti con _ugroup potrebbero non essere destinate al compilatore HLSL, per la discussione precedente nella sezione _ugroup precedente.

L'elenco delle varianti di sincronizzazione pixel shader include solo sync_uglobal.

Le recinzioni di memoria impediscono che le istruzioni interessate vengano riordinate dai compilatori o dall'hardware attraverso la recinzione.

È possibile comprimere più letture dallo stesso indirizzo tramite una chiamata shader che non sono separate da barriere di memoria o scritture nell'indirizzo. Lo stesso vale per le operazioni di scrittura. Gli accessi separati da una barriera non possono essere uniti o spostati attraverso la barriera.

Le recinzioni di memoria non sono necessarie per le operazioni atomiche a un determinato indirizzo da thread diversi per funzionare correttamente. Le recinzioni sono necessarie quando le operazioni atomiche e/o di carico/archiviazione devono essere sincronizzate rispetto all'una all'altra quando appaiono in singoli thread dal punto di vista di altri thread.

Nel pixel shader ignorare le istruzioni implicano una sync_uglobal recinzione, in tali istruzioni non è possibile riordinare attraverso l'eliminazione. sync_uglobal in pixel helper (che vengono eseguiti solo per supportare derivati) o i pixel eliminati possono o non avere alcun effetto. Non è consentito che il helper o i pixel eliminati vengano scritti in UAV se, nel caso di eliminazione, le scritture vengono rilasciate dopo l'eliminazione. I valori restituiti dagli UAV non possono contribuire ai calcoli derivati. Pertanto, indipendentemente dal fatto che sync_u sia onorato per i pixel helper o quando viene rilasciato dopo che un'eliminazione è moot.

cs_4_0 e cs_4_1 supportano questa istruzione.

Questa istruzione si applica alle fasi dello shader seguenti:

Vertice Scafo Dominio Geometria Pixel Calcolo
X X

 

Poiché le UAV sono disponibili in tutte le fasi dello shader per Direct3D 11.1, la variante sync_uglobal di questa istruzione si applica a tutte le fasi shader per il runtime Direct3D 11.1, disponibile a partire da Windows 8.

Vertice Scafo Dominio Geometria Pixel Calcolo
X X X X X X

 

Modello di shader minimo

Questa istruzione è supportata nei modelli shader seguenti:

Modello di shader Supportato
Modello shader 5
Modello shader 4.1 no
Modello shader 4 no
Modello shader 3 (DirectX HLSL) no
Modello shader 2 (DirectX HLSL) no
Modello shader 1 (DirectX HLSL) no

 

Assembly modello shader 5 (DirectX HLSL)