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
- Terminología
- Intrínsecos del lenguaje sombreado
- Funcionalidad de hardware
- Temas relacionados
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 .