Loading

Alison's New App is now available on iOS and Android! Download Now

Study Reminders
Support
Text Version

Set your study reminders

We will email you at these times to remind you to study.
  • Monday

    -

    7am

    +

    Tuesday

    -

    7am

    +

    Wednesday

    -

    7am

    +

    Thursday

    -

    7am

    +

    Friday

    -

    7am

    +

    Saturday

    -

    7am

    +

    Sunday

    -

    7am

    +

Lors de la conférence précédente, nous avons appris le matériel graphique de base. De plus, nous avons appris les éléments graphiques d'entrée et de sortie ainsi que l'architecture générale d'un système graphique. Maintenant, nous allons poursuivre notre discussion sur ce matériel graphique et aujourd'hui nous allons couvrir les bases de la programmation GPU et GPU, qui font partie du matériel graphique.
Alors, commençons par GPU. Ce qu'il est et comment il est utilisé pour mettre en œuvre le pipeline.
Une chose que nous devons noter dans les graphiques, c'est que les opérations graphiques sont de nature très parallèle. Il s'agit là d'une caractéristique essentielle des opérations graphiques. Par conséquent, il est nécessaire de poursuivre le traitement parallèle de ces opérations.
Par exemple, considérons la phase de transformation de modélisation. N'oubliez pas qu'à ce stade, ce que nous faisons? Nous convertisons ou transformons des objets définis dans leur propre système de coordonnées local ou local vers une scène de coordonnées mondiales. Maintenant, comment nous faisons cela, nous appliquons des transformations, par exemple des rotations aux sommets qui définissent les objets.
Et quelle est la transformation? Si vous vous rappelez de nos discussions précédentes, nous définissons la transformation comme une multiplication de deux choses. L'une est une matrice de transformation et l'autre un vecteur de sommet. La chose à noter ici est que la même multiplication de matrice vectorielle est faite pour tous les sommets que nous voulons transformer. Cela signifie que nous sommes essentiellement en train de réaliser la même multiplication d'opération pour tous les sommets.
Maintenant, on nous donne un ensemble de sommets qui définissent les objets. Nous pouvons aller pour une multiplication en série où nous réalisons une multiplication vectorielle matricielle à la fois. Cependant, cette façon de faire ne sera pas très efficace. Parce que, pour l'essentiel, nous réalisons la même opération, alors au lieu d'aller pour une multiplication en série, si nous pouvons effectuer la même opération sur tous les vecteurs en même temps, c'est en parallèle, alors nous allons avoir un gain significatif de performance. Et c'est très important en ce qui concerne le rendu en temps réel des scènes parce qu'il faut généralement traiter des millions de sommets à la fois ou des millions de sommets par seconde. Par conséquent, si nous pouvons traiter en parallèle tous ces millions de sommets, nous aurons d'énormes gains de performance.
Si nous exécutons ces opérations à l'aide de notre CPU, nous ne pouvons pas tirer profit de la nature parallèle inhérente des opérations graphiques. Parce que les unités centrales ne sont pas conçues pour cela. Afin de résoudre ce problème où nous voulons profiter de ce parallélisme inhérent, il existe un matériel spécial qui est livré avec nos systèmes. Presque tous les systèmes graphiques sont composés d'une carte graphique distincte, contenant ses propres unités de traitement et éléments de mémoire. Maintenant, ce système matériel spécialisé distinct est appelé unité de traitement graphique ou GPU. Par conséquent, il s'agit essentiellement d'un matériel spécialisé qui est utilisé pour effectuer des opérations graphiques en exploitant le parallélisme inhérent qui existe dans les opérations graphiques.
Allons dans le fonctionnement du GPU. Maintenant, nous devons noter que GPU est un système multicore qui signifie qu'il contient un grand nombre de coeurs ou d'éléments de traitement d'unités. A présent, chacun de ces coeurs ou ces éléments de traitement d'unité est appelé processeur de flux. Parce qu'il fonctionne sur les flux de données, flux de données d'entrée.
Ces coeurs ne sont rien d'autre qu'un simple matériel capable d'effectuer des opérations arithmétiques simples et à virgule flottante simples. Ainsi, chaque noyau peut effectuer des opérations arithmétiques uniquement, soit des nombres arithmétiques entiers, soit des nombres en virgule flottante. Et plusieurs noyaux sont regroupés pour former une autre unité appelée "streaming multiprocesseurs" ou "SM". Ainsi, chaque coeur est appelé processeur de flux et de nombreux noyaux de ce type sont regroupés pour former des multiprocesseurs de flux.
Maintenant, cela nous amène à l'idée de SIMD, notez le terme. Pour comprendre, considérons un exemple, la transformation géométrique des sommets dont nous avons discuté précédemment. Donc, notre instruction est la même que la multiplication. Les données sur lesquelles cette instruction fonctionne varient, car les vecteurs de vertex varient. Bien que la matrice de transformation reste la même. Donc, ici ce que nous faisons, nous avons une instruction unique qui fonctionne sur de multiples données. C'est l'idée de SIMD ou de plusieurs données multiples, et les multiprocesseurs de streaming GPU sont essentiellement des exemples de SIMD. Donc, comment ça marche, ici comme vous pouvez le voir, nous avons la même instruction donnée à tous les noyaux et les noyaux prennent des données qui peuvent être différentes mais l'instruction sera la même et la même instruction fonctionnera sur différents flux de données. Une autre illustration de cette idée est donnée ici, ici si nous ne considérons pas le SIMD alors ce qui se passe. Nous avons donc deux opérations d'addition sur deux flux de données. A0 B0 et A1 B1, donc il y aura deux instructions distinctes pour effectuer ces deux additions distinctes donnant la sortie de C0 et C1, c'est une opération normale. Dans le cas de SIMD, ce qui se passe est que nous avons ce type de flux de données et que l'instruction est unique. Notez que nous avons deux instructions qui fonctionnent sur deux flux de données distincts. Ici, nous avons une instruction unique qui fonctionne sur les deux flux de données pour nous donner la sortie désirée. C'est l'idée du SIMD. Ainsi, vous savez maintenant que les GPU contiennent des PME ou des multiprocesseurs qui fonctionnent selon l'idée de SIMD.
Alors, voyons comment les GPUs sont organisées. Comme je l'ai dit, chaque multiprocesseur est conçu pour effectuer des opérations SIMD. Nous avons donc beaucoup de multiprocesseurs de ce type, comme indiqué ici. Ensuite, nous avons une mémoire spécialisée, dont le but vous sera expliqué sous peu, et d'autres composants pour gérer ce traitement parallèle. Chaque multiprocesseur de flux contient plusieurs processeurs ou cours de diffusion en flux, comme indiqué ici. Et chaque noyau est capable d'effectuer des opérations arithmétiques simples ou à virgule flottante simples. (Reportez-vous à la section Heure de la diapositive: 11h33). C'est donc ce qui se passe dans GPU, le streaming multiprocesseurs et les unités de mémoire dédiées, ainsi que des composants supplémentaires pour gérer ce traitement parallèle. Maintenant, essayons de comprendre comment fonctionnent les opérations graphiques dans les GPU. La première chose à noter est que la plupart des systèmes graphiques en temps réel supposent que la scène est faite de triangles. Nous convertisons donc n'importe quelle surface en triangles ou en maillages triangulaires. Nous en avons déjà parlé plus tôt quand nous parlions de la représentation des objets.
Maintenant, étant donné que les informations de maillage triangulaire sont ce qui se passe, ces API dédiées qui sont fournies dans la bibliothèque graphique comme OpenGL ou Direct3D, ces triangles sont envoyées à GPU, un vertex à la fois en série et GPU les assemble en triangles.
De plus, nous devons noter ici que les sommets sont représentés par un système de coordonnées homogène. Les sommets sont donc représentés dans le système de coordonnées homogènes.
Et donc nous traitons ici avec la toute première étape qui est la définition d'objet, de sorte que ces objets sont définis dans leur système de coordonnées local ou de modélisation. Ensuite, le GPU exécute toutes les étapes, donc d'abord il effectue une transformation de modélisation sur des sommets qui est la première étape du traitement.
Et comme nous l'avons expliqué plus tôt, cette transformation est réalisée avec une seule matrice de transformation et une opération de multiplication par point vectoriel.
Comme nous l'avons noté précédemment, le GPU multicore effectue de telles opérations simultanément ou en parallèle, de sorte que les sommets multiples sont transformés simultanément en même temps. Ce n'est pas l'un après l'autre que nous exécutons les multiplications. Donc, ce que nous obtenons après la multiplication qui est un flux de triangles, mais cette fois, ils sont définis dans le système de coordonnées du monde, ce qui est l'objectif de la modélisation de l'étape de transformation. Il est également supposé que le visualiseur est situé à l'origine du système de coordonnées du monde et que la direction de la vue est alignée avec l'axe z. C'est l'hypothèse selon laquelle le matériel est conçu.
Ainsi, après la transformation de la modélisation, GPU calcule la couleur vertex ou l'étape d'éclairage. Maintenant, ceci est fait en fonction de la lumière qui est définie pour la scène, donc une source de lumière est supposée et basée sur cette source de lumière ce colorant est fait. Maintenant, pourquoi GPU est approprié pour le calcul des couleurs, parce que si vous pouvez rappeler notre discussion sur l'éclairage, nous avons remarqué que la coloration peut être calculée par des produits à points vectoriels et une série d'opérations d'addition et de multiplication. Et ces opérations sont exécutées simultanément pour plusieurs sommets par le GPU parce qu'il est conçu de cette façon, donc là encore, nous exploitons la nature inhérente des opérations graphiques qui est le parallélisme.
Après coloration, chaque sommet 3D de couleur est projeté sur le plan bleu. Et que de nouveau se fait à l'aide de la multiplication vectorielle matricielle, nous l'avons déjà noté précédemment au cours de notre discussion sur la transformation de projection et la sortie que nous obtenons est un flux de triangles dans l'écran ou les coordonnées de l'appareil prêts à être convertis en pixels. Maintenant, notez ici que cette projection implique aussi une transformation de vue également. Ce que nous n'avons pas explicitement mentionné ici aussi bien que la fenêtre pour voir mettre la transformation. Toutes ces transformations que nous pouvons regrouper en multipliant les matrices de transformation correspondantes pour obtenir une matrice de transformation unique.
Donc, après cette étape, nous obtenons les triangles de l'espace de l'appareil et nous allons maintenant pour la rasterisation ou la conversion de scan. On peut donc noter ici que chaque triangle de l'espace de l'appareil chevauche quelques pixels à l'écran, ce qui signifie que ces pixels font partie des triangles. Au stade de la rasterisation, ces pixels sont déterminés.
Maintenant, les concepteurs de GPU qui ont développé des GPUs au fil des ans incorporaient beaucoup de tels algorithmes de rasterisation, nous en avons déjà discuté peu dans nos discussions sur la rasterisation. Maintenant, ces algorithmes exploitent une observation cruciale qui est que chaque pixel peut être traité indépendamment de tous les autres pixels. Il n'est donc pas nécessaire de traiter les pixels comme dépendants les uns des autres, ils peuvent être traités indépendamment.
En conséquence, les pixels peuvent être rasterisés en parallèle, de sorte que vous pouvez utiliser ce parallélisme inhérent pour rasteriser tous les pixels simultanément. Et c'est un grand avantage d'avoir GPU, nous n'avons pas à traiter un pixel à la fois, nous pouvons traiter tous les pixels ensemble pour obtenir un résultat rapide, une sortie rapide.
Maintenant, si vous pouvez rappeler le pipeline graphique 3D, au cours de la phase de traitement des pixels, il y a deux autres étapes qui sont là, deux autres activités qui sont là, l'une est la texture de surface ou l'attribution de motifs aux couleurs de surface et la seconde est l'enlèvement de la surface cachée ou HSR.
Maintenant, l'idée de texturation de surface est très simple ici l'image de texture est là qui est effectivement imposée à la surface pour nous donner l'illusion de détails. Notez que ce n'est qu'une création d'illusion plutôt que de calculer un motif de texture, simplement en remplaçant les couleurs de pixel par la couleur de la texture. C'est l'idée la plus simple dont nous avons parlé tout à l'heure. (Reportez-vous à la section Heure de la diapositive: 20:40). Pour cela, nous devons stocker les images de texture ou les cartes de texture. Et comme nous avons besoin d'y accéder, ces images de texture souvent, idéalement elles doivent être stockées en mémoire haute vitesse, de sorte que le temps d'accès est moins. Maintenant, c'est parce que, comme nous l'avons dit, les calculs de pixels sont très fréquents et que chaque pixel de calcul doit avoir accès à ces images de texture. Deuxièmement, l'accès est généralement de nature très régulière. Cela signifie que les pixels voisins ont tendance à accéder à des images de texture ou à des images de texture à proximité. Ainsi, pour réduire le temps d'accès, le cache de mémoire spécialisée est utilisé pour stocker les images de texture comme indiqué ici dans cette figure. Il s'agit d'emplacements de mémoire spécialisés dans GPU pour stocker des images de texture.
De plus, nous avons discuté plus tôt lors de notre discussion sur l'enlèvement de surfaces cachées, l'idée de l'algorithme de tampon Z ou l'algorithme de tampon de profondeur. Maintenant, cela est implémenté dans les GPUs et pour ce qui est aussi typiquement les GPU sont équipés d'éléments de mémoire spécialisée ou de zones tampons de profondeur. Et il stocke la distance des téléspectateurs de chaque pixel. Donc, ça fait généralement partie du GPU.
Maintenant si vous pouvez rappeler comment fonctionne la mémoire tampon Z, alors GPU compare aussi la distance de pixels avec la distance de pixel déjà présente, c'est-à-dire qu'elle exécute simplement l'algorithme et que la mémoire d'affichage n'est mise à jour que si le nouveau pixel est plus proche. Donc, il implémente l'algorithme de buffer Z, pour plus de détails vous pouvez faire référence à la conférence 23. Donc, vous avez le streaming multiprocesseurs, chaque cours qui contient, puis ces différents éléments de données pour effectuer ces opérations simultanées plus un stockage de texture spécialisé qui forment GPU.
Maintenant, il y a un autre concept qui est l'idée des shaders et de la programmation de shader. Essayons de comprendre ce concept de programmation en bref à un niveau très préliminaire. Dans notre discussion précédente sur GPU, nous avons discuté de la façon dont les GPUs mettent en œuvre les étapes du pipeline. Maintenant, dans cette discussion, si vous avez remarqué qu'il y a deux grands groupes d'activités, l'un est le traitement de sommets ou de processus de vertex aussi appelé traitement de la géométrie. L'autre est le traitement des pixels. Donc, ces deux grands groupes d'activités ont été discutés pour expliquer le travail du GPU.
Maintenant, au cours des premières années de GPUs qu'ils ont utilisé avec un pipeline matériel à fonction fixe, cela signifie que toutes les étapes du pipeline ou toutes les étapes qui implément le pipeline sont préprogrammées et intégrées dans le matériel. GPU contenu des composants dédiés à des tâches spécifiques et l'utilisateur n'a aucun contrôle sur la façon dont cette tâche doit être effectuée et sur l'unité de traitement qui effectue l'étape du pipeline. Donc, plus tôt le GPU est utilisé pour venir avec ce matériel à fonction fixe, ce qui signifie que tout a été prédéterminé, ce composant du GPU traitera avec quelle partie du pipeline et l'utilisateur n'a aucun contrôle sur lui. Donc, le flux était généralement comme ceci à partir du programme utilisateur les primitives ont été envoyées, puis les composants étaient là pour le traitement de la géométrie, la sortie est des coordonnées d'écran 2D à partir de là le traitement des pixels commence et les composants ont de nouveau été corrigés.
Mais alors les gens se rendent compte que c'est en fait une réduction de la flexibilité et parce que cette puissance de GPU n'a pas été pleinement utilisée. Pour mieux tirer parti de la puissance GPU, les GPU modernes sont conçus pour être programmables, ce qui signifie que nous pouvons les programmer. Les unités à fonction fixe sont remplacées par une grille unifiée de processeurs appelés shaders. Donc, plus tôt il y avait des unités à fonction fixe, il y a maintenant une grille unifiée de processeurs appelés shaders.
De plus, toute unité de traitement peut être utilisée pour effectuer un calcul de l'étape du pipeline. Les éléments GPU, c'est-à-dire les unités de traitement et la mémoire, peuvent être réutilisés via des programmes utilisateur.
Donc, plus tôt nous avions des unités fixes pour réaliser différentes étapes, maintenant nous avons des installations communes qui sont réutilisées pour réaliser différentes étapes et qui est déterminée par la programmation. Quelle partie et comment les éléments GPU, à savoir les unités de traitement et la mémoire, sont utilisés pour effectuer des opérations liées à une étape particulière. L'idée est présentée ici comme vous pouvez le voir une fois que les primitives sont envoyées au GPU, GPU en tant qu'élément commun, maintenant un sous-ensemble de ces éléments communs sont utilisés à des fins différentes comme vous pouvez voir ici aussi la mémoire est également partagée et réutilisée.
Maintenant, l'idée est que nous écrivons des programmes pour utiliser des éléments GPU, ces programmes sont appelés programmes shader et l'approche correspondante s'appelle la programmation de shader. Passons brièvement aux bases de la programmation des shader.
Maintenant, avec le programme GPU programable que nous venons de mettre en place, il est possible pour le programmeur de modifier la façon dont le matériel GPU traite les sommets et les pixels, ce qui signifie qu'il faut attribuer la couleur aux pixels. Cela est possible en écrivant des shaders de vertex et des fragments de fragments, qui sont aussi appelés programmes de vertex et programmes de fragments. Il s'agit de termes que vous avez probablement utilisés avec ces termes pour indiquer au GPU comment utiliser son matériel à des fins spécifiques. Et cette approche, comme je l'ai dit, est connue sous le nom de programmation de shader et elle a d'autres noms aussi tels que la programmation GPU, la programmation de matériel graphique et ainsi de suite.
En cas de shader de vertex, ce qui se passe est que ces programmes sont utilisés pour traiter les sommets ou la géométrie. Ces programmes sont essentiellement utilisés pour réaliser des transformations de modélisation, l'éclairage et la projection à des coordonnées d'écran qui impliquent toutes les transformations intermédiaires de la transformation de la vue. Et conceptuellement la fenêtre pour voir mettre la transformation aussi.
Dans le cas d'un fragment de fragment, il fait un travail différent, il s'agit de programmes qui exécutent les calculs nécessaires pour le traitement des pixels. Maintenant, quels sont les calculs, ceux qui sont liés à la façon dont chaque pixel est rendu, comment la texture est appliquée ou le mappage de texture et s'il faut dessiner un pixel ou non, c'est l'enlèvement de la surface cachée. Donc, ces 3 sont la tâche faite par les fragments de fragments. Notez que tous ces 3 sont liés au traitement des pixels. Ainsi, les shaders de vertex sont en cours de traitement de sommets principalement liés aux transformations de la coordonnée de modélisation à la coordonnée du dispositif, et toutes les transformations entre. Alors que les shaders de fragment traitent du traitement des pixels qui est le rendu des pixels qui appliquent les textures ainsi que la réalisation d'un retrait de surface caché au niveau des pixels.
Maintenant, pourquoi il est appelé fragment shader les unités de traitement des pixels, cela implique que GPU à tout instant peut traiter un sous-ensemble ou fragment de tous les pixels de l'écran qui sont présents. Ainsi, à un moment où un sous-ensemble des pixels de l'écran est traité, il est appelé shader de fragment.
Maintenant, ce programme shader est de petits morceaux de codes et ils sont envoyés au matériel graphique à partir de programmes utilisateur, essentiellement en appelant quelques API et exécutés sur du matériel graphique. Donc, nous devons garder cela à l'esprit qu'il s'agit de petits morceaux de codes qui sont exécutés sur du matériel graphique et qui sont intégrés dans les programmes utilisateur, envoyés au matériel par les programmes utilisateur.
En fait, cette capacité à programmer des GPU a donné naissance à une idée nouvelle qui est l'idée de GPU ou GPGPU. Encore une fois, ce sont des termes courants de nos jours et vous êtes probablement arrivé à ce terme, cela signifie que nous pouvons utiliser GPU pour n'importe quel but pas nécessairement seulement pour effectuer des opérations liées aux graphiques. Donc, avec l'idée de GPGPU, nous pouvons effectuer des tâches qui ne sont pas liées au graphisme du tout, cependant ce sont des sujets très impliqués et nous ne irons plus loin pour expliquer ces concepts.
Donc, en résumé, ce que nous avons appris aujourd'hui, essayons de récapitulation rapidement.
Nous avons appris comment fonctionne le matériel. Cela signifie que l'unité de traitement graphique est de toute façon une partie des systèmes informatiques qui traitent des opérations graphiques. Nous avons aussi appris comment les étapes du pipeline sont mises en œuvre dans le GPU et ont été introduites dans l'idée des shaders et des programmes de shader.
Maintenant, il s'agit du matériel. Ainsi, lors de la conférence précédente et de la conférence d'aujourd'hui, nous avons appris le matériel graphique. Nous avons commencé par la discussion sur l'architecture générale d'un système graphique une architecture très générique, puis expliquer différents termes, puis dans certains détails nous avons appris comment fonctionne le GPU. L'un des éléments reste la façon dont nous pouvons écrire un programme pour effectuer des opérations graphiques. Que nous approuions cet aspect du cours qui consiste à écrire des programmes pour effectuer des opérations graphiques ou créer une scène à l'écran que nous allons apprendre lors de la prochaine conférence, où nous allons apprendre à écrire des programmes à l'aide d'OpenGL qui est une bibliothèque graphique.
Peu importe ce que nous avons discuté aujourd'hui, vous pouvez trouver dans ce livre, en particulier le chapitre 10, section 10, point 3. C'est tout pour aujourd'hui, vous voyez au cours de la prochaine conférence. Merci et au revoir.