Passer au contenu principal

Le pipeline hérité

Au cours des 20 dernières années, le pipeline graphique a évolué pour atteindre l’état que nous connaissons aujourd’hui. Alors que les fabricants de matériel indépendants (IHV) se livrent une bataille toujours plus intense sur le nombre de cœurs, la capacité mémoire et la bande passante, certains goulots d’étranglement à fonction fixe sont devenus manifestes dans le modèle de traitement géométrique. Figure 1. Le pipeline graphique hérité. Les étapes teintées de bleu sont à fonction fixe. Les étapes teintées de vert sont des shaders programmables. Le pipeline graphique hérité L’un des goulots d’étranglement les plus problématiques est l’assembleur d’entrée (IA). L’IA est un composant matériel situé en haut du pipeline graphique, chargé de traiter les index et de lire les données de sommets. Le nombre d’unités IA n’a pas augmenté au même rythme que les autres ressources du GPU. Le petit nombre fixe d’unités IA impose un débit de lancement restrictif qui ne parvient souvent pas à saturer de travail les cœurs du GPU. En bas du pipeline de géométrie se trouve l’assembleur de primitives (PA). Ce composant matériel assemble les sommets transformés en primitives, effectue les routines d’élimination et de découpage (clipping), puis transmet les instances restantes à la rastérisation. Il a un débit d’exportation fixe, et maintenir ce débit peut s’avérer difficile. Dans certains cas, cela peut être dû à l’IA : si les waves de shader pouvaient être lancées plus rapidement dans le pipeline, davantage de primitives pourraient être soumises en parallèle. Davantage de charges de travail parallèles en cours permettent de mieux maintenir la pression sur le PA. Une autre limitation du pipeline graphique hérité est que les méthodes d’élimination de la géométrie du pipeline traditionnel sont limitées. La géométrie éliminée réduit le débit effectif et gaspille de la bande passante mémoire et des ALU pour charger et ombrer des attributs de sommets qui ne verront jamais le jour. Idéalement, nous aimerions pouvoir effectuer l’élimination à une multitude de granularités afin d’éliminer la géométrie le plus tôt possible.

Le pipeline Mesh Shader

Le pipeline Mesh Shader cible ces limitations du pipeline graphique hérité. Tout d’abord, il supprime l’IA et le tessellateur du pipeline. L’objectif est de maximiser le débit de lancement des waves de shader et de transférer l’IA vers du code de shader capable d’évoluer avec les GPU. Cela peut aider à saturer les cœurs du GPU et à maintenir la pression sur le PA. Ce pipeline offre également la possibilité d’éliminer des charges de travail à différents points du pipeline. Les Amplification Shaders peuvent être utilisés pour effectuer une élimination à faible granularité, par exemple sur des groupes d’objets, des instances ou des meshlets. Les Mesh Shaders peuvent effectuer une élimination à la granularité de la primitive. Cela permet d’écarter tôt et souvent les primitives trivialement éliminables, ce qui économise de précieuses ressources de calcul, de la bande passante mémoire et du débit du PA. Figure 2. Les étapes du pipeline Mesh Shader. Les étapes teintées de vert sont programmables. Les étapes teintées de bleu sont à fonction fixe. Diagramme des étapes du pipeline Mesh Shader

Mesh Shaders

Les Mesh Shaders ont été conçus pour apporter au pipeline de géométrie un niveau de généralité que l’on ne trouvait jusqu’alors que dans les compute shaders. Le développeur dispose ainsi d’un contrôle total sur la charge de travail de chaque thread. Le transfert des lectures d’index et d’attributs de sommets vers le code du shader supprime la dépendance au matériel à fonction fixe, maximise le débit de lancement des waves et permet à l’IA d’évoluer avec le reste du GPU. Leur capacité à spécifier dynamiquement le nombre de sommets et de primitives exportés ouvre la voie à une prise en charge efficace et sur puce de l’élimination des primitives. Celle-ci peut être effectuée par meshlet ou par primitive, selon n’importe quel critère d’élimination arbitraire, au sein du Mesh Shader. Les shaders peuvent ainsi différer les lectures et l’ombrage des attributs de sommets jusqu’à la fin du pipeline, après que plusieurs couches d’élimination ont déjà été effectuées.

Amplification Shaders

Les compute shaders sont régulièrement utilisés pour prétraiter des ressources, suivis d’appels de dessin qui consomment leurs résultats à l’aide d’ExecuteIndirect. Il s’agit d’une technique courante pour de nombreuses formes d’élimination par vue. Elle présente toutefois quelques inconvénients subtils qui pourraient être optimisés avec une prise en charge matérielle adéquate. D’une part, les instances de compute shader doivent écrire leurs données dans la mémoire globale. Cela entraîne une latence de lecture et expose les données à la contention de bande passante mémoire à l’échelle du GPU. D’autre part, si le producteur compute et le consommateur graphique sont des opérations consécutives, le GPU doit attendre la fin de toutes les instances de compute shader avant de lancer les appels de dessin consommateurs. Cela est dû à une barrière de ressource de vue d’accès non ordonné (UAV) qui doit garantir que toutes les écritures du compute shader dans l’UAV final sont terminées avant qu’un shader puisse le consommer. Figure 3. Visualisation simplifiée de la planification des waves d’un compute shader immédiatement suivi d’un dessin ExecuteIndirect « DispatchMesh ». Les waves du compute shader (en jaune) sont séparées de l’exécution des waves Mesh Shader (en vert) par un blocage du pipeline dû à une barrière UAV. Les ID numérotés associent le groupe de threads de compute shader appelant à son ensemble de Mesh Shaders enfants. Diagramme d'une visualisation simplifiée de la planification des waves, montrant une charge de travail de compute shader immédiatement suivie d'un appel ExecuteIndirect utilisant DispatchMesh. Les waves du compute shader, en jaune, sont séparées de l'exécution des waves Mesh Shader correspondantes, en vert, par un blocage du pipeline dû à une barrière de ressource UAV. L’étape Amplification Shader est destinée à résoudre ces problèmes. Le producteur et le consommateur sont pipelinés : mémoire inter-étapes sur puce, sans vidage intermédiaire du pipeline. La planification des waves Amplification Shader et Mesh Shader est entrelacée, ce qui permet de saturer plus complètement le GPU de travail. Elle ouvre également une capacité généralisée de réduction ou d’amplification de la charge de travail qui n’existe tout simplement pas dans le pipeline graphique hérité. Cela peut servir à implémenter des fonctionnalités telles que des techniques d’élimination, la sélection dynamique du niveau de détail (LOD) des instances ou des routines de tessellation personnalisées. Figure 4. Visualisation de la planification des waves d’une charge de travail Amplification Shader. Le blocage est éliminé du pipeline. Les ID numérotés associent le groupe de threads Amplification Shader appelant à son ensemble de Mesh Shaders enfants. Diagramme d'une visualisation simplifiée de la planification des waves, montrant une charge de travail Amplification Shader. Les waves Amplification Shader, en jaune, sont entrelacées avec les waves Mesh Shader correspondantes, en vert, ce qui élimine le blocage du pipeline.

Voir aussi

Vue d’ensemble du pipeline Mesh Shader Vue d’ensemble de l’API Mesh Shader Utilisation du pipeline Mesh Shader
Dernière modification le 6 octobre 2026