Compartilhar via


Modelo 6.0 do Sombreador HLSL

Descreve os intrínsecos da operação de onda adicionados ao Modelo de Sombreador HLSL 6.0.

Modelo de sombreador 6.0

Para modelos de sombreador anteriores, a programação HLSL expõe apenas um único thread de execução. Novas operações de nível de onda são fornecidas, começando com o modelo 6.0, para aproveitar explicitamente o paralelismo das GPUs atuais – muitos threads podem estar sendo executados em lockstep no mesmo núcleo simultaneamente. Por exemplo, os intrínsecos do modelo 6.0 permitem a eliminação de constructos de barreira quando o escopo da sincronização está dentro da largura do processador SIMD ou algum outro conjunto de threads que são conhecidos por serem atômicos em relação uns aos outros.

Os possíveis casos de uso incluem: compactação de fluxo, reduções, transposição de bloco, classificação bitônica ou FFT (Transformações do Fourier Rápido), binamento, eliminação de duplicação de fluxo e cenários semelhantes.

A maioria dos intrínsecos aparece em sombreadores de pixel e sombreadores de computação, embora haja algumas exceções (indicadas para cada função). As funções foram adicionadas aos requisitos do DirectX Feature Level 12.0, no nível 12 da API.

O <parâmetro de tipo> e o valor retornado para essas funções implicam o tipo da expressão, os tipos com suporte são aqueles da lista a seguir que também estão presentes no modelo de sombreador de destino para seu aplicativo:

  • 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

Algumas operações (como os operadores bit a bit) só dão suporte aos tipos inteiros.

Terminologia

Termo Definição
Pista Um único thread de execução. Os modelos de sombreador antes da versão 6.0 expõem apenas um deles no nível da linguagem, deixando a expansão para o processamento simd paralelo inteiramente até a implementação.
Wave Um conjunto de faixas (threads) executadas simultaneamente no processador. Nenhuma barreira explícita é necessária para garantir que elas sejam executadas em paralelo. Conceitos semelhantes incluem "dobra" e "frente de onda".
Pista Inativa Uma pista que não está sendo executada, por exemplo, devido ao fluxo de controle ou trabalho insuficiente para preencher o tamanho mínimo da onda.
Active Lane Uma pista para a qual a execução está sendo executada. Em sombreadores de pixel, ele pode incluir qualquer faixa de pixel auxiliar.
Quad Um conjunto de 4 pistas adjacentes correspondentes a pixels organizados em um quadrado 2x2. Eles são usados para estimar gradientes por diferenciação em x ou y. Uma onda pode ser composta por vários quadriciclos. Todos os pixels em um quad ativo são executados (e podem ser "Active Lanes"), mas aqueles que não produzem resultados visíveis são chamados de "Pistas auxiliares".
Helper Lane Uma pista que é executada exclusivamente para fins de gradientes em quadras de sombreador de pixel. A saída de tal pista será descartada e, portanto, não será renderizada para a superfície de destino.

Intrínsecos de linguagem de sombreamento

Todas as operações desse modelo de sombreador foram adicionadas em um intervalo de funções intrínsecas.

Consulta de onda

Os intrínsecos para consultar uma única onda.

Intrinsic Descrição Sombreador de pixel Sombreador de computação
WaveGetLaneCount Retorna o número de pistas na onda atual. * *
WaveGetLaneIndex Retorna o índice da pista atual dentro da onda atual. * *
WaveIsFirstLane Retorna true somente para a pista ativa na onda atual com o menor índice * *

Voto de onda

Esse conjunto de intrínsecos compara valores entre threads atualmente ativos da onda atual.

Intrinsic Descrição Sombreador de pixel Sombreador de computação
WaveActiveAnyTrue Retornará true se a expressão for verdadeira em qualquer faixa ativa na onda atual. * *
WaveActiveAllTrue Retorna true se a expressão for verdadeira em todas as faixas ativas na onda atual. * *
WaveActiveBallot Retorna um bitmask inteiro sem sinal de 64 bits da avaliação da expressão booliana para todas as faixas ativas na onda especificada. * *

Transmissão de onda

Esses intrínsecos permitem que todas as faixas ativas na onda atual recebam o valor da pista especificada, transmitindo-o efetivamente. O valor retornado de uma pista inválida é indefinido.

