Modelo de sombreador HLSL 6.0

Describe los intrínsecos de la operación de onda agregados al modelo de sombreador HLSL 6.0.

Modelo de sombreador 6.0

En el caso de los modelos de sombreador anteriores, la programación HLSL expone solo un único subproceso de ejecución. Se proporcionan nuevas operaciones de nivel de onda, a partir del modelo 6.0, para aprovechar explícitamente el paralelismo de las GPU actuales: muchos subprocesos se pueden ejecutar en lockstep en el mismo núcleo simultáneamente. Por ejemplo, los intrínsecos del modelo 6.0 permiten eliminar construcciones de barrera cuando el ámbito de sincronización está dentro del ancho del procesador SIMD o algún otro conjunto de subprocesos que se sabe que son atómicos entre sí.

Entre los posibles casos de uso se incluyen la compactación de flujos, las reducciones, la transposición de bloques, la ordenación bitónica o las transformaciones rápidas de Fourier (FFT), la discretización, la desduplicación de secuencias y escenarios similares.

La mayoría de los intrínsecos aparecen en sombreadores de píxeles y sombreadores de proceso, aunque hay algunas excepciones (indicadas para cada función). Las funciones se han agregado a los requisitos para el nivel de característica 12.0 de DirectX, en el nivel de API 12.

El <parámetro type> y el valor devuelto de estas funciones implican el tipo de la expresión, los tipos admitidos son los de la lista siguiente que también están presentes en el modelo de sombreador de destino de la aplicación:

  • 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

Algunas operaciones (como los operadores bit a bit) solo admiten los tipos enteros.

Terminología

Término Definición
Carril Un único subproceso de ejecución. Los modelos de sombreador anteriores a la versión 6.0 solo exponen uno de ellos en el nivel de lenguaje, dejando la expansión al procesamiento simD paralelo completamente hasta la implementación.
Wave Un conjunto de carriles (subprocesos) ejecutados simultáneamente en el procesador. No se requieren barreras explícitas para garantizar que se ejecutan en paralelo. Entre los conceptos similares se incluyen "warp" y "wavefront".
Carril inactivo Un carril que no se está ejecutando, por ejemplo, debido al flujo de control o al trabajo insuficiente para rellenar el tamaño mínimo de la onda.
Carril activo Un carril para el que se realiza la ejecución. En los sombreadores de píxeles, puede incluir cualquier carril auxiliar de píxeles.
Cuádruple Un conjunto de 4 carriles adyacentes correspondientes a píxeles organizados en un cuadrado de 2x2. Se usan para calcular los degradados mediante la diferenciación en x o y. Una onda puede estar formada por varios quads. Todos los píxeles de un cuadrante activo se ejecutan (y pueden ser "Lanes activos"), pero los que no producen resultados visibles se denominan "Lanes auxiliares".
Carril auxiliar Un carril que se ejecuta únicamente para el propósito de degradados en cuadrantes de sombreador de píxeles. La salida de este tipo de carril se descartará y, por tanto, no se representará en la superficie de destino.

Intrínsecos del lenguaje sombreado

Todas las operaciones de este modelo de sombreador se han agregado en una gama de funciones intrínsecas.

Consulta de onda

Intrínsecos para consultar una sola onda.

Intrinsic Descripción Sombreador de píxeles Sombreador de proceso
WaveGetLaneCount Devuelve el número de carriles en la onda actual. * *
WaveGetLaneIndex Devuelve el índice del carril actual dentro de la onda actual. * *
WaveIsFirstLane Devuelve true solo para el carril activo en la onda actual con el índice más pequeño. * *

Voto de onda

Este conjunto de intrínsecos compara valores entre subprocesos activos actualmente desde la onda actual.

Intrinsic Descripción Sombreador de píxeles Sombreador de proceso
WaveActiveAnyTrue Devuelve true si la expresión es true en cualquier carril activo de la onda actual. * *
WaveActiveAllTrue Devuelve true si la expresión es true en todos los carriles activos de la onda actual. * *
WaveActiveBallot Devuelve una máscara de bits entero de 64 bits sin signo de la evaluación de la expresión booleana para todos los carriles activos de la onda especificada. * *

Difusión de onda

Estos intrínsecos permiten que todos los carriles activos de la onda actual reciban el valor del carril especificado, lo que lo difunde de forma eficaz. El valor devuelto de un carril no válido no está definido.

