Graphics Processing Units
Transcription
Graphics Processing Units
Graphics Processing Units Corky Maigre et Alexandre Lemaire Année Académique 2012-2013 Table des matières 1 Introduction au GPU 2 CPU 11 3 Programmation en parallèle sur GPU 14 1.1 1.2 1.3 1.4 Historique du GPU . . . Domaines d'utilisations . Architecture du GPU . . Fonctionnement du GPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 6 8 9 2.1 Dénition du CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.2 Comparaison GPU-CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.2 Principes et notions de l'informatique en parallèle . . . . . . . . . . . . . . . . . 16 3.3 Langages de programmation sur GPU . . . . . . . . . . . . . . . . . . . . . . . . 17 1 Avant-propos Nous sommes en première année Bachelier en Sciences de l'Ingénieur à l'Isims. Voici notre rapport sur une recherche bibliographique dans le cadre du cours de "Méthodologie Scientique". Le sujet de notre travail traîte des "GPU". Ainsi nous parlerons de l'histoire des cartes graphiques, de leurs domaines d'utilisations, de l'architecture et du fonctionnement d'un GPU. Nous introduirons les notions de processeur et de processeur graphique et nous les comparerons. Enn, nous développerons les bases des principes de programmation en parallèle sur GPU. Ce document a été rédigé en LATEX. Figure 1 Illustration d'un processeur graphique NVIDIA NV40 et d'une carte graphique GeForce GTX 480 [1] 2 Chapitre 1 Introduction au GPU Un GPU, "Graphics Processing Unit" signiant "Unité de Traitements Graphiques", est un processeur graphique, c'est-à-dire que c'est l'élément principal d'une carte graphique. Ce sont donc des unités de traitements graphiques appelés processeurs graphiques placés sur des cartes graphiques et utilisés pour accélérer les applications 3D telles que les jeux vidéo. 1.1 Historique du GPU Avant l'arrivée des processeurs graphiques, l'achage de données sur un écran était entièrement géré par le processeur de l'ordinateur. Avec la demande croissante de la technologie informatique, aussi bien dans les centres de recherche que pour les particuliers, le travail seul du processeur ne pouvait sure à gérer les calculs et l'achage. En eet, il était impératif d'améliorer l'achage pour pouvoir avancer dans les recherches et pour que l'informatique garde sa place de leader. De l'autre côté, suite à l'arrivée des ordinateurs sur le marché public, la nécessité d'avoir un meilleur rendu graphique fût primordial pour des raisons purement marketing notamment avec les premiers jeux vidéo. Ces derniers temps, la qualité des jeux sur ordinateur s'est nettement améliorée par l'ajout de cartes graphiques spéciques. Les constructeurs ont été dans l'obligation de créer des cartes dédiées à l'accélération 3D an de soulager le processeur. Ces cartes ont eu pour mission d'alléger le processeur en calculant à sa place le grand nombre de polygones demandés. Toutes ces raisons furent bénéques au développement rapides des GPU et, encore de nos jours, la technologie n'arrête pas de s'améliorer. Les premières cartes graphiques apparaissent en 1981 pour le grand public avec les cartes CGA ou Color Graphic Adapter qui permettaient d'acher dans une résolution de 320 colonnes sur 200 lignes en 4 couleurs diérentes. Suivent alors une succession de cartes dédiées au graphisme sur ordinateur poussant de plus en plus loin le nombre de lignes et de colonnes adressables ainsi que le nombre de couleurs simultanées pouvant être achées ; ce sont les modes graphiques utilisables. De plus en plus de fonctions assurées par le processeur sont petit à petit gérées par le contrôleur graphique des cartes. Comme, par exemple, le tracé de lignes, de surfaces pleines, de cercles, etc. ; fonctions très utiles pour accompagner la naissance des systèmes d'exploitation basés sur des interfaces graphiques et en accélérer l'achage. 3 Une des premières compagnies à s'être lancée dans le marché des GPU fut ATI Technologies Inc. Cettz société s'est concentrée sur l'élaboration de standards graphiques puis sur le développement et l'amélioration de ses cartes. En 1991, ATI présenta sa nouvelle carte : La Mach8. Cette carte était dotée de performances extraordinaires pour l'époque (1024x768x256) et était capable de travailler indépendamment du micro-processeur, ce qui fut une réelle évolution. Par la suite, la rme continua à améliorer sa carte. Ce ne fut qu'en 1995 que NVIDIA entra dans le marché des GPU avec sa puce NV1. La puce proposait une carte 2D, un accélérateur 3D, une carte son et un emplacement pour des manettes Saturn dans la même carte PCI. Cette carte fut l'une des premières à être destinée aux jeux et dessins industriels ; malheureusement, ce fut un échec. À cause d'une gestion différente de la 3D, elle utilisait le quadratic texture mapping au lieu de la technique actuelle, à base de polygones. Avec l'évolution des techniques, le port ISA habituellement utilisé sera remplacé par le port PCI pour augmenter la vitesse de transfert entre le processeur et la carte graphique. En plus des cartes graphiques d'achage en 2D, apparaissent dans les années 1990 des cartes dédiées à la gestion et l'achage d'éléments représentés en 3 dimensions, comme les cartes 3DFX. Puis apparurent les cartes graphiques 2D/3D ayant l'avantage de n'occuper qu'un seul connecteur AGP ou PCI au lieu de deux (pour les congurations courantes de l'époque, en l'occurrence avant 1998). En eet, jusqu'alors, les cartes 2D étaient proposées séparément des cartes dites accélératrice 3D, chacune ayant un processeur graphique spécique. Depuis la sortie des premières cartes 2D/3D intégrées par ATI en 1996, toutes les cartes graphiques modernes gèrent la 2D et la 3D au sein d'un seul circuit intégré. En 1996, ATI lança la première carte 3D du marché : La 3D Rage, cette carte n'était cependant pas encore accélératrice 3D (ce fut le constructeur 3DFX qui créa la première d'entre elles, la Voodoo (voir Figure 1.1), qui fut une véritable révolution dans le monde du jeu en 3D), ce ne fut qu'en 1997 que NVIDIA passa à la 3D à base de polygones avec le NV3, plus connu sous le nom de Riva 128. 4 Figure 1.1 Carte Voodoo Banshee (1998) [2] Depuis la n des années 1995, les cartes graphiques ont fortement évolué. Le matériel est devenu de plus en plus puissant avec des coûts de production et d'achat de plus en plus bas. Autrefois, la fonction essentielle d'une carte graphique était de transmettre les images produites par l'ordinateur à l'écran. C'est encore sa fonction principale sur beaucoup de machines à vocation bureautique. Aujourd'hui, le marché des GPU pour particulier sert surtout pour les jeux vidéo et les logiciels de graphisme. Les GPU étant des calculateurs externes dédiés à un type de calcul, elles ont depuis plus de dix ans dépassé les capacités des CPU (voir Section 2.1). Si bien que les scientiques sont de plus en plus nombreux à vouloir en exploiter le potentiel dans d'autres domaines. Il peut s'agir de faire tourner des simulations de modèles météo, nanciers ou toute opération parallélisable et nécessitant une très grande quantité de calcul. NVIDIA et ATI/AMD, les deux principaux fabricants de cartes graphiques à haute performance et pour le grand public proposent chacun des solutions propriétaires an de pouvoir utiliser leur produit pour du calcul scientique. Pour NVIDIA, on pourra se référer au projet CUDA, tandis que pour AMD, ce sera le projet ATI Stream (voir Section 3.3) [3]. 5 1.2 Domaines d'utilisations Les processeurs graphiques GPU peuvent être utilisés pour de nombreuses applications aussi bien dans le domaine professionnel que pour les particuliers ou le grand public. Dans le domaine public, elles sont surtout utilisées pour les jeux vidéo ou les logiciels de traitement graphique (montages vidéo, 3D, ...). Dans le domaine professionnel, elles sont utilisées pour du dessin, des traitements graphiques, des graphismes, des modélisations en tout genre (lms, animations, architecture,...). À la base, elles s'occupaient donc des aspects graphiques. De nos jours, elles servent de plus en plus au calcul parallèle et au calcul intensif (haute performance). Les cartes graphiques professionnelles sont basées sur des GPU identiques aux cartes graphiques grand public, mais qui se diérencient avec la taille. Les performances sont optimisées pour les applications 3D professionnelles, souvent en Open GL, grâce à des pilotes spéciques. Par exemple, une Quadro 5000, basée sur le même GPU que la GTX 465, peut acher 50% de triangles de plus qu'une GTX 480... Les cartes professionnels sont surtout utilisées dans de grands Data center pour notamment permettre l'utilisation à distance d'applications lourdes ou permettre la demande en ressources de grandes entreprises. Les cartes professionnelles se distinguent aussi par un niveau de qualité et une validation plus poussés. Elles disposent également d'un design propre optimisé pour les contraintes d'une station de travail ainsi que d'une connectique adaptée. Par exemple, à l'inverse des produits grand public, le DisplayPort est présent sur toutes les cartes actuelles alors que le HDMI est aux abonnés absents. Les fréquences et le nombre d'unités actives sont par contre en général revus à la baisse. Les cartes professionnelles disposent donc de moins de puissances brutes que les cartes grand public. Dans le monde plus sérieux du travail, il n'est bien entendu pas question de pousser les fréquences, et donc la consommation, pour gagner 3% de performances face à la concurrence. Il n'est pas question non plus de designs prévus pour laisser beaucoup de marge à l'overclocking, ni d'économies de bout de chandelle sur le choix des composants de l'étage d'alimentation. Eviter de dépasser 150 watts et donc d'avoir recours à plus d'un connecteur d'alimentation 6 broches est important pour que les produits puissent être intégrés et certiés pour un maximum de stations de travail. Il en va de même pour le format single slot qui est la règle en dehors du très haut de gamme, contrairement aux cartes grand public qui ont tendance à abuser du dual slot, même dans l'entrée de gamme. Enn, certaines fonctionnalités des GPUs sont réservées aux cartes professionnelles. C'est par exemple le cas de la synchronisation stéréo ou framelock/genlock qui est disponible sur les Quadros et FirePros haut de gamme. Avec ses nouveaux GPUs, Nvidia a désactivé plus de fonctionnalités matérielles dans les GeForce, ce qui ajoute donc des points de diérentiations aux nouvelles Quadro. (voir Figure 1.2) Support de l'ECC. Calcul en double précision performant, à demi vitesse (ralenti à 1/8esur les GeForce). Débit de triangles rastérisés à pleine vitesse (bridé sur GeForce). 6 Figure 1.2 Débit de triangle entre Quadro et GeForce 7 1.3 Architecture du GPU Un GPU est une multiplication importante de n petites machines SIMD indépendantes et partageant une mémoire globale. Ces machines SIMD représentent chacune un multiprocesseur composé d'ALU (ou thread hardware) synchronisés, d'un décodeur d'instructions, et de trois mémoires partagées entre toutes les ALUs dont deux mémoires caches. Son architecture est très complexe et spécialement conçue pour traiter des pixels en parallèles, il est constitué de nombreux composants dont le vertex pipeline qui s'occupe des vertices et le pixel pipeline qui s'occupe des pixels. Il est aussi constitué de beaucoup de c÷urs, donc de beaucoup de multiprocesseurs, ce qui permet d'eectuer plusieurs traitements à la fois grâce au parallélisme que nous aborderons au Chapitre 3. (Il y a par exemple 128 processeurs dans la GeForce 8800). Les processeurs graphiques permettent donc une multiplication des unités de traitement et une complexication des unités de contrôle ainsi qu'une augmentation régulière de la mémoire cache. Figure 1.3 Architecture d'un GPU [4] 8 1.4 Fonctionnement du GPU Le GPU fonctionne sur un mode d'exécution vectoriel contrairement à une exécution pipelinée. L'exécution pipelinée signie par son nom que le travail est eectué le long d'un "tuyau". Elle suit donc un processus qui passe par les étapes suivantes : fetch, decode, load, execute, et write. Dans ce mode, les résultats dépendent des précédents, et pour qu'une instruction soit donc eectuée, elle doit attendre qu'une autre soit nie. Les instructions en attente sont mises dans un "buer" ou "tampon", on utilise, dans ce cas, une mémoire cache ce qui est par conséquent impossible pour les jeux vidéo car ce serait évidemment trop lent. Pour ce faire, la solution est la vectorisation du travail. C'est un mode qui suit les mêmes étapes que le mode pipelinée, sauf qu'au moment du load, le travail est divisé. Plusieurs instructions se font en même temps, les résultats ne dépendent donc plus des précédents. Et pour ceux qui, éventuellement, dépendraient d'un résultat antérieur, il existe un compilateur qui gère ces dépendances. Elles accèdent à la mémoire avec des motifs connus. La mémoire est alors fortement entrelacée. Comparé au pipeline, il y a une amortie des latences d'accès à la mémoire, et on a théoriquement pas besoin de cache. En conclusion, la vectorisation du travail accélère l'exécution. [5] Figure 1.4 Schéma fonctionnel d'un Pipeline graphique [6] Il y deux traitements, celui de la géométrie et celui du rendu. Le traitement de la géométrie consiste à gérer les données reçues (vertices et primitives) qui sont alors traitées et analysées, voire modiées par les composants via la tessellation, le vertex pipeline, le clipping, le culling, et enn le tramage. Le traitement du rendu se fait via le pixel pipeline, le test de profondeur, le test alpha, le test brouillon, le brouillard et l'alpha blending. (voir Figure 1.5) [7] Le calcul par le GPU (GPGPU) consiste à utiliser le processeur graphique (GPU) en parallèle du CPU pour accélérer des tâches de calcul polyvalentes de sciences et d'ingénierie. 9 Figure 1.5 Schéma de fonctionnement d'un GPU [7] 10 Chapitre 2 CPU 2.1 Dénition du CPU Le CPU (Central Processing Unit) signiant unité centrale de traitement est le processeur principal d'un ordinateur et est plaçé sur la carte mère de ce dernier. Il est capable de lire, comprendre, et exécuter les instructions d'un algorithme, il eectue donc des traitements appelés processus. Les processeurs existent dans tous les ordinateurs depuis le tout début de l'informatique. [8] Il est soumis à divers paramètres tels que la cadence, la fréquence, la mémoire cache, eux mêmes assujettis à la nesse de gravure et au nombre de transistors gravés lors de l'usinage de cette puce composée de silicium. Chargé de l'exécution des instructions des programmes, le CPU est l'élément prédominant d'une conguration informatique. Sa puissance se mesure en Flops, soit le nombre de calculs à virgule ottante eectués en une seconde. [9] 2.2 Comparaison GPU-CPU Nous comparons ici la diérence entre le GPU et le CPU, nous voyons sur la Figure 3.1 que le GPU est constitué de nombreux multicoeurs comparé au CPU. Comme dit précédemment, le GPU est le processeur de la carte graphique tandis que le CPU est le processeur de l'ordinateur. La diérence est que les GPU sont nettement plus performants que les CPU pour l'achage et le rendu 3D. Cela s'explique facilement étant donné que le processeur d'un ordinateur est prévu pour effectuer toutes sortes de tâches diérentes, alors que le processeur d'une carte graphique est optimisé pour l'achage graphique (2D/3D). Un GPU est une unité de calcul massivement parallèle. La tâche qui consiste à remplir un million de pixels en moins d'une milliseconde est extrêmement répétitive. En eet, on peut facilement demander à n sous unités de remplir un million de polygones sur chacune de leur partie d'écran. Doubler la performance sur cette tâche simple reviendrait donc à doubler le nombre d'unités qui remplissent les pixels. Typiquement dans un jeu vidéo le CPU qui orchestre les opérations pour le GPU est un facteur limitant certain. Le GPU peut s'en sortir en augmentant continuellement la charge qui lui est assignée (augmentation de la résolution, de l'antialiasing, des calculs d'éclairage etc..). 11 Mais si sa charge n'augmente pas alors le GPU peut apparaître comme stagnant sur une application limitée par le CPU. Pour toutes les tâches qui sont fortement "data parallel" ou SIMD (un seul compteur d'instructions : simple instruction, données multiples), le GPU est à son avantage. De même pour toutes les tâches qui consistent à tracer des triangles puisque l'on peut mettre à prot toute la puissance de calcul dédiée. Mais si la tâche consiste à travailler sur un seul thread d'éxecution et sur une donnée à la fois, cet avantage disparaît. C'est que le CPU, ne pouvant mettre à prot ni une parallélisation facile, ni un gros pipelining, doit donc utiliser ses transistors pour maximiser le nombre d'instructions uniques exécutées par seconde. Il va donc dédier une grosse partie de sa surface à l'exécution "désordonnée". Si une instruction dépend d'une information située en mémoire principale, le délai d'attente sera assez long. Le CPU restera donc à ne rien faire pendant une bonne partie de son temps. Pour pallier cette lacune, on va rapatrier une bonne partie de cette mémoire localement, pour permettre aux unités de calcul de travailler à leur vitesse de croisière. Plus le cache est gros plus on limite ces délais d'attente. Le CPU est fortement limité par son jeu d'instructions (les commandes du CPU), ce dernier est plus ou moins gé et n'a que des opérations très élémentaires. Les gains en ecacité sont fortement limités par ce jeu d'instructions mais en contrepartie il y gagne un gros avantage. Comme chaque commande est très simple, changer de commande en cours de route en se basant sur une commande précédente est relativement peu coûteux (encore moins si l'on utilise la prédiction de branchement) et donc chaque nouvelle commande peut être rendue dépendante de la précédente. À l'inverse pour le GPU, si chaque commande devait être dépendante d'une précédente, le gros pipeline resterait vide la plupart du temps. Dans un GPU, il y a plus de transistors pouvant être consacrés aux traitements des données plutôt que dans les CPU où se trouvent les données de cache et de contrôle de ux. Un CPU possède 2, 4, à 8 coeurs tandis que le GPU en possède 240 et plus. (voir Figure 3.1) Figure 2.1 Comparaison CPU-GPU [1] 12 Les CPU sont composés d'une unité qui va eectuer toutes sortes de calculs divers, il se compose d'une mémoire cache et de coeurs de calcul. Les GPU sont basés sur une puce qui eectuera les calculs mais aujourd'hui ces unités de calcul sont indépendantes du reste de l'ordinateur, possédant leur propre mémoire cache cadencée à très haute vitesse. Les cartes graphiques vont eectuer des types de calculs bien spéciques, ce qui permet d'optimiser leur fonctionnement et leurs méthodes de calcul. Elles seront donc de plus en plus puissantes. Les avantages du GPU sont représentés par le fait que la carte peut être insérée dans une machine de bureau, il n'y a donc pas besoin d'infrastructures particulières et le coût est relativement faible. Par contre ses désavantages sont qu'il a besoin d'un programme adapté et d'une machine capable de recevoir la carte. Ces dernières années, le mur entre les CPU et les GPU est en train de tomber. Les GPU Nvidia, par exemple, peuvent exécuter des applications non graphiques. Ils sont donc capables de se comporter aussi bien comme des processeurs spécialisés que comme des processeurs arithmétiques. Ces derniers et les GPU font d'ailleurs le même genre de calculs. Grâce aux optimisations électroniques, un GPU pour les calculs à virgules ottante et à vitesse d'horloge égale, est en gros 100 fois plus rapide. [10] 13 Chapitre 3 Programmation en parallèle sur GPU 3.1 Introduction Tout commence avec Gordon Moore, le co-fondateur de Intel qui a prédit en 1965 que le nombre de transistors d'un processeur pourrait doubler tous les 18 mois et qu'ils deviendraient plus petits, plus denses, et plus puissants. Mais chaque processeur n'est pas plus rapide en lui-même, on peut tout simplement diviser la tâche de travail à eectuer sur beaucoup plus de transistors, il s'ensuit donc un gain de temps considérable. Cette prédiction est appelée la Loi de Moore (voir Figure 3.1 ) Figure 3.1 Comparaison CPU-GPU [2] Actuellement tous les fournisseurs principaux de processeurs produisent des puces multicoeurs. Et bientôt toute machine sera construite avec un système parallèle, ce qui sera un gros changement dans l'industrie de l'informatique. 14 Mais cette loi de Moore fût réinterprétée en disant cette fois-ci que le nombre de transistors d'un processeur doublerait non pas tous les 18 mois mais tous les deux ans. Malheureusement, même avec une innité de processeurs, l'accélération est limitée en raison de la loi d'Amdahl que nous ne faisons que mentionner ici. Cette loi d'Amdahl nous montre le gain de temps R d'un système multiprocesseur par la relation 3.1 : R= 1 s (1 − s) + N (3.1) En eet, si le nombre de processeurs N tend vers l'inni, on a : R= 1 (1 − s) (3.2) Dans cette dernière relation (3.2), le gain de temps R ne dépend que de la proportion d'activité parallélisable s. 15 3.2 Principes et notions de l'informatique en parallèle Pour programmer en parallèle, il faut trouver assez de parallélisme, utiliser la notion de granularité des tâches, c'est-à-dire essayer d'atteindre la plus grande nesse du système où l'on ne peut plus découper l'information. Il faut aussi communiquer le moins possible, les données doivent donc être localisées et il est nécessaire d'équilibrer le chargement si l'on ne veut pas avoir un système trop lourd. Enn il faut être coordonné, synchronisé et pouvoir modéliser ce qui va se passer. Voilà ce qui caractérise la programmation en parallèle et qui fait qu'elle est plus compliquée que la programmation séquentielle. Mais programmer un GPU est plus aisé qu'avant. 16 3.3 Langages de programmation sur GPU Nous allons introduire quelques langages de programmation pour GPU. Il existe : créé en 2004. Stream : Il fût créé en 2008 pour des cartes ATI uniquement, c'est le concurrent direct à NVIDIA. Brook GPU : ATI DirectX 11, Open GL : Créé par Apple en 2009 pour unier l'utilisation parallèle, il est compatible avec tout type de carte graphique à plusieurs coeurs mais nécessite d'un compilateur spécique au matériel. CUDA : Signie "Compute Unied Device Architecture", Il est compatible avec les cartes NVIDIA et fût créé en 2006-2007. Il est très proche du C/C++. [1] [10] OpenCL : Voici l'exemple d'un programme codé en OpenCL. [10] 1 2 3 4 5 6 7 8 9 10 11 12 13 __kernel void addv ( __global const f l o a t ∗ a , __global const f l o a t ∗ b , __global const f l o a t ∗ { int i = g e t _ g l o b a l _ g i d ( 0 ) ; c [ i ] = a[ i ] + b[ i ]; } main ( ) { } ... k e r n e l = c l C r e a t e K e r n e l ( . . . , " addv " , . . . ) clEnqueueNDRangeKernel ( queue , k e r n e l , . . . , 1 0 0 0 , . . . ) ; ... On voit qu'en réalité, ce n'est pas si facile, il nécessite d'avoir une bonne expertise en programmation, proche du matériel. Nous n'irons pas plus loin dans la programmation. En résumé, les opérations d'un programme sont distribuées sur les diérents coeurs du processeur, ce qui permet d'être eectuées en parallèle. 17 Bibliographie [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] Pierre Manneback. Informatique parallèle et distribuée. PhD thesis, FPMs, 2010-2011. Wikipédia, l'encylopédie libre, Mars 2013. www.wikipedia.org. Nvidia's website, Mars 2013. www.nvidia.fr. Hpc wire, Mars 2013. www.hpcwire.com. David Defour. Dis... c'est quoi un GPU ? PhD thesis, Laboratoire ELIAUS, Université de Perpignan, 2008. Pierre Kestener. Introduction à la programmation des GPU. PhD thesis, CEA-Saclay, IRFU, SEDI, Ensta, 2010. Pc world, Mars 2013. www.pcworld.fr. G. Libert and M. Benjelloun. Informatique I. PhD thesis, FPMs, 2011-2012. C net, Mars 2013. www.cnet.com. Jean-Stéphane Varré. GPU, processeurs multi-coeurs et bio-informatique. PhD thesis, Université de Lille. 18