HLSL Shader Model 6.0
Décrit les intrinsèques de l’opération d’onde ajoutées au modèle de nuanceur HLSL 6.0.
- modèle de nuanceur 6.0
- terminologie
-
intrinsèques du langage shading
- de requête Wave
- de vote vague
- de diffusion d’ondes
- réduction des vagues
- analyse d’ondes et de préfixe
- opérations de shuffle à quatre échelles
- fonctionnalité matériel
- 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 l’onde sont fournies, à partir du modèle 6.0, pour tirer parti explicitement du parallélisme des GPU actuels : de nombreux threads peuvent s’exécuter simultanément dans lockstep sur le même cœur. Par exemple, les intrinsèques du modèle 6.0 permettent l’élimination des constructions de barrière lorsque l’étendue de la synchronisation se trouve dans la largeur du processeur SIMD, ou d’un autre ensemble de threads connus comme atomiques par rapport aux autres.
Les cas d’usage potentiels sont les suivants : compactage de flux, réductions, transposer des 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 certaines exceptions (notées pour chaque fonction). Les fonctions ont été ajoutées aux exigences de DirectX Feature Level 12.0, sous le niveau d’API 12.
Le <type> paramètre et valeur de retour pour ces fonctions implique 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 |
---|---|
Pelouse | Thread unique d’exécution. Les modèles de nuanceur avant la version 6.0 n’exposent qu’un seul de ces modèles au niveau du langage, ce qui laisse l’extension au traitement SIMD parallèle entièrement jusqu’à 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 aux pixels disposés dans un carré de 2x2. Ils sont utilisés pour estimer les dégradés par différenciation dans 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 « Voies actives »), mais ceux qui ne produisent pas de résultats visibles sont appelés « Voies d’assistance ». |
Lane d’assistance | Voie exécutée uniquement à des fins de dégradés en quads de nuanceur de pixels. La sortie d’une telle voie est ignorée et ne s’affiche 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.
intrinsèque | Description | nuanceur de pixels | de 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 la vague actuelle avec le plus petit index | * | * |
Vote d’onde
Cet ensemble d’intrinsèques compare les valeurs entre les threads actuellement actifs à partir de la vague actuelle.
intrinsèque | Description | nuanceur de pixels | de nuanceur de calcul |
---|---|---|---|
WaveActiveAnyTrue | Retourne true si l’expression est vraie dans n’importe quelle voie active dans la vague actuelle. | * | * |
WaveActiveAllTrue | Retourne true si l’expression est vraie dans toutes les voies actives de la vague actuelle. | * | * |
WaveActiveBallot | Retourne un masque de bits entier non signé 64 bits de l’évaluation de l’expression booléenne pour toutes les voies actives dans la vague spécifiée. | * | * |
Diffusion d’ondes
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.
intrinsèque | Description | nuanceur de pixels | de nuanceur de calcul |
---|---|---|---|
WaveReadLaneAt | Retourne la valeur de l’expression pour l’index de voie donnée 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 sur toutes les voies actives. Par conséquent, la sortie finale est garantie uniforme à travers la vague.
intrinsèque | Description | nuanceur de pixels | de nuanceur de calcul |
---|---|---|---|
WaveActiveAllEqual | Retourne true si l’expression est la même pour chaque voie active dans la vague actuelle (et donc uniforme). | * | * |
WaveActiveBitAnd | Retourne l’AND 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 sur toutes les voies de la vague. | * | * |
WaveActiveBitOr | Retourne l’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 sur toutes les voies de la vague. | * | * |
WaveActiveBitXor | Retourne l’OR exclusif 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 sur 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 ensemble sur toutes les voies actives de la vague actuelle et réplique le résultat sur toutes les voies de la vague. | * | * |
WaveActiveSum | Résume la valeur de l’expression sur toutes les voies actives de la vague actuelle et la réplique sur toutes les voies de l’onde actuelle, et réplique le résultat sur toutes les voies de la vague. | * | * |
Analyse et préfixe d’ondes
Ces intrinsèques appliquent l’opération à chaque voie et laissent chaque résultat partiel du calcul dans la voie correspondante.
intrinsèque | Description | nuanceur de pixels | de 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 inférieurs à la voie actuelle. | * | * |
WavePrefixSum | Retourne la somme de toutes les valeurs des voies actives avec des indices plus petits que celui-ci. | * | * |
WavePrefixProduct | Retourne le produit de toutes les valeurs dans les voies avant l’une des vagues spécifiées. | * | * |
Opérations aléatoires à 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 tels que définis ici. Les index des pixels du quad sont définis dans l’ordre de lecture ou de ligne d’analyse , où les coordonnées d’un quad sont les suivantes :
+---------> X
| [0] [1]
| [2] [3]
v
Y
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 dans 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.
intrinsèque | Description | nuanceur de pixels | de 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 en diagonale opposée dans ce quad. | * | |
quadReadAcrossX | Retourne la valeur source spécifiée lue à partir de l’autre voie dans ce quad dans la direction X. | * | |
QuadReadAcrossY | Retourne la valeur source spécifiée lue à partir de l’autre voie dans ce quad dans la direction Y. | * |
Fonctionnalité matérielle
Pour vérifier que les fonctionnalités d’opération d’onde sont disponibles sur n’importe quel matériel spécifique, appelez ID3D12Device ::CheckFeatureSupport, notant la description et l’utilisation de la structure D3D12_FEATURE_DATA_D3D12_OPTIONS1.
Rubriques connexes
- Guide de programmation pour hlSL
- intrinsèques du nuanceur Model 6