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 familier qu’on lui connaît aujourd’hui. Alors que les fabricants de matériel indépendants (IHV) se livrent une bataille toujours plus large sur le nombre de cœurs, la capacité mémoire et la bande passante, certains goulots d’étranglement à fonction fixe sont devenus évidents 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 nuanceurs programmables. Le pipeline graphique hérité L’un des plus problématiques de ces goulots d’étranglement est l’assembleur d’entrée (IA). L’IA est un composant matériel situé au sommet du pipeline graphique, qui est responsable du traitement des index et de la lecture des 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. Au bas du pipeline de géométrie se trouve l’assembleur de primitives (PA). Ce composant matériel compose les sommets transformés en primitives, effectue les routines d’élimination et de découpage, puis transmet les instances restantes à la rastérisation. Il a un débit d’exportation fixe, et maintenir ce débit peut être difficile. Dans certains cas, cela peut être dû à l’IA : si les vagues de nuanceur 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 limite du pipeline graphique hérité est que les méthodes d’élimination de la géométrie dans le 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 de l’ALU à charger et à ombrer des attributs de sommets qui ne verront jamais le jour. Idéalement, nous aimerions pouvoir éliminer à une multitude de granularités afin d’éliminer la géométrie le plus tôt possible.

Le pipeline de nuanceurs de maillage

Le pipeline de nuanceurs de maillage cible ces limites du pipeline graphique hérité. Tout d’abord, il retire l’IA et l’unité de tessellation du pipeline. L’objectif est de maximiser le débit de lancement des vagues de nuanceur et de transférer l’IA vers du code de nuanceur pouvant é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 à divers points du pipeline. Les nuanceurs d’amplification peuvent servir à effectuer une élimination à faible granularité, par exemple sur des groupes d’objets, des instances ou des meshlets. Les nuanceurs de maillage peuvent effectuer une élimination à la granularité de chaque primitive. Cela permet de rejeter tôt et souvent les primitives facilement é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 de nuanceurs de maillage. Les étapes teintées de vert sont programmables. Les étapes teintées de bleu sont à fonction fixe. Diagramme des étapes du pipeline de nuanceurs de maillage

Nuanceurs de maillage

Les nuanceurs de maillage ont été conçus pour offrir au pipeline de géométrie un niveau de généralité qu’on ne trouvait que dans les nuanceurs de calcul. Le développeur dispose ainsi d’un contrôle total sur la charge de travail de chaque thread. Le déplacement des lectures d’index et d’attributs de sommets vers le code du nuanceur supprime la dépendance au matériel à fonction fixe, ce qui maximise les débits de lancement des vagues 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 à l’intérieur du nuanceur de maillage. Cela permet aux nuanceurs de reporter la lecture 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.

Nuanceurs d’amplification

Les nuanceurs de calcul 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 nuanceur de calcul doivent écrire leurs données en mémoire globale. Cela entraîne une latence de lecture et les soumet à la contention de bande passante mémoire à l’échelle du GPU. D’autre part, si le producteur de calcul et le consommateur graphique sont des opérations consécutives, le GPU doit attendre que toutes les instances de nuanceur de calcul soient terminées avant de lancer les appels de dessin consommateurs. Cela est causé par une barrière de ressource de vue d’accès non ordonné (UAV) qui doit garantir que toutes les écritures des nuanceurs de calcul dans l’UAV final sont terminées avant qu’un nuanceur puisse la consommer. Figure 3. Visualisation simplifiée de l’ordonnancement des vagues d’un nuanceur de calcul suivi immédiatement d’un dessin ExecuteIndirect « DispatchMesh ». Les vagues du nuanceur de calcul (en jaune) sont séparées de l’exécution des vagues du nuanceur de maillage (en vert) par un blocage du pipeline en raison d’une barrière UAV. Les ID numérotés associent le groupe de threads du nuanceur de calcul appelant à sa grappe d’enfants de nuanceur de maillage. Diagramme d'une visualisation simplifiée de l'ordonnancement des vagues, montrant une charge de travail de nuanceur de calcul suivie immédiatement d'un appel ExecuteIndirect utilisant DispatchMesh. Les vagues du nuanceur de calcul, en jaune, sont séparées de l'exécution des vagues de nuanceur de maillage correspondantes, en vert, par un blocage du pipeline causé par une barrière de ressource UAV. L’étape du nuanceur d’amplification vise à 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. L’ordonnancement des vagues du nuanceur d’amplification et du nuanceur de maillage est entremêlé, ce qui permet de saturer plus complètement le GPU de travail. Cela ouvre également un niveau de 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é. Cette capacité peut servir à implémenter des fonctionnalités comme des techniques d’élimination, la sélection dynamique du niveau de détail (LOD) par instance ou des routines de tessellation personnalisées. Figure 4. Visualisation de l’ordonnancement des vagues d’une charge de travail de nuanceur d’amplification. Le blocage est éliminé du pipeline. Les ID numérotés associent le groupe de threads du nuanceur d’amplification appelant à sa grappe d’enfants de nuanceur de maillage. Diagramme d'une visualisation simplifiée de l'ordonnancement des vagues, montrant une charge de travail de nuanceur d'amplification. Les vagues du nuanceur d'amplification, en jaune, sont entremêlées avec les vagues de nuanceur de maillage correspondantes, en vert, ce qui élimine le blocage du pipeline.

Voir aussi

Vue d’ensemble du pipeline de nuanceurs de maillage Vue d’ensemble de l’API des nuanceurs de maillage Utilisation du pipeline de nuanceurs de maillage
Dernière modification le 6 octobre 2026