Intrinsic Descripción Sombreador de píxeles Sombreador de proceso
WaveReadLaneAt Devuelve el valor de la expresión para el índice de carril especificado dentro de la onda especificada. * *
WaveReadLaneFirst Devuelve el valor de la expresión para el carril activo de la onda actual con el índice más pequeño. * *

Reducción de onda

Estos intrínsecos calculan la operación especificada en todos los carriles activos de la onda y difunden el resultado final a todos los carriles activos. Por lo tanto, la salida final se garantiza uniforme en toda la onda.

Intrinsic Descripción Sombreador de píxeles Sombreador de proceso
WaveActiveAllEqual Devuelve true si la expresión es la misma para cada carril activo de la onda actual (y, por tanto, uniforme a través de ella). * *
WaveActiveBitAnd Devuelve el AND bit a bit de todos los valores de la expresión en todas las carriles activas de la onda actual y replica el resultado en todas las carriles de la onda. * *
WaveActiveBitOr Devuelve el OR bit a bit de todos los valores de la expresión en todos los carriles activos de la onda actual y replica el resultado en todos los carriles de la onda. * *
WaveActiveBitXor Devuelve el OR exclusivo bit a bit de todos los valores de la expresión en todas las carriles activas de la onda actual y replica el resultado en todas las carriles de la onda. * *
WaveActiveCountBits Cuenta el número de variables booleanas que se evalúan como true en todas las carriles activas de la onda actual y replica el resultado en todas las carriles de la onda. * *
WaveActiveMax Calcula el valor máximo de la expresión en todos los carriles activos de la onda actual y replica el resultado en todas las carriles de la onda. * *
WaveActiveMin Calcula el valor mínimo de la expresión en todos los carriles activos de la onda actual y replica el resultado en todas las carriles de la onda. * *
WaveActiveProduct Multiplica los valores de la expresión en todos los carriles activos de la onda actual y replica el resultado en todas las carriles de la onda. * *
WaveActiveSum Suma el valor de la expresión en todos los carriles activos de la onda actual y lo replica en todas las carriles de la onda actual y replica el resultado en todos los carriles de la onda. * *

Examen de onda y prefijo

Estos intrínsecos aplican la operación a cada carril y dejan cada resultado parcial del cálculo en el carril correspondiente.

Intrinsic Descripción Sombreador de píxeles Sombreador de proceso
WavePrefixCountBits Devuelve la suma de todas las variables booleanas especificadas establecidas en true en todos los carriles activos con índices menores que el carril actual. * *
WavePrefixSum Devuelve la suma de todos los valores de los carriles activos con índices más pequeños que este. * *
WavePrefixProduct Devuelve el producto de todos los valores de los carriles antes de esta de la onda especificada. * *

Operaciones aleatorias de cuatro anchos

Estos intrínsecos realizan operaciones de intercambio en los valores de una onda conocida para contener cuadráculos de sombreador de píxeles, tal como se define aquí. Los índices de los píxeles del cuadrángulo se definen en línea de examen o en orden de lectura, donde las coordenadas de un quad son:

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

| [0] [1]

| [2] [3]

v

Y

Estas rutinas funcionan en sombreadores de proceso o sombreadores de píxeles. En los sombreadores de proceso funcionan en quads definidos como grupos divididos uniformemente de 4 dentro de una onda SIMD. En los sombreadores de píxeles, deben usarse en ondas capturadas por WaveQuadLanes; de lo contrario, los resultados no están definidos.

Intrinsic Descripción Sombreador de píxeles Sombreador de proceso
QuadReadLaneAt Devuelve el valor de origen especificado leído desde el carril del cuadrante actual identificado por quadLaneID [0..3] que debe ser uniforme en el cuadrátero. *
QuadReadAcrossDiagonal Devuelve el valor local especificado que se lee del carril diagonalmente opuesto en este cuadrángulo. *
QuadReadAcrossX Devuelve el valor de origen especificado leído desde el otro carril de este cuadrángulo en la dirección X. *
QuadReadAcrossY Devuelve el valor de origen especificado leído desde el otro carril de este cuadrángulo en la dirección Y. *

Funcionalidad de hardware

Para comprobar que las características de operación de onda están disponibles en cualquier hardware específico, llame a ID3D12Device::CheckFeatureSupport, teniendo en cuenta la descripción y el uso de la estructura de D3D12_FEATURE_DATA_D3D12_OPTIONS1 .