Modèle de nuanceur HLSL 6.0
Décrit les intrinsèques de l’opération d’onde ajoutées au modèle HLSL Shader 6.0.
- Modèle de nuanceur 6.0
- Terminologie
- Intrinsèques du langage de trame de fond
- Fonctionnalité matérielle
- Rubriques connexes
Modèle de nuanceur 6.0
Pour les modèles de nuanceur antérieurs, la programmation HLSL n’expose qu’un seul thread d’exécution. De nouvelles opérations au niveau de la vague sont fournies, à compter du modèle 6.0, pour tirer explicitement parti du parallélisme des GPU actuels . De nombreux threads peuvent être exécutés simultanément sur le même cœur. Par exemple, les intrinsèques du modèle 6.0 permettent d’éliminer les constructions de barrière lorsque l’étendue de la synchronisation se situe dans la largeur du processeur SIMD ou d’un autre ensemble de threads connus pour être atomiques les uns par rapport aux autres.
Les cas d’usage potentiels sont les suivants : compactage de flux, réductions, transposition de blocs, tri bitonique ou transformations rapides de Fourier (FFT), binning, déduplication de flux et scénarios similaires.
La plupart des intrinsèques apparaissent dans les nuanceurs de pixels et les nuanceurs de calcul, bien qu’il existe quelques exceptions (notées pour chaque fonction). Les fonctions ont été ajoutées à la configuration requise pour le niveau de fonctionnalité DirectX 12.0, sous le niveau d’API 12.
Le <paramètre de type> et la valeur de retour pour ces fonctions impliquent le type de l’expression, les types pris en charge sont ceux de la liste suivante qui sont également présents dans le modèle de nuanceur cible pour votre application :
- 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
Certaines opérations (telles que les opérateurs au niveau du bit) prennent uniquement en charge les types entiers.
Terminologie
Terme | Définition |
---|---|
Couloir | Un thread d’exécution unique. Les modèles de nuanceur antérieurs à la version 6.0 n’exposent qu’un seul d’entre eux au niveau du langage, laissant l’extension au traitement SIMD parallèle entièrement à l’implémentation. |
Vague | Ensemble de voies (threads) exécutées simultanément dans le processeur. Aucune barrière explicite n’est requise pour garantir qu’elles s’exécutent en parallèle. Les concepts similaires incluent « warp » et « wavefront ». |
Voie inactive | Voie qui n’est pas exécutée, par exemple en raison du flux de contrôle, ou d’un travail insuffisant pour remplir la taille minimale de la vague. |
Voie active | Voie pour laquelle l’exécution est effectuée. Dans les nuanceurs de pixels, il peut inclure n’importe quelle voie de pixel d’assistance. |
Quad | Ensemble de 4 voies adjacentes correspondant à des pixels disposés dans un carré de 2x2. Ils sont utilisés pour estimer les dégradés en différenciant en x ou y. Une vague peut être composée de plusieurs quads. Tous les pixels d’un quad actif sont exécutés (et peuvent être des « voies actives »), mais ceux qui ne produisent pas de résultats visibles sont appelés « Voies d’assistance ». |
Helper Lane | Voie exécutée uniquement à des fins de dégradés dans les quads du nuanceur de pixels. La sortie d’une telle voie est ignorée et ne s’affiche donc pas sur la surface de destination. |
Intrinsèques du langage de trame de fond
Toutes les opérations de ce modèle de nuanceur ont été ajoutées dans une plage de fonctions intrinsèques.
Requête Wave
Intrinsèques pour l’interrogation d’une seule vague.
Intrinsic | Description | Nuanceur de pixels | Nuanceur de calcul |
---|---|---|---|
WaveGetLaneCount | Retourne le nombre de voies dans la vague actuelle. | * | * |
WaveGetLaneIndex | Retourne l’index de la voie actuelle dans la vague actuelle. | * | * |
WaveIsFirstLane | Retourne true uniquement pour la voie active dans l’onde actuelle avec le plus petit index | * | * |
Vote de vague
Cet ensemble d’intrinsèques compare les valeurs entre les threads actuellement actifs à partir de la vague actuelle.
Intrinsic | Description | Nuanceur de pixels | Nuanceur de calcul |
---|---|---|---|
WaveActiveAnyTrue | Retourne true si l’expression a la valeur true dans n’importe quelle voie active dans la vague actuelle. | * | * |
WaveActiveAllTrue | Retourne true si l’expression a la valeur true dans toutes les voies actives de la vague actuelle. | * | * |
WaveActiveBallot | Retourne un masque de bits entiers non signés 64 bits de l’évaluation de l’expression booléenne pour toutes les voies actives dans la vague spécifiée. | * | * |
Diffusion de vague
Ces intrinsèques permettent à toutes les voies actives de la vague actuelle de recevoir la valeur de la voie spécifiée, en la diffusant efficacement. La valeur de retour d’une voie non valide n’est pas définie.
Intrinsic | Description | Nuanceur de pixels | Nuanceur de calcul |
---|---|---|---|
WaveReadLaneAt | Retourne la valeur de l’expression pour l’index de voie donné dans la vague spécifiée. | * | * |
WaveReadLaneFirst | Retourne la valeur de l’expression pour la voie active de l’onde actuelle avec le plus petit index. | * | * |
Réduction des vagues
Ces intrinsèques calculent l’opération spécifiée sur toutes les voies actives de la vague et diffusent le résultat final à toutes les voies actives. Par conséquent, la sortie finale est garantie uniforme sur l’ensemble de la vague.
Intrinsic | Description | Nuanceur de pixels | Nuanceur de calcul |
---|---|---|---|
WaveActiveAllEqual | Retourne true si l’expression est la même pour chaque voie active dans l’onde actuelle (et donc uniforme sur celle-ci). | * | * |
WaveActiveBitAnd | Renvoie le bit AND de toutes les valeurs de l’expression sur toutes les voies actives de la vague actuelle et réplique le résultat dans toutes les voies de la vague. | * | * |
WaveActiveBitOr | Retourne le OR au niveau du bit de toutes les valeurs de l’expression sur toutes les voies actives de la vague actuelle et réplique le résultat dans toutes les voies de la vague. | * | * |
WaveActiveBitXor | Renvoie la valeur OR exclusive au niveau du bit de toutes les valeurs de l’expression sur toutes les voies actives de la vague actuelle et réplique le résultat dans toutes les voies de la vague. | * | * |
WaveActiveCountBits | Compte le nombre de variables booléennes qui sont évaluées à true sur toutes les voies actives de la vague actuelle et réplique le résultat sur toutes les voies de la vague. | * | * |
WaveActiveMax | Calcule la valeur maximale de l’expression sur toutes les voies actives de la vague actuelle et réplique le résultat sur toutes les voies de la vague. | * | * |
WaveActiveMin | Calcule la valeur minimale de l’expression sur toutes les voies actives de la vague actuelle et réplique le résultat sur toutes les voies de la vague. | * | * |
WaveActiveProduct | Multiplie les valeurs de l’expression sur toutes les voies actives de la vague actuelle et réplique le résultat dans toutes les voies de la vague. | * | * |
WaveActiveSum | Additionne la valeur de l’expression sur toutes les voies actives de la vague actuelle et la réplique à toutes les voies de la vague actuelle, puis réplique le résultat sur toutes les voies de la vague actuelle. | * | * |
Wave Scan et préfixe
Ces intrinsèques appliquent l’opération à chaque voie et laissent chaque résultat partiel du calcul dans la voie correspondante.
Intrinsic | Description | Nuanceur de pixels | Nuanceur de calcul |
---|---|---|---|
WavePrefixCountBits | Retourne la somme de toutes les variables booléennes spécifiées définies sur true sur toutes les voies actives avec des index plus petits que la voie actuelle. | * | * |
WavePrefixSum | Retourne la somme de toutes les valeurs des voies actives avec des index plus petits que celui-ci. | * | * |
WavePrefixProduct | Retourne le produit de toutes les valeurs dans les voies avant celle-ci de la vague spécifiée. | * | * |
Opérations de shuffle à quatre largeurs
Ces intrinsèques effectuent des opérations d’échange sur les valeurs d’une vague connue pour contenir des quads de nuanceur de pixels, comme défini ici. Les index des pixels dans le quad sont définis dans la ligne de balayage ou l’ordre de lecture, où les coordonnées d’un quad sont les suivantes :
+---------> X
| [0] [1]
| [2] [3]
v
O
Ces routines fonctionnent dans des nuanceurs de calcul ou des nuanceurs de pixels. Dans les nuanceurs de calcul, ils fonctionnent dans des quads définis comme des groupes uniformément divisés de 4 au sein d’une vague SIMD. Dans les nuanceurs de pixels, ils doivent être utilisés sur les ondes capturées par WaveQuadLanes. Sinon, les résultats ne sont pas définis.
Intrinsic | Description | Nuanceur de pixels | Nuanceur de calcul |
---|---|---|---|
QuadReadLaneAt | Retourne la valeur source spécifiée lue à partir de la voie du quad actuel identifié par quadLaneID [0..3] qui doit être uniforme sur le quad. | * | |
QuadReadAcrossDiagonal | Retourne la valeur locale spécifiée qui est lue à partir de la voie opposée en diagonale dans ce quad. | * | |
QuadReadAcrossX | Retourne la valeur source spécifiée lue à partir de l’autre voie dans ce quad dans le sens X. | * | |
QuadReadAcrossY | Retourne la valeur source spécifiée lue à partir de l’autre voie dans ce quad dans le sens Y. | * |
Fonctionnalité matérielle
Pour case activée que les fonctionnalités d’opération wave sont disponibles sur n’importe quel matériel spécifique, appelez ID3D12Device::CheckFeatureSupport, en notant la description et l’utilisation de la structure D3D12_FEATURE_DATA_D3D12_OPTIONS1.