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

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.