Université de Nice – Sophia Antipolis Licence 1 Sciences Fondamentales Informatique Générale Processeurs Jacques Farré (d'après Fabrice Huet, Wikipedia ... et bien d'autres) [email protected] http://deptinfo.unice.fr/~jf/InfoGene © Jacques Farré 2013 Informatique générale - processeurs 1/46 Introduction Un processeur exécute un programme Composé d’instructions plus ou moins complexes Certaines instructions peuvent nécessiter des données Localisées en mémoire Chargées explicitement Les instructions sont elles-mêmes en mémoire Pour travailler, le processus dispose de registres Zones de stockage temporaires dans le CPU Extrêmement rapides mais en nombre limité Certains ont un rôle particulier (calculs en flottant, calcul d'adresses ...) © Jacques Farré 2013 Informatique générale - processeurs 2/46 Exécution d'une instruction © Jacques Farré 2013 Informatique générale - processeurs 3/46 Cycle d’instruction Traiter une instruction implique les opérations suivantes Lire l’instruction en mémoire : fetch Comprendre ce que fait l’instruction (addition ? multiplication ? …) : decode Aller chercher les opérandes si nécessaire (en mémoire ou en registre) : read Exécuter l’instruction : execute Éventuellement écrire les résultats dans un registre ou en mémoire : write back © Jacques Farré 2013 Informatique générale - processeurs 4/46 Cycle d'exécution d'une instruction (revoir TD n° 1) À chaque signal de l'horloge : fetch : l'adresse i de l'instruction (par exemple 183) est transférée de CI vers RA on augmente de 1 la valeur de CI le contenu du mot d'adresse mémoire i va (via le bus de données) dans RI 183 184 NB. on a en général plusieurs registres, pas uniquement un seul accumulateur decode : l'instruction est décodée (par exemple ici add 327, c'est à dire ajouter le mot à l'adresse 327 à l'accumulateur) © Jacques Farré 2013 Informatique générale - processeurs 5/46 Cycle d'exécution d'une instruction (revoir TD n° 1) Execute : l'adresse de 56+14 la donnée (ici 327) est transférée 327 dans RA le contenu du mot d'adresse 327 (ici 56) est transféré dans l'UAL, ainsi que le contenu de l'accumulateur (ici 14) : read les 2 valeurs sont additionnée : execute proprement dit et le résultat est mis dans l'accumulateur : write back © Jacques Farré 2013 Informatique générale - processeurs 6/46 Cycle d'exécution d'une instruction et mémoire Fetch c’est un accès mémoire, donc passe par un cache ; l'instruction est le plus souvent dans le cache L1 Les processeurs modernes ont un cache séparé pour les instructions et pour les données Decode/Execute/Write Back L’instruction est une suite de bits (32, 64 … bits) Le processeur doit décoder cette suite pour savoir si des opérandes sont nécessaires trouver les opérandes (en mémoire ou en registre) configurer les circuits nécessaires pour l’exécution © Jacques Farré 2013 Informatique générale - processeurs 7/46 Cycle d'exécution d'une instruction et mémoire Une instruction est en général divisée en micro-instructions propres à chaque type de processeur L’exécution des micro-instructions est effectuée par différentes parties du CPU Arithmetic Logical Unit (ALU) pour les entiers et le calcul d’adresses mémoires Floating Point Unit (FPU) pour les flottants Finalement le résultat est écrit dans un registre, parfois en mémoire © Jacques Farré 2013 Informatique générale - processeurs 8/46 Différences entre architectures RISC et CISC CISC (complex instr. set) ● opérations entre registres et mémoire ● modes de calcul d'adresse sophistiqués RISC (reduced instr. set) ● opérations entre registres uniquement ● modes de calcul d'adresse élementaires RISC/CISC CISC Risc : des instructions plus simples © Jacques Farré 2013 Informatique générale - processeurs 9/46 Différents formats d'instruction Architecture RISC : format fixe, assez facilement décodable, par exemple 128 codes instruction (27) 32 registres (25) Résultat et 1er opérande obligatoirement en registre 2e opérande en registre ou valeur littérale entière sur 13 bits © Jacques Farré 2013 Informatique générale - processeurs 10/46 Différents formats d'instruction Architecture CISC : format variable, plus compliqué à décoder © Jacques Farré 2013 Informatique générale - processeurs 11/46 Exécution en pipeline © Jacques Farré 2013 Informatique générale - processeurs 12/46 Pipeline Chaque instruction passe par différentes étapes ces étapes n'utilisent pas les mêmes circuits donc pas besoin d’attendre qu’une instruction finisse pour en traiter une autre comme pour une chaîne de montage (automobiles ...) Pipeline un pipeline est un ensemble d’éléments en série chargés d'une partie de l'exécution d'une instruction le nombre d’éléments P est appelé profondeur du pipeline © Jacques Farré 2013 Informatique générale - processeurs 13/46 Pipeline Pipeline basique à 5 étages dans une machine RISC IF = Instruction Fetch, ID = Instruction Decode, EX = Execute, MEM = Memory access, WB = Register write back on exécute donc N instructions en N + P - 1 cycles (au lieu de N×P si pas de pipeline) © Jacques Farré 2013 Informatique générale - processeurs 14/46 Limitations du pipeline Une étape du pipeline s’exécute en général en 1 cycle CPU Le pipeline ne réduit pas le temps nécessaire pour une instruction Mais il augmente le nombre d’instructions par cycle (à un moment donné, autant d'instructions en cours d'exécution que la profondeur du pipeline) Donc amélioration des performances du processeur Ok, donc il suffirait d’avoir un très long pipeline pour avoir de meilleurs performances ? Oui mais non © Jacques Farré 2013 Informatique générale - processeurs 15/46 Limitations du pipeline Il faut pouvoir découper une instruction en étapes Complexité du processeur Le pipeline a un coût Le passage d’une étape à une autre n’est pas instantané Une instruction « pipelinée » prendra un temps plus long qu’une instruction classique Linéaire en fonction du nombre d’étapes Il augmente les accès mémoires © Jacques Farré 2013 Informatique générale - processeurs 16/46 Structural Hazard Deux étapes différentes du pipeline peuvent nécessiter les même circuits du processeur Par exemple Une instruction fait des calculs sur un entier Elle sera découpée en micro-instructions, dont une fera appel à l’ALU Une autre instruction entre dans le pipeline : quand elle accèdera à la mémoire elle aura aussi besoin de l’ALU C’est ce qu’on appelle un structural hazard © Jacques Farré 2013 Informatique générale - processeurs 17/46 Structural Hazard On a un Structural Hazard quand des instructions dans le pipeline nécessitent au même moment les même ressources Dans cette situation, il faut bloquer le pipeline Stall (instruction bloquée dans sa progression) C’est l’instruction la plus avancée qui a priorité Toutes les instructions arrivées après elle dans le pipeline sont bloquées Celles arrivées avant peuvent continuer © Jacques Farré 2013 Informatique générale - processeurs 18/46 Éviter les structural hazard Comment empêcher les structural hazard Il faut que toutes les ressources soient suffisamment nombreuses pour les éviter Autrement dit : quelle que soit la combinaison d’instructions dans le pipeline, il doit y a toujours suffisamment de ressources Avoir plusieurs ALU Avoir plusieurs bus d’accès mémoire …. Très coûteux et complexe (mais en partie fait dans les processeurs les plus modernes) © Jacques Farré 2013 Informatique générale - processeurs 19/46 Data Hazard Le pipeline change le timing d’exécution des instructions Deux instructions séquentielles peuvent avoir leur exécution qui se recouvre partiellement Exemple : ADD R1, R2, R3 // R1 ← R2+R3 SUB R4, R1, R5 // R4 ← R1­R5 Dans une exécution avec pipeline, l’instruction 2 lira la valeur de R1 avant qu’elle ne soit écrite ! IF ID MEM EX WB IF ID MEM EX écriture dans R1 WB lecture de R1 Calcul sur l’ancienne valeur de R1 ⇒ résultat faux ! Il faut donc bloquer le pipeline dans ce cas (stall) © Jacques Farré 2013 Informatique générale - processeurs 20/46 Control Hazard Le pire de tous les problèmes Exemple : la boucle while while (a < b) a := a + 1; En assembleur (fictif) _w: cmp a,b // compare a et b jge _e // saut si a ≥ b inc a // a := a+1 jmp _w // saut inconditionnel _e: © Jacques Farré 2013 Informatique générale - processeurs 21/46 Control Hazard L’instruction jge entre dans le pipeline On ne sait pas encore le résultat de la comparaison, donc on ne sait pas s'il faut sauter (suivre une branche) à _e ou s'il faut continuer dans la branche en séquence Que fait-on en attendant ? On peut bloquer le pipeline jusqu’à savoir : pas du tout efficace L’instruction jge doit fournir 2 informations Savoir si oui ou non on doit sauter : quelle est l’adresse du saut ? Pour limiter l’attente dans le pipeline, il faut ces 2 informations le plus vite possible On doit donc modifier le pipeline pour les avoir le plus tôt possible Limitera le nombre de cycles de blocage Mais pas suffisant, un programme a énormément de sauts © Jacques Farré 2013 Informatique générale - processeurs 22/46 Prédiction de branchement Au lieu d’attendre, pourquoi ne pas commencer à exécuter l’instruction suivante ? Si le saut n’a pas lieu, on n'a rien perdu ! On fait l’hypothèse que le saut n’aura pas lieu Le pipeline n’a pas été bloqué, rien (registres, mémoire) n'a encore été modifié par l'instruction : performance optimale Si le branchement a lieu Tout ce qui est entré dans le pipeline après l’instruction n’aurait pas dû y entrer Il faut vider le pipeline : flush Plus le pipeline est long plus c’est coûteux © Jacques Farré 2013 Informatique générale - processeurs 23/46 Prédiction de branchement On peut mieux faire que toujours décider de ne pas suivre une branche Partie du CPU dédiée à cette tâche (Branch Processing Unit - BPU) Permet d’obtenir un taux de succès élevé Souvent basé sur l’historique d’exécution Si une branche n’a pas été prise récemment, très probablement elle ne le sera pas dans un futur proche Taux de succès très élevé Par exemple 91% sur les Pentium 3 (1999) © Jacques Farré 2013 Informatique générale - processeurs 24/46 Réordonnancement d’instructions Pourquoi ne pas traiter les problèmes en amont, avant d’entrer dans le pipeline ? Exemple : ADD R1, R2, R3 SUB R4, R1, R5 ADD R6, R7, R8 ADD R2, R3, R5 // R1 ← R2 + R3 // R4 ← R1 – R5 // R6 ← R7 + R8 // R2 ← R7 + R8 Dans cet ordre, il y a dépendance des données (R1), donc blocage du pipeline Mais si on fait les 3 ADD en premier, alors plus de problème ADD R1, R2, R3 // R1 ← R2 + R3 ADD R6, R7, R8 // R6 ← R7 + R8 ADD R2, R3, R5 // R2 ← R3 + R5 SUB R4, R1, R5 // R4 ← R1 – R5 © Jacques Farré 2013 Informatique générale - processeurs 25/46 Réordonnancement d’instructions Le réordonnancement est décidé par le processeur Mécanisme appelé Scheduler Nécessite de calculer les dépendances entre les instructions Travaille sur un sous ensemble d’instructions appelé fenêtre Plus la fenêtre est grande, plus il est possible de faire des réordonnancement complexes Mais il peut aussi être fait par le compilateur peut travailler sur la totalité du code, et pas seulement une fenêtre peut employer des algorithmes plus sophistiqués © Jacques Farré 2013 Informatique générale - processeurs 26/46 Processeurs superscalaires, multicœurs, graphiques... © Jacques Farré 2013 Informatique générale - processeurs 27/46 Architecture Superscalaire Permet d’exécuter plusieurs instructions en même temps (parallélisme) Instructions indépendantes utilisant des éléments différent s : flottant vs entier vs graphique vs accès mémoire ... ce qui n'est pas incompatible avec le pipeline Ou multiplier certains éléments (plusieurs ALU) Limitations degré limité de parallélisme des instructions complexité et coût en temps de l'aiguillage des instructions les problèmes de branchement © Jacques Farré 2013 Informatique générale - processeurs 28/46 Processeur G4 (Motorola) Équipait les PowerMac (1999 – 2005) Pipeline à 7 étapes Il peut y avoir jusqu’à 16 instructions en cours de traitement (car l'étape execute peut prendre plusieurs cycles selon l'unité où elle est exécutée) arstechnica.com Pentium 4 2000 – 2007 Pipeline à 20 étages Jusqu’à 126 instructions en cours d’exécution arstechnica.com Architecture Multi-Cœur On met plusieurs CPU sur une même puce Chaque CPU peut être plus simple qu'un mono-cœur, avec une fréquence d'horloge plus petite chaque CPU est superscalaire en général, chaque CPU a un cache L1 mais ils partagent les caches L2 ou L3 tendance à augmenter le nombre de coeurs (Intel Polaris, 80 coeurs, certains prototypes avec plusieurs centaines, voire plusieurs milliers - Adapteva) consommation électrique diminuée Un mono-cœur doit se partager entre les différents programmes actifs (multi-tâches), un multi-cœur peut répartir ces tâches sur ces coeurs Les programmes (notamment le système d'exploitation) doivent être repensés (programmation parallèle) © Jacques Farré 2013 Informatique générale - processeurs 31/46 Architecture Multi-Cœur XLP 832 (Broadcom) : 0,5 – 1,5 GHz 8 cœurs Sécurité réseaux Cloud Computing Compression de très grosses données ... © Jacques Farré 2013 Informatique générale - processeurs 32/46 Architecture Multi-Cœur Cortex A9 (ARM) : 0,8 – 2 GHz 1 – 4 cœurs Samsung Galaxy, IPhone 4S, PlayStation Vita, ... © Jacques Farré 2013 Informatique générale - processeurs 33/46 Performances des processeurs Un processeur est extrêmement complexe Deux processeurs de la même famille (ex : x86) peuvent avoir un fonctionnement très différent Comment les comparer ? La fréquence d'horloge ne fait pas tout Pourquoi ne pas compter le nombre d’opérations effectuées par secondes Ok, mais lesquelles? Entiers, flottants, un mélange… ? © Jacques Farré 2013 Informatique générale - processeurs 34/46 Flops Floating point operations per second Mesure le nombre d’opérations sur des flottants effectuées par seconde Très utile dans le calcul scientifique (où on peut avoir à exécuter un nombre énorme d'opérations) La mesure est effectuée grâce à un programme appelé Benchmark (test de performance) Le benchmark doit être le même pour tous les CPUs testés En général LINPACK (résolution d’équations linéaires) © Jacques Farré 2013 Informatique générale - processeurs 35/46 Exemple de supercalculateurs Le site du classement des super-calculateurs : http://www.top500.org/ Classement novembre 2013 Tianhe-2 (NUDT, Chine) : 3 120 000 cœurs (Intel Xeon 2,2 GHz), 34 Pflops (1 peta = 1015, un million de milliards), 18 000 kW (consommation d'une ville de 10000 habitants) Titan (Cray, USA) : 560 000 cœurs (18688 AMD Opteron 16 cœurs, 2,2 GHz et 18688 cartes graphiques Nvidia), 18 Pflops), 8200 kW Sequoia (IBM, USA) : 1 572 864 cœurs (IBM Power BQC 16C 1.60 GHz), 17 Pflops, 7900 kW ... en 14e, Pangea (Total, France) : 110 400 cœurs (Xeon 2.67 GHz), 2,1 Pflops, 2100 kW © Jacques Farré 2013 Informatique générale - processeurs 36/46 Exemple de supercalculateurs Le séquoia d'IBM © Jacques Farré 2013 Informatique générale - processeurs 37/46 Exemple de supercalculateurs Le premier actuellement : Tianhe-2 (Milky Way – Rivière céleste) 3 120 000 cœurs (Intel Xeon et Phi 2.20 GHz), mémoire 1 024 000 Go 34 Pflops (1 peta = 1015, 1 million de milliards), consommation 17 808 kW © Jacques Farré 2013 Informatique générale - processeurs 38/46 Graphics Processing Units (GPU) Processeurs spécialisés dans le rendu graphique Produits d'abord pour l’industrie du jeu video Très performants dans les calculs flottants Mais très spécialisés (pas faciles à programmer pour faire autre chose) Graphics State Application CPU © Jacques Farré 2013 Transform & Light Assemble Primitives Rasterize GPU Shade Video Memory (Textures) Render-to-texture Informatique générale - processeurs 39/46 Exemple de supercalculateurs Le premier en décembre 2012 : Titan XK 7 de Cray 18 688 AMD Opteron 6274 16-core et 18 688 Nvidia Tesla K20X mémoire 693 000 Go 17 Pflops (1 peta = 1015, 1 million de milliards), consommation 8 200 kW, occupation 400 m2 © Jacques Farré 2013 Informatique générale - processeurs 40/46 Performances comparées processeur / carte graphique © Jacques Farré 2013 Informatique générale - processeurs 41/46 SISD, SIMD, Stream Processing Un CPU est SISD (Single Instruction Single Data) Les GPU fonctionnent sur le modèle SIMD (Single Instruction Multiple Data) Étendu et appelé Stream Processing (Multiple Instruction Multiple Data) Le GPU charge un ensemble d’instructions appelé kernel et l’exécute sur une grosse quantité de données © Jacques Farré 2013 Informatique générale - processeurs 42/46 General Purpose GPU GPGPU General Purpose computing GPU Permet d’introduire du code programmé dans les étapes de rendu Utiliser des GPU pour faire d’autres calculs ? Produits en grande quantité pour les consoles ⇒ moins coûteux qu'un processeur spécialisé Mais il faut du code SIMD : langages de programmation spécialisés Très difficile avec les premiers GPU : il fallait détourner les fonctions graphiques Dernières générations flexibles, programmables avec des kits logiciels (frameworks) comme nVIDIA CUDA ou OpenCL © Jacques Farré 2013 Informatique générale - processeurs 43/46 Un exemple : NVIDIA 8800 Stream Processor (SP) Processeur scalaire faisant du calcul flottant Texture Filtering (TF) Permet d’introduire du code programmé dans les étapes de rendu Mémoire Fully Buffered (FB) Les SP sont regroupés par 16 dans un cœur Permet des lectures et écritures en parallèle Permet notamment de faire des corrections d'erreurs Le 8800 compte 8 cœurs, soit 128 SP Les cœurs sont reliés entre eux Un cœur peut utiliser le résultat d’un autre © Jacques Farré 2013 Informatique générale - processeurs 44/46 Un exemple : NVIDIA 8800 © Jacques Farré 2013 Informatique générale - processeurs 45/46 Mais pourquoi sont ils si rapides ? Ils sont très spécialisés Ils sont massivement parallèles Pas de calcul sur entier par exemple 256 SP sur les nVidia Geforce 280 Ils ne traitent bien qu’un type de programme SIMD/Stream Pas de mécanismes compliqués comme la prédiction de branchement ou la gestion de la mémoire © Jacques Farré 2013 Informatique générale - processeurs 46/46