sync (sm5 – asm)

Sincronização de grupo de threads ou barreira de memória.

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

 

Comentários

A sincronização tem opções _uglobal, _ugroup, _g e _t.

No sombreador de pixel, somente sync_uglobal é permitido.

No sombreador de computação, (_uglobal ou _ugroup*) e/ou _g devem ser especificados. _t é opcional além disso.

_uglobal

Limite de memória UAV (u# global).

Todas as leituras/gravações de memória u# anteriores por esse thread na ordem do programa ficam visíveis para todos os threads em toda a GPU antes de qualquer acesso de memória u# subsequente por esse thread. Toda a parte da GPU da definição é substituída por um escopo menor que o global em um caso, descrito abaixo.

Isso se aplica a toda a memória UAV associada no estágio atual do sombreador.

_uglobal está disponível no sombreador de computação ou sombreador de pixel.

Para qualquer UAV associado que não tenha sido declarado pelo sombreador como Globalmente Coerente, a cerca de memória _uglobal u# só tem visibilidade dentro do grupo de threads do sombreador de computação atual para esse UAV, como se fosse _ugroup em vez de _uglobal. Esse problema só se aplica ao sombreador de computação, pois o sombreador de pixel deve declarar todos os UAVs como Globalmente Coerentes.

_ugroup

Limite de memória UAV (escopo do grupo de threads u#).

Todas as leituras ou gravações de memória u# anteriores por esse thread na ordem do programa ficam visíveis para todos os threads no grupo de threads antes de qualquer acesso de memória u# subsequente por esse thread.

Isso se aplica a toda a memória UAV associada no estágio atual do sombreador.

_ugroup está disponível somente no sombreador de computação.

Se _ugroup for exposto, para algumas implementações. A vantagem de especificar _ugroup em vez de _uglobal é que a operação de sincronização pode ser concluída mais rapidamente.

Outras implementações não distinguem _ugroup de _uglobal, portanto, ambas as operações são equivalentes e se comportam como _uglobal. Os aplicativos podem especificar sua intenção solicitando o escopo mais estreito de sincronização necessário.

Mesmo que um UAV específico seja declarado como Globalmente Coerente, uma operação de sincronização _ugroup funcionará com mais eficiência nesse UAV se uma barreira global não for necessária.

_g

g# (memória compartilhada do grupo de threads).

Todas as leituras ou gravações de memória g# anteriores por esse thread na ordem do programa ficam visíveis para todos os threads no grupo de threads antes de qualquer acesso subsequente de memória g# por esse thread.

Isso se aplica a toda a memória compartilhada g# do grupo de threads atual.

_g está disponível somente no sombreador de computação.

_t

Sincronização de grupo de threads. Todos os threads dentro de um único grupo de threads (aqueles que podem compartilhar o acesso a um conjunto comum de espaço de registro compartilhado) serão executados até o ponto em que chegarem a essa instrução antes que qualquer thread possa continuar.

_t não pode ser colocado no controle de fluxo dinâmico (branches que podem variar dentro de um grupo de threads), mas podem estar presentes no controle de fluxo uniforme, em que todos os threads no grupo escolhem o mesmo caminho.

_t está disponível somente no sombreador de computação.

Veja a seguir uma listagem de variantes de "sincronização" do sombreador de computação.

  • 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

*Variantes com _ugroup podem não ser direcionadas pelo compilador HLSL, de acordo com a discussão anterior na seção _ugroup acima.

A listagem de variantes de sincronização de sombreador de pixel inclui apenas sync_uglobal.

As cercas de memória impedem que as instruções afetadas sejam reordenadas por compiladores ou hardware em toda a cerca.

Várias leituras do mesmo endereço por uma invocação de sombreador que não são separadas por barreiras de memória ou gravações no endereço podem ser recolhidas juntas. O mesmo se aplica às gravações. Os acessos separados por uma barreira não podem ser mesclados ou movidos pela barreira.

As cercas de memória não são necessárias para que as operações atômicas em um determinado endereço por threads diferentes funcionem corretamente. As cercas são necessárias quando as operações atômicas e/ou de carregamento/repositório precisam ser sincronizadas em relação umas às outras à medida que aparecem em threads individuais do ponto de vista de outros threads.

No sombreador de pixel, as instruções de descarte implicam uma cerca sync_uglobal, na qual as instruções não podem ser reordenadas no descarte. sync_uglobal em pixels auxiliares (que são executados apenas para dar suporte a derivativos) ou pixels descartados podem ou não ter nenhum efeito. Não é permitido que pixels auxiliares ou descartados gravem em UAVs se, no caso de descarte, as gravações forem emitidas após o descarte. Os valores retornados de UAVs não têm permissão para contribuir com cálculos derivados. Portanto, se sync_u é ou não respeitada para pixels auxiliares ou quando emitido após um descarte é discutível.

cs_4_0 e cs_4_1 dão suporte a esta instrução.

Esta instrução se aplica aos seguintes estágios de sombreador:

Vértice Casco Domínio Geometry Pixel Computação
X X

 

Como os UAVs estão disponíveis em todos os estágios de sombreador para o Direct3D 11.1, o sync_uglobal variante dessa instrução se aplica a todos os estágios de sombreador para o runtime do Direct3D 11.1, que está disponível a partir do Windows 8.

Vértice Casco Domínio Geometry Pixel Computação
X X X X X X

 

Modelo de sombreador mínimo

Esta instrução tem suporte nos seguintes modelos de sombreador:

Modelo de Sombreador Com suporte
Modelo de sombreador 5 sim
Modelo de sombreador 4.1 não
Modelo de sombreador 4 não
Modelo de sombreador 3 (DirectX HLSL) não
Modelo de sombreador 2 (DirectX HLSL) não
Modelo de sombreador 1 (DirectX HLSL) não

 

Assembly do Modelo de Sombreador 5 (DirectX HLSL)