Intrinsic Descrição Sombreador de pixel Sombreador de computação
WaveReadLaneAt Retorna o valor da expressão para o índice de faixa fornecido dentro da onda especificada. * *
WaveReadLaneFirst Retorna o valor da expressão para a faixa ativa da onda atual com o menor índice. * *

Redução de ondas

Esses intrínsecos calculam a operação especificada em todas as faixas ativas na onda e transmitem o resultado final para todas as pistas ativas. Portanto, a saída final é uniforme garantida em toda a onda.

Intrinsic Descrição Sombreador de pixel Sombreador de computação
WaveActiveAllEqual Retornará true se a expressão for a mesma para cada faixa ativa na onda atual (e, portanto, uniforme nela). * *
WaveActiveBitAnd Retorna o AND bit a bit de todos os valores da expressão em todas as faixas ativas na onda atual e replica o resultado para todas as pistas na onda. * *
WaveActiveBitOr Retorna o OR bit a bit de todos os valores da expressão em todas as faixas ativas na onda atual e replica o resultado para todas as faixas na onda. * *
WaveActiveBitXor Retorna o OR exclusivo bit a bit de todos os valores da expressão em todas as faixas ativas na onda atual e replica o resultado para todas as pistas na onda. * *
WaveActiveCountBits Conta o número de variáveis boolianas que são avaliadas como verdadeiras em todas as faixas ativas na onda atual e replica o resultado para todas as faixas na onda. * *
WaveActiveMax Calcula o valor máximo da expressão em todas as faixas ativas na onda atual e replica o resultado para todas as pistas na onda. * *
WaveActiveMin Calcula o valor mínimo da expressão em todas as faixas ativas na onda atual e replica o resultado para todas as faixas na onda. * *
WaveActiveProduct Multiplica os valores da expressão em todas as faixas ativas na onda atual e replica o resultado para todas as pistas na onda. * *
WaveActiveSum Resume o valor da expressão em todas as pistas ativas na onda atual e a replica para todas as pistas na onda atual e replica o resultado para todas as pistas na onda. * *

Verificação de onda e prefixo

Esses intrínsecos aplicam a operação a cada faixa e deixam cada resultado parcial da computação na faixa correspondente.

Intrinsic Descrição Sombreador de pixel Sombreador de computação
WavePrefixCountBits Retorna a soma de todas as variáveis boolianas especificadas definidas como true em todas as faixas ativas com índices menores que a faixa atual. * *
WavePrefixSum Retorna a soma de todos os valores nas faixas ativas com índices menores que este. * *
WavePrefixProduct Retorna o produto de todos os valores nas pistas antes dessa onda especificada. * *

Operações de embaralhamento em todo o quadrilátero

Esses intrínsecos executam operações de troca nos valores em uma onda conhecida por conter quads de sombreador de pixel, conforme definido aqui. Os índices dos pixels no quadriciclo são definidos na ordem de leitura ou linha de verificação , em que as coordenadas dentro de um quadriciclo são:

+---------> X

| [0] [1]

| [2] [3]

v

S

Essas rotinas funcionam em sombreadores de computação ou sombreadores de pixel. Em sombreadores de computação, eles operam em quadras definidos como grupos divididos uniformemente de 4 em uma onda SIMD. Em sombreadores de pixel, eles devem ser usados em ondas capturadas por WaveQuadLanes, caso contrário, os resultados são indefinidos.

Intrinsic Descrição Sombreador de pixel Sombreador de computação
QuadReadLaneAt Retorna o valor de origem especificado lido da faixa do quad atual identificado por quadLaneID [0..3] que deve ser uniforme no quadriciclo. *
QuadReadAcrossDiagonal Retorna o valor local especificado que é lido da pista diagonalmente oposta neste quadriciclo. *
QuadReadAcrossX Retorna o valor de origem especificado lido da outra pista neste quadriciclo na direção X. *
QuadReadAcrossY Retorna o valor de origem especificado lido da outra pista neste quadriciclo na direção Y. *

Funcionalidade de hardware

Para marcar que os recursos de operação de onda estejam disponíveis em qualquer hardware específico, chame ID3D12Device::CheckFeatureSupport, observando a descrição e o uso da estrutura D3D12_FEATURE_DATA_D3D12_OPTIONS1.