Introduction au calcul réparti Françoise Roch Plan Introduction Concepts et terminologie Modèles d’architecture mémoire des machines parallèles Les tendances au niveau architecture Modèles de programmation parallèle Conception d’un programme parallèle Exemples Références 2 Introduction • Historiquement, un logiciel était écrit pour un traitement séquentiel : Pour être exécuté sur une machine avec une seule unité de calcul Un calcul était découpé en une série discrète d’instructions Les instructions étaient exécutées les unes après les autres Une seule instruction pouvait s’exécuter à un instant donné Le problème p CPU tn tn-1 t1 t0 3 Exécution parallèle • • • • Un calcul parallèle est exécuté sur plusieurs unités de calcul Le calcul est découpé en plusieurs parties pouvant s’exécuter simultanément Chaque partie est découpée en séquences d’instructions Des instructions de chaque partie s’exécutent simultanément sur # CPU CPU CPU CPU CPU 4 Exécution parallèle • Les ressources de calcul peuvent être – Une seule machine avec un ou plusieurs processeurs – Plusieurs machines avec un ou plusieurs processeurs interconnectées par un réseau rapide – Une grille de calcul : plusieurs ensembles de plusieurs machines • On peut donc améliorer le temps d’exécution en utilisant plusieurs CPU à la fois Si un CPU peut exécuter les opérations arithmétiques q du pprogramme g en temps p t,, alors n CPU peuvent idéalement les exécuter en temps t/n 5 Du Séquentiel au parallèle • L’évolution du calcul séquentiel vers le calcul parallèle est – permise grâce à ll’évolution évolution de la technologie, technologie la vitesse des réseaux augmente et permet d’utiliser des ressources réparties – Requise par les contraintes energetiques et economiques • L Le modèle dèl parallèle llèl « fit » avec notre t univers i : la l nature t estt intrinsèquement parallèle, elle est composée d’éléments complexes, qui évoluent en parallèle, interagissent, et subissent simultanément certains événements. Quelques exemples : Les modèles d l de d météo et océans Les déplacements de plaques tectoniques Les chaînes d’assemblage automobile La vision, la pensée, … 6 Le parallélisme aujourd aujourd’hui hui • Il est depuis une quinzaine d’années utilisé pour le traitement de problèmes scientifiques constituant de grands challenges, tels que : météo et climat, biologie (génome), géophysique (activité sismique), réactions chimique et réactions nucléaires,, … • Mais aujourd’hui également pour des applications commerciales : Bases de données parallèles, exploration pétrolière, moteurs de recherche web, réalité virtuelle, … 7 Pourquoi q utiliser le parallélisme p ? • Economiser du temps (à la montre) • Résoudre des problèmes p de + grande g taille • Avoir accès à + de mémoire et + de puissance en cumulant les ressources matérielles • Pouvoir P i traiter t it plusieurs l i choses h en même ê temps t • Les limites du séquentiel : – Limites de la vitesse de transmission ( transmission des données entre les différents éléments du hardware) – La taille mémoire – Les limites de la miniaturisation – Les limites économiques : + cher d’augmenter la rapidité d’un processeur que de multiplier les processeurs ou les cores 8 Pourquoi utiliser le parallélisme ? Un autre aspect : l’expressivité • Une + grande puissance expressive des modèles de calcul parallèles : une approche parallèle des problèmes peut aboutir à des solutions originales (nouveaux modèles, nouveaux algorithmes). • De nouveaux concepts : – Concurrence C – Communication – Synchronisation nouveaux problèmes : non déterminisme, justesse, interblocage, terminaison g q nouveaux modèles,, nouvelle dimension algorithmique 9 Modèles et Terminologie 10 Classification de Flynn Classification des architectures selon 2 dimensions : « instructions » et « data », 2 états possibles pour chacune : « single » ou « multiple » SISD SIMD Single Instruction Instruction,Single Single Data Single Instruction Instruction, Multiple Data MISD MIMD Multiple Instruction, Single Data Multiple Instruction, Multiple Data 11 Cl ifi ti de Classification d Flynn Fl • Flux/flot dd’instructions instructions : séquence dd’instructions instructions exécutées par la machine • Flux/flot de données : séquence de données appelées par le flux d’instructions load A load b C = A+B teemps • SISD : architecture architect re séquentielle séq entielle avec a ec unn seul flot d’instructions, un seul flot de données, exécution déterministe store C A = B*2 store A P 12 Cl ifi ti de Classification d Flynn Fl • SIMD: architecture // , ttes les unités de traitement exécutent la même instruction à un cycle d’horloge donnée, chaque unité peut opérer sur des données différentes,, exécution déterministe – Arrays processors – Machines vectorielles (instructions sur des vecteurs de données) – Exécution pipelinée load A(2) load A(n) load B(1) load B(2) load B(n) C(1) = A(1)+B(1) C(2) = A(2)+B(2) C(n) = A(n)+B(n) store C(1) store C(2) store C(n) P1 P2 … Pn teemps load A(1) 13 Cl ifi ti de Classification d Fl Flynn • MISD : un seul flot de données alimente plusieurs unités de traitement, chaque unité de traitement opère indépendamment des autres, sur des flots d’instructions indépendants Peu implémenté Ex d’utilisation : exécution en // de plusieurs algos de cryptographie pour le décodage d’1 même message load A(1) load A(1) C(1) = A(1)*1 C(2) = A(1)*2 C(3) = A(1)*3 store t C(1) store t C(2) store t C(3) P1 P2 Pn load A(1) call func load D load B(1) xx=y y l dE load C(1) = A(1)+B(1) y=y+1 F=A*E call sum(x y) sum(x,y) store F store C(1) P1 P2 … Pn teemps MIMD: architecture la plus courante aujourd’hui, Chaque C aque uunitéé de traitement a e e peu peut gérer gé e un flot d’instructions différent Chaque unité peut opérer sur un flot de données différent L’exécution peut être synchrone ou asynchrone, déterministe ou nondéterministe load A(1) temps • 14 Terminologie e o og e • • • • • Tâche : une portion de travail à exécuter sur un ordinateur, du type un ensemble d’instructions d’un programme qui est exécuté sur un CPU. Tâ h parallèle Tâche llèl : une tâche tâ h quii peutt s’exécuter ’ é t sur plusieurs l i CPU, CPU sans risque sur la validité des résultats Exécution séquentielle : exécution d’un programme séquentiel, une ét étape à la l fois. f i Exécution parallèle : exécution d’un programme par plusieurs tâches, chaque tâche pouvant exécuter la même instruction ou une instruction diffé t à un instant différente i t t donné. d é Mémoire partagée : D’un point de vue hard, réfère à une machine dont tous les CPUs. ont un accès direct à une mémoire φ commune ( é é l (généralement t via i un bus) b ) D’un point de vue modèle de programmation : toutes les tâches ont la même image mémoire et peuvent directement adresser et accéder au même emplacement mémoire logique, logiq e peu pe importe où il se trouve tro e en mémoire physique. 15 Terminologie • • • • • • Mémoire distribuée : dd’un un point de vue physique, physique basée sur un accès mémoire réseau pour une mémoire physique non commune. D’un point de vue modèle de programmation, les tâches ne peuvent voir que la mémoire de la machine locale et doivent effectuer des communications pour accéder à la mémoire dd’une une machine distante, distante sur laquelle dd’autres autres tâches s’exécutent. Communications : les tâches parallèles échangent des données, par différents moyens physiques : via un bus à mémoire partagée, via un réseau. Quelque soit la méthode é ode eemployée, p oyée, on o parle p e de «communication co u c o ».. Synchronisation : la coordination des tâches en temps réel est souvent associée aux communications, elle est souvent implémentée en introduisant un point de synchronisation au-delà duquel la tâche ne peut continuer tant que une ou plusieurs autres tâches ne l’ont pas atteint. Granularité : mesure qualitative du rapport calcul / communications – Grain grossier (coarse) : relativement bcp de calculs entre # communications – Grain fin (fine) : relativement peu de calcul entre # communications speedup : mesure de l’amélioration des performances due au parallélisme (wall clock time of serial execution) / (wall clock time of //execution) Scalabilité : réfère à la capacité d’un système // à fournir une augmentation de l’ élé ti proportionelle l’accélération ti ll à l’augmentation l’ t ti du d nombre b de d CPUs. CPU 16 Architecture mémoire des machines parallèles 17 Mémoire partagée • • Tous les CPUs accède à toute la mémoire globale avec un même espace d’adressage global Chaque q CPU travaille indépendamment p des autres,, mais les modifications effectuées par un processeur à un emplacement mémoire (en mémoire globale) sont visibles par tous les autres Les CPUs ont leur propre mémoire locale (cache) CPU cache cache CPU Mémoire cache • CPU cache CPU 18 Mémoire ppartagée g : UMA/NUMA 2 classes d’architecture à mémoire partagée, différenciées ppar les temps p d’accès mémoire : • UMA (Uniform memory access) : Des CPUs identiques, ayant tous le même temps d’accès à la mémoire Plus couramment appelées SMP (Symmetric MultiProcessor) Gestion de la cohérence des caches Certains systèmes sont CC-NUMA : si un CPU modifie un emplacement mémoire partagé, la modification est visible ppar tous les autres CPUs 19 Mémoire ppartagée g : UMA/NUMA • NUMA (Non (N Uniform U if M Memory A Access) ): Conçue pour pallier aux problèmes d’accès mémoire concurrents via un unique q bus . En général fabriquées à base de plusieurs blocs SMP interconnectés D temps Des t d’ è à la d’accès l mémoire é i diffèrent diffè t suivant i t la l zone accédée. Le temps d’accès via le lien d’interconnexion des blocs est plus lent Gestion de la cohérence des caches CC-NUMA : Cache Coherent NUMA 20 Architectures NUMA Mémoire physiquement distribuée mais logiquement partagée CPU CPU CPU CPU 21 Mémoire partagée • Espace d’adresse globale J facilite le travail du programmeur • Mémoire proche des CPUs J le partage des données entre tâches est rapide p Mais : • Manque de scalabilité : augmenter le nombre de CPUs accroît le traffic sur s r le chemin d’accès à la mémoire partagée • Le programmeur doit gérer la synchronisation pour un accès correcte à la mémoire globale • Très coûteux de construire des architectures à mémoire ppartagée g avec un ggrand nombre de CPUs 22 Mémoire distribuée • Le point commun de ces architectures : elles possèdent un réseau d’interconnexion pour communiquer entre les mémoires des différents processeurs. processeurs CPU CPU Réseau CPU CPU 23 Mémoire distribuée • Chaque processeur à sa propre mémoire locale, il n’y a pas de d notion ti d’espace d’ d’adressage d’ d globale l b l entre t tous t les procs. autres • Les procs opèrent indépendamment les uns des autres, une modification en mémoire locale n’a pas d’effet sur la mémoire des autres procs. • Si un processeur a besoin d’une donnée dans la mémoire d’un autre processeur, le programmeur doit définir explicitement la communication communication. • Les réseaux d’interconnexion sont divers, avec des niveaux de pperformance très variables 24 Mémoire distribuée • On peut augmenter le nombre de processeur et la mémoire proportionnellement • Accès rapide à la mémoire locale sur chaque proc, sans surcoût de gestion de cohérence de cache • Coût C ût raisonnable i bl ex : PCs PC en réseau é Mais : • Le pprogrammeur g doit ggérer toutes les communications entre processeurs • Peut être difficile de faire coïncider une structure de données basée sur une mémoire globale, globale à cette organisation physique de la mémoire • Temps d’accès mémoire non locaux élevés 25 Architectures mémoire Hybrides y • • • Les ordinateurs les plus puissants au monde sont aujourd’hui un mixte de mémoire partagée et mémoire distribuée La brique de base (nœud) est un multiprocesseur à mémoire partagée Ces briques sont interconnectées par un réseau (type ethernet, myrinet, Infiniband, …) CPU CPU CPU CPU CPU CPU m mémoire CPU m mémoire CPU Réseau CPU CPU CPU CPU CPU CPU mémoirre CPU mémoirre CPU 26 Mémoire partagée vs Mémoire distribuée • Parallélisation plus simple sur architecture à mémoire partagée • Mais mémoire partagée + chère que mém. distribuée Des systèmes à mémoire virtuellement partagée pour bénéficier des avantages du partagé sur architecture distribué Ou des langages à espace d’adressage global (Unified Parallel C, Co-array Fortran, …) Mais, si accès mémoire non uniforme, il faut tenir compte de la répartition physique de la mémoire pour optimiser les performances plus complexe 27 Conséquences pour le programmeur Nécessité de décoder la relation entre ll’architecture architecture et les applications: Adapter les algorithmes, la programmation, Comprendre le comportement d’un programme, Choisir son infrastructure de calcul en fonction de ses besoins, retenir le meilleur compromis 28 Les tendances au niveau architecture Cell Sandy Bridge 29 Evolution des architectures Loii de L d Moore M : nbb de d transistors t i t par circuit i it intégré i té é * 2 tous t les l 2 ans. En 10 ans,, la finesse de ggravure est ppassée de 0,25 , µ µm ((Pentium III) à 0,045 µm (Core 2 Penryn, Nehalem, …). Evolution de l’architecture des processeurs (pipeline, d li ti des duplication d unités ité fonctionnelles, f ti ll exécution é ti spéculative, é l ti exécution désordonnée ...). pp : dans le cas Evolution des interactions architecture/applications de l’Itanium, le compilateur fait partie intégrante de l’architecture. E l ti des Evolution d infrastructures i f t t vers un haut h t degré d é de d parallélisme lléli en intégrant un grand nombre de cores. Utilisation de cores hétérogènes (CPU + GPU) et API compatibles (CUDA, Brook+, OpenCL) 30 x 10000 x 10000 Evolution des architectures: g , giga, g g , téra,, ppéta,, … kilo,, méga, 1997 : année du Teraflops 2008 : année du Petaflops Tests Linpack sur la machine IBM Roadrunner du DoE de Los Alamos Folding@Home, BOINC : projets de calcul bénévole 2017 : année é de d l’Exaflops l’ fl ??? 31 Evolution des processeurs: GPU versus CPU Vitesse des processeurs classiques * 2 tous les 16 mois Vitesse des processeurs graphiques (GPU) *22 tous les 8 mois 32 Modèle de Von Neumann (1945) La mémoire : contient le programme (instructions) et les données. Une Unité Arithmétique et Logique : UAL qui effectue l opérations. les é ti Une unité de contrôle : chargée du séquençage des opérations. Une unité d’Entrée/Sortie. 33 U e aarchitecture Une c ec u e d’aujourd’hui Système d’Entrées/ Sorties Mémoire Bus interface L3 L1 inst r Core0 Core1 Core2 Core3 Unité de commande UAL UAL UAL L1 data UAL L 2 34 Caractéristiques des processeurs Jeux d’instructions qu’il peut exécuter : Complexe : CISC (beaucoup d’instr. Complexes prenant plusieurs cycles d’horloge). Ex: x86 Réduit : RISC (Moins d’instr. Mais n’utilisant que quelques cycles). Ex: PowerPC N b dde bi Nombre bits pouvant être ê traités i é en une instruction, i i 32 ou 64 bits N b dde ttransistors: Nombre it plus l il contient ti t de d transistors, t it plus il est capable d’exécuter d’instructions /seconde 35 Comment faire des processeurs plus rapides Augmenter la fréquence d’horloge (limites techniques, solution coûteuse). Permettre l’exécution simultanée de plusieurs instructions : Instruction Level Parallelism : pipelining, superscalaire, architecture VLIW et EPIC. Thread Level Parallelism : multithreading et SMT. SMT Améliorer les accès mémoire. 36 Augmenter la fréquence d’horloge La fréquence d’horloge détermine la durée d’un cycle. Chaque opération utilise un certain nombre de cycles. La fréquence d’horloge est fonction de : la technologie des semi-conducteurs, le packaging, les circuits. Les limites : La consommation électrique q et la dissipation p thermique q d’un processeur sont fonction de sa fréquence d’horloge. Le temps d’interconnexion ne suit pas la finesse de gravure. Le nb de cycles d’horloge pour interruptions, « cache miss »ou mauvaise prédiction de branchement augmentent. 37 Exécution en // de plusieurs instructions 1 CPU = plusieurs unités fonctionnelles qui peuvent travailler en // : unité de gestion des bus, unité de commande, unité d’exécution. L’unité L unité dd’exécution exécution (ou de traitement) est composée notamment de : une /plusieurs unités arithmétiques et logiques (UAL) qui assurent les fonctions basiques de calcul arithmétique et les opérations logiques. une / plusieurs unités de virgule flottante (FPU). L’instruction de calcul de base est la multiplication / addition (FMA : Floatingpoint Multiply and Add) en double précision. La performance crête dépend de la taille des registres et est fonction de la précision é i i (SP,DP). (SP DP) Mesure de performance en terme de Mflops : évalue uniquement les opérations sur les flottants, on peut utiliser les MIPS pour mesurer une performance sur le nombre d’instructions p p par seconde. Perf crête de l’Intel Harpertown (quadcore) 2.5GHz: 38 2FPU+1FMA, 4 FP/cycle 4*2.5*4 = 40 Gflops crête en DP Exécution simultanée de plusieurs instructions ILP (pipeling) Principe : Une opération est découpée en plusieurs étapes indépendantes. Ces différentes étapes sont exécutées simultanément, sur des données distinctes, par des éléments différents du pprocesseur (parallélisme d’instructions). Phases d’exécution d’une instruction : IF : Instruction Fecht ID : Instruction Decode/Register Fecht EX : Execution/Effective Address MA : Memory Access/ Cache Access WB : Write Write-Back Back 5 instructions en // en 9 cycles (25 en séquentiel) Multiplication du débit 39 d’exécution des instructions Instruction Level Parallelism : architectures superscalaires Principe : Duplication de composants (FMA, FPU) et exécution simultanée de plusieurs instructions . 10 instructions en 9 cycles 40 Le parallélisme d’instruction L techniques Les t h i d’optimisation d’ ti i ti Gestion des instructions – Statique (in-order): exécutées dans l’ordre du code machine – Dynamique (out-of-order): le hardware modifie l’ordre des instructions pour favoriser f i le l parallélisme lléli (faible (f ibl nombre b d’i d’instructions) i ) Execution spéculative : faire une hypothèse sur la suite d’un traitement après un branchement conditionnel (lorsque la valeur de la condition n’est pas encore calculée). Les p problèmes de dépendances p entre instructions : Partage des ressources : par exemple la mémoire Dépendances des données entre instructions : une instruction produit une opérande utilisée immédiatement par l’instruction suivante Dépendances des contrôles : une instruction est une branche. 41 Mode SIMD Principe : Le mode SIMD (Single Instruction Multiple Data) permet d’appliquer la même instruction simultanément à plusieurs données (stockées dans un registre) pour produire plusieurs résultats. Exemples p de Jeux d’instructions SIMD MMX : permettent d'accélérer certaines opérations répétitives dans des domaines tels que le traitement de l'image 2D, du son et des communications. SSE (SSE2, SSE3, SSE4, SSE5 annonçé par AMD) – Streaming SIMD Extensions : par ex instructions pour additionner et multiplier plusieurs valeurs stockées dans un seul registre (registre SSE)) 3DNow : jeu d’instructions multimédia développé par AMD 42 Les architectures vectorielles De nombreux problèmes intrinsèquement vectoriels: ils opèrent è t sur des d vecteurs t de d données d é unidimensionnels idi i l Certaines architectures disposent d’instructions vectorielles l instruction vectorielle est décodée une seule fois, les éléments du l’instruction vecteur sont ensuite soumis un à un à l’unité de traitement Les pipelines des unités de traitement sont pleinement alimentés Exemple : Cray, Cray NEC SX SX, Fujitsu VPP, VPP Altivec (PowerPC G4 et G5, Power6) La tendance est au renforcement des instructions multimédia, à l’augmentation de la taille et du nombre de registres vectoriels 43 Les limites du //isme d’instructions Obstacles à la performance sur les systèmes superscalaires «standard»: L branchements Les b h (IF CASE, (IF, CASE …)) Les mauvaises prédictions : en cas d’erreur de prédiction, il faut faire marche arrière Les petites branches ont peu de code à exécuter ce qui limite le parallélisme La latence de la mémoire Utilise plus d’un cycle d’horloge L’ t ti du L’extraction d parallélisme lléli d instructions des i t ti Le compilateur « sérialise » le code, dont le parallélisme intrinsèque doit être redécouvert dynamiquement par le processeur 44 Dépasser les limites en aidant le processeur Les architectures VLIW (Very Long Instruction Word) et EPIC ((Explicitly p y Parallel Instruction Set Computing) p g) permettent de traiter des instructions longues, aggrégations d’instructions courtes indépendantes, de façon à les exécuter explicitement en parallèle. VLIW : le compilateur a la charge d’organiser correctement les i instructions i parmii les l bundles b dl (blocs (bl formés f é de d plusieurs l i instructions successives), tout en respectant les types de dépendances habituelles qui sont normalement gérées au niveau matériel sur les architectures classiques. classiques On ggagne O g en pperformance (p (pas de contrôle), ), mais la compatibilité binaire en générations successives est quasiimpossible. 45 Dépasser les limites en aidant le processeur EPIC (Explicitly Parallel Instruction Set Computing) : type d’architecture de microprocesseurs utilisée notamment dans les Itaniums Le parallélisme est exprimé de manière indépendante de Itaniums. la mise en oeuvre du processeur. Disparition du réordonnancement à l’exécution : les instructions sont exécutées dans ll’ordre ordre exact dans lequel le compilateur les a mis. → L’effort d’optimisation repose sur le compilateur qui a la charge d’organiser statiquement les dépendances interinstructions 128 bits Instruction 1 41 bits Instruction 2 41 bits Instruction 3 41 bits template 5 bits 46 Améliorer le remplissage du flot di d’instructions i du d processeur : TLP (Thread ( h d Level Parallelism) Idée : mixer deux flux d’instructions arrivant au processeur pour optimiser l’utilisation simultanée de toutes les ressources (remplir l cycles les l perdus d - cache h miss, i load l d ...). ) Le SMT (Simultaneous Multithreading) partage du pipeline du processeur entre plusieurs threads(d’un même programme ou de deux programmes différents). Les registres et les caches sont aussi partagés. L’hyperthreading = SMT d’Intel. Le multithreading dégrade les performances individuelles des threads mais améliore les performances de l’ensemble. 47 Les différentes architectures mémoire Principalement deux types à base de semi-conducteur semi conducteur : – DRAM (Dynamic Random Access Memory) chaque bit est représenté par une charge électrique qui doit être rafraîchie à chaque lecture/écriture. – SRAM (Static (S i Random R d Access A Memory) M ) retient i ses données d é aussii longtemps qu’il y a du courant. Temps d’un cycle SRAM de 8 à 16 fois plus rapide qu’un cycle DRAM. Coût de la mémoire SRAM de 8 à 16 fois plus élevé que la mémoire DRAM. Solution la plus courante: 1. De 1 à 3 niveaux de SRAM en mémoire cache. 2. La mémoire principale en DRAM. 3. La mémoire virtuelle sur des disques. Type Taille Vitesse Coût/bit Registre < 1 KB < 1 ns $$$$ SRAM On-chip 8 KB - 6MB < 10 ns $$$ SRAM Off-chip 1 MB 16 MB < 20 ns $$ DRAM 64 MB 1 TB < 100 ns $ Flash 64 MB – 32GB < 100 μs c Disk 40 GB - 1 PB 5 bits < 20 ms ~0 48 Hiérarchisation de la mémoire Cas idéal : Mémoire la plus grande et la plus rapide possible La performance des ordinateurs est limitée par la latence et la bande passante de la mémoire : L Latence = temps pour un seull accès. è Temps d’accès mémoire >> temps cycle processeur. Bande passante = nombre d’accès par unité de temps. μProc 60%/année 1000 CPU 100 Processeur-Mémoire Performance 50%/année 10 DRAM 7%/année DRAM 2000 5 bits 1999 1998 1997 1996 1995 1994 1992 1993 1991 1990 1989 1988 1987 1986 1985 1984 1983 1982 1981 1 1980 Performan nce Moore’s Law 49 Notion de localité mémoire : 2 propriétés importantes des références mémoire Localité temporelle : si une zone est référencée, elle a d chances des h d’ê d’être référencée éfé é à nouveau dans d un futur f proche. E Exemple l de d proximité i ité temporelle t ll : dans d une bboucle l simple, chaque itération accède aux mêmes instructions. instructions Localité spatiale : si une zone est référencée, les zones voisines ont des chances dd’être être référencées dans un futur proche. Exemple p de pproximité spatiale p : dans un bloc simple, chaque instruction sera accédée l’une après 50 l’autre. Proximité temporelle DO I = 1,10 0000 S1 = A(I) S2 = A(I+K) ( ) # S2 sera réutilisé à l’itération I+K END DO L idée de base est de conserver A(I L’idée A(I+K) K) (lecture de la référence à l’itération I, déclaration S2) en mémoire rapide jusqu’à sa prochaine utilisation à l’itération I+K, déclaration S1. Si on veut exploiter la localité temporelle via les registres, cela suppose qu’il faille au moins K registres. Cependant, dans le cas général, on aura certainement b i de besoin d stocker k d’autres d données. d 51 L’évaluation précise de la proximité temporelle est très complexe Proximité spatiale Le voisinage L ii d’une d’ zone localisée l li é par une adresse d doit d it être êt évaluée dans l’espace d’adressage virtuel. Les structures de données sont linéarisées et réduites à une dimension pour être placées dans l’espace d’adressage linéaire. Exemple en Fortran (rangement des tableaux 2D par colonne) DO J = 1,1000 DO I = 1,10000 X1 = A(I,J) X2 = B(J B(J,I) I) END DO END DO Pour A : localité spatiale parfaite, accès à des zones de mémoire consécutives consécutives. Pour B : 2 références consécutives sont distantes d 1000 emplacements de l mémoires Pour exploiter la localité spatiale, il faut que la distance entre522 références soit inférieure à la taille de la ligne du cache. La hiérarchie mémoire 2 principes de base pour pour que les références mémoire futures soient rapidement satisfaites : Localité temporelle Garder les éléments récemment référencées aux plus hauts niveaux de la hiérarchie (au plus près du CPU) L li é spatiale Localité i l Garder les voisins des éléments récemment référencés aux plus hauts niveaux de la hiérarchie 53 Organisation des caches Le cache est divisé en lignes de n mots. 2 niveaux de g granularité : le CPU travaille sur des « mots » (par ex 32 ou 64 bits). Les transferts mémoire se font par blocs (par ex lignes de cache de 256 octets). Une même donnée peut être présente à différents niveaux d la de l mémoire é i : problème blè de d cohérence hé et de d propagation i des modifications. Les lignes de caches sont organisées en ensembles à l’intérieur du cache, la taille de ces ensembles est constante et est appelée le degré d’associativité 54 Organisation des caches Direct Map : chaque adresse mémoire est associée à une li ligne de d cache h déterminée dé i é (degré d’associativité = 1). Fully associative : chaque adresse mémoire correspond à n’importe quelle ligne de cache. cache k way associative : chaque adresse a une alternative de k lignes. La mémoire est divisé en ensembles. 55 Effet des paramètres des caches sur les performances • • • • Cache plus grand ☺ réduit les « cache miss », augmente le temps d’accès. Plus grand degré d’associativité ☺ réduit les conflits de cache, peut augmenter le temps d’accès. Le prefetching consiste à anticiper les données et les instructions dont le processeur aura besoin, et ainsi les précharger depuis la hiérarchie mémoire (le L2 ou la mémoire centrale). Différents type de prefetching : mécanisme hardware de préchargement, mécanisme software de préchargement, mécanisme é i mixte. i t Le prefetching n’est pas gratuit, il consomme de la 56 bande passante qui est une ressource critique. L communications Les i ti en interne i t 57 Communications CPU-mémoire Xeon N thb id Northbridge Opteron H Hypertransport t t Nehalem N h l QuickPath 58 Communications CPU-Mémoire Exemple du Nehalem avec le QuickPathInterconnect : L contrôleur Le ôl mémoire é i est intégré au CPU. Exemple : calcul de la bande passante mémoire locale sur un noeud bi bi-sockets sockets Intel Nehalem BP vers mémoire locale au CPU : 3 canaux 64 bits vers mém. DDR3 1066 MHz, soit 3*1066*8 3 1066 8 = 25.6Go/s. Un processeur peut également adresser la mémoire connecté à un autre processeur NUMA (Non Uniform Memory Access) Bande Passante vers mémoire d’un autre CPU : le Q QPI à une bande passante p de 6.4 GT /s par lien, unité de transfert de 16 bits, soit 12.8 Go/s dans chaque sens, soit une bande passante de 25.6 Go/s (par lien bi-directionnel). 59 Communications CPU-CPU Hypertransport H t t (HT), (HT) solution l ti AMD liaison li i point i t à point i t Connexion haut débit, bidirectionnel, à faible latence. Les processeurs sont reliés entre eux via un lien HT à 2 GHz en HT 2.0 (passage à 2.6 GHz en HT 3). Limite de la bande passante sur HT (V3 en 2.6 GHz) : 20.8 Go/s dans chaque direction soit 41.6 en FD. QuickPath Interconnect (QPI), solution Intel Remplace le FSB sur l’architecture Nehalem, Nehalem similaire à l’HT. l’HT Le principal intérêt du bus QPI provient de sa topologie point à ppoint : le bus connectant les processeurs p aux autres composants p n’est plus partagé. Jusqu’à 32 Go/s sur un lien bi-directionnel. 60 Communications CPU-IO Bus PCI-X B PCI X Evolution du bus PCI, préserve la compatibilité. Interconnect parallèle. Interface entre le bus processeur et le bus d’entrées/sorties. Bus 64 bits, Fréquence jusqu’à 533 MHz. Bus série full duplex PCI PCI-Express Express Utilise une interface série (1 bit donc) à base de lignes bidirectionnelles. En version 2, chaque lien série fonctionne à 250 Mo/s d dans chaque h di i Le bus direction. b PCI-Express peut être construit i en multipliant le nombre de lignes => débits de 250 Mo/s à 8 Gos/s. Limite de la bande passante sur PCI-X 133 : 64 bits 133 MHz = 1064 Mo/s Limite de la bande passante sur PCI-Express PCI Express (en V2 : 250 Mo/s par canal) : 2X : 0.5 Go/s 4X : 1 Go/s 32X : 8 Go/s 61 Les architectures multi-coeurs La version originale de la loi de Moore dit que le nombre de transistors des circuits intégrés double tous les deux ans. Que faire de tous ces transistors ? une complexité sur l’«out of order» accrue mais montre ses limites d caches des h de d plus l en plus l grands d (mais ( i limitent li i la l vitesse i d’accès d aux données), d ) + de CPUs. Un processeur composéé d’au U d’ moins i 2 unités i é centrales l de d calcul l l sur une même puce. Permet dd’augmenter augmenter la puissance de calcul sans augmenter la fréquence d’horloge. Et donc réduire la dissipation thermique. Et augmenter la densité : les coeurs sont sur le même support, la connectique reliant le processeur à la carte mère ne change pas par rapport à un mono mono-cœur cœur La course à la fréquence est terminée ! 62 Intel Harpe ertown Exemples de processeurs multicoeurs 63 Pourquoi les multicoeurs ? 64 Architecture c ec u e des caches cac es 65 Partage des caches L2 et L3 Partage du cache L2 (ou L3) : ☺ communications pplus rapides p entre coeurs, ☺ meilleure utilisation de l’espace, ☺ migration des threads plus facile entre les coeurs, contention au niveau de la bande passante et des caches (partage de l’espace), P dde partage Pas t entre t les l caches h : ☺ pas de contention, communication/migration i ti / i ti plus l coûteuse, ût passage systématique par la mémoire. p g Power6,, Intel Nehalem cache L2 pprivé,, cache L3 partagé:IBM tout privé : le Montecito 66 L’architecture Nehalem 4 cores 3 niveaux de cache Cache L1 : 32k I-cache + 32k D-cache C h L2 : 256 k par core Cache L3 partagé 8 Mo on-chip, Cache inclusif : cohérence de cache onchip core core core core SMT 732 M transistors, 1 puce de 263 mm2 8 Mo L3 shared cache QuickPathInterconnect Q Memory Link controller Point à Point controller 2 liens par socket CPU 1 pour la connexion à ll’autre autre socket 2 Quickpath 3 DDR3 1 pour la connexion au chipset Interconnect Jusqu’à 6.4 GT/Sec dans chaque direction Channels QuickPath Memory controller (DDR3) intégré Bande passante mémoire crête 25.6 GB/s 67 GPU : Graphic Processor Unit Performance théorique GeForce 8800GTX vs Intel Core 2 Duo 3.0 GHz : 367 Gflops / 32 GFlops. Bande passante mémoire : 86.4 GB/s / 8.4 GB/s. P é t dans Présents d tous t les l PC : un marché hé de d masse. Adapté au massivement parallèle (milliers de threads par application). pp ) Jusqu’à récemment, uniquement programmable via des APIs graphiques. • Aujourd’hui, des modèles de programmation disponibles : CUDA (Compute Unified Device Architecture). 68 Architecture de PC classique Motherboard CPU System y Memory y Bus Port (PCI, AGP, PCIe) Graphic Board Vidéo Memory GPU 69 Exemple : Geforce 8800 128 Unités de calcul ! 8 partitions de 16 70 Architecture Geforce 8800 Architecture de type SIMD (Single Instruction Multiple Data). Data) Peut être vu comme une grosse unité de calcul divisée en multiprocesseurs. Ch Chaque multiprocesseurs lti estt composéé de plusieurs Stream Processors. SIMD un même programme (kernel) exécuté plusieurs fois simultanément. Chaque exécution = 1 thread (élément de base). base) Threads groupés en warps (32 threads) à l’intérieur de blocs (64 à 512 threads) ; les 32 threads du warp sont exécutées en parallèles. Les threads dd’un un bloc peuvent coopérer mais les blocs peuvent ss’exécuter exécuter indépendamment les unsdes autres. Ces blocs sont réunis dans des grilles. 71 Dans un futur proche 72 Conclusion sur les architectures actuelles Vers une augmentation V t ti du d nombre b de d coeurs plutôt l tôt que de d la l fréquence d’horloge : problème de finesse de gravure, d’échauffement . Programmation de plus en plus complexe : Nécessité d’une bonne connaissance des architectures, notamment au niveau de la mémoire Plus de croissance des performances au niveau du coeur parallélisation obligatoire pour un gain de performance. Nécessité d’élaborer des algorithmes et des programmes capables d’exploiter un grand nombre de processeurs. processeurs Nécessité d’exploiter le parallélisme aux # niveaux de hardware Programmation sur des architectures hybrides avec différents types de processeurs. Exploitation des performances des processeurs graphiques : produire un code extrêmement parallélisé, capable dd’utiliser utiliser TOUS les "threads", sinon on atteint que quelques % de la puissance disponible. 73 Réseau de communication • Les processeurs ou les machines peuvent être reliés de différentes façons • Les caractéristiques importantes : – La L bande b d passante t (bandwidth) (b d idth) estt le l débit maximal i l – Latence : temps d’initialisation de la communication – Distance maximum entre deux noeuds • Différents types d’interconnexion: – – – – Bus Switch crossbar Hypercube Tree 74 Réseau de communication Bus Hypercube Chaque proc est le Sommet d’un d un hypercube de dim n Arbre Réseau à plusieurs étages 75 Réseau de communication exemple de la réduction d’une variable Calcul de X1 + X2 + X3 + …+ X8 sur une architecture hypercube • Implémentation naïve n communications X1+ X2 +…+X8 X8 cpu8 X7 X1+X2+X3 … X3 X1+X2 X2 X1 cpu2 cpu1 76 Réduction dd’une une variable X4 1 X8 X7 2 1 X6 1 X3 2 X2 3 1 X1 X5 Log n étapes de communications 77 Modèles de programmation parallèle 78 Modèles de programmation parallèle • Modèle à mémoire partagée • « threads » • Passage de messages • Parallélisme de données • Modèle hybride Ces modèles existent au dessus du hardware et des architectures mémoire et peuvent théoriquement être implémentés sur n’importe quel hardware. Les + implémentés : MPI (passage de messages) sur architectures distribuées et hybrides (mais souvent aussi sur architecture à mémoire partagée) OpenMP (mémoire partagée) sur architecture à mémoire ppartagée g 79 Modèle à mémoire partagée • Les tâches partagent un espace d’adressage commun, dans lequel elles lisent et écrivent de façon asynchrone • # mécanismes tels locks (verrous), sémaphores sont utilisés pour l’accès à la mémoire partagée • L’avantage du point de vue de l’utilisateur est qu’il n’y a pas la notion de « propriétaire d’une donnée », il n’a pas à décrire explicitement les communications • Mais attention, la localité des données a une impacte sur les l performances f mais i n’est ’ pas facile f il à gérer é 80 Threads • Dans ce modèle, modèle un unique processus peut initier plusieurs tâches concurrentes, appelées threads • Chaque thread a sa mémoire locale, mais partage également la mémoire globale du processus • Les threads communiquent q entre elles via cette mémoire globale g principal p p est pprésent durant toute • Le pprogramme l’exécution, alors qu’une thread peut apparaître puis disparaître et réapparaître. 81 Threads Exécutable x=2 Zone séquentielle y=3 call sub1 Zone parallèle call sub2 Initialisation de 2 threads A(i)=x*fn(i) call ll sub3 b3 print A Un exemple : T1 T2 tem mps T3 Implémentation des threads : • une librairie de routines qui peuvent être appelées dans le code source // • des d directives di i de d compilation il i 82 Modèle Passage de Messages • Un ensemble de tâches qui utilisent leur mémoire locale, plusieurs de ces tâches pouvant être sur une même ou sur plusieurs machines • Ces tâches échangent des données via des communications i i de d messages (send/receive) ( d/ i ) • Un transfert de données requiert en général une coopération é ti entre t les l 2 tâches, tâ h les l opérations é ti sontt spécifiées par le programmeur 83 Modèle Passage g de Messages g Machine 1 Machine 2 T ki Task Task j Send (x) Receive(x) A un envoi doit correspondre une réception Le programmeur doit spécifier les opérations de façon explicite Implémentation : librairie de routines auxquelles le programmeur peut faire appel dans son code Ex : PVM (le standard jusqu’en 92), MPI (le standard actuel) Versions domaine public : MPICH, LAM/MPI, OpenMPI, MVAPICH 84 Modèle passage de messages - MPI • Si les l communications i i sont entre 2 tâches â h sur 2 machines #, elles passent par le réseau • Si les communications sont entre 2 tâches sur une même machine, les implémentations de MPI choisissent en général de les faire passer par la mémoire partagée (copies mémoire) pour des raisons de performance 85 Modèle « Data Parallel » • • • Un ensemble de tâches travaillent collectivement sur une même structure de données, chaque tâche effectue la même opération mais sur une partie différente de la structure Sur machine à mémoire partagée, peuvent accéder à la Do i=1,10 Do i=11,20 Do i=21,30 Do i=31,40 toutes les tâches p structure de données via la mémoire A(i)=fn(i) A(i)=fn(i) A(i)=fn(i) A(i)=fn(i) Enddo Enddo Enddo Enddo globale Sur machine à mémoire distribuée, la structure t t estt «éclatée» é l té en # blocs bl quii sont stockés dans la mémoire locale de chaque tâche. 86 Modèle « Data Parallel » • Un programme data parallel est souvent écrit en utilisant des constructions spécifiques dites « data parallel », et/ou des p directives de compilation • Ex : – Fortan90 Fortan90, Fortan95 – HPF (High Performance Fortran) : extension du fortran90 pour le parallélisme de données 87 Modèles hybrides • Ils sont basés sur l’utilisation combinée de pplusieurs des modèles précédents p – Typiquement la combinaison du modèle Message g Passingg avec MPI et du modèle des threads ou du modèle mémoire partagée avec OpenMP. Ce modèle peut être intéressant sur une architecture type cluster de multiprocesseurs. 88 Modèle PGAS (Partitioned Global Address Space) Idéalement, un modèle parallèle doit fournir : la performance La localité des données La simplicité de programmation La facilité de référencement des données Modèle PGAS : un espace d’adressage d’ d global l b l le process n’a “d’affinité” qu’avec les composantes locales de structures distribuées. Le compilateur introduit des communications pour résoudre les références distantes des communications “one-sided” (pas d’intervention du process distant) le support pour des structures de données distribuées 89 Ex : UPC (Unified Parallel C) Du point de vue utilisateur : Un ensemble de thread opérant dans un espace d’adressage global, logiquement partitionné entre les threads. Chaque thread a une affinité avec une portion de l’espace d’adressage globalement partagé. Ch Chaque thread h d a également é l un espace privé. i é Th d 0 Thread Th d 1 Thread Thread Th d 2 Th d 3 Thread partagé Privé 0 Privé 1 Privé 2 Privé 3 90 Conception de programmes parallèles 91 Coût dd’un un programme parallèle • Loi d’Amdhal Speedup max ? Soit S la fraction séquentielle du programme, programme P la fraction qui peut être parallélisée P=1-S N le nombre de processeurs Soit t le temps d’exécution en séquentiel (temps du prog. // sur 1 proc) En théorie, le temps minimum en parallèle est (S + (1-S)/N)*t Speedup maximum = 1 1-S + S N Speedup linéaire 92 Coût dd’un un programme parallèle Mais en pratique les algorithmes des versions séquentielle et parallèle peuvent être différents L’accélération parallèle peut être calculée à partir • du temps d’exécution du prog. // sur 1 proc. • d’un d’ ttemps d’exécution d’ é ti uniprocesseur i de d référence éfé De plus, le calcul du coût théorique (par analyse de complexité) peut difficilement prendre en compte les spécificités des architectures D’où D où parfois, en pratique, des accélérations surlinéaires : • Sur des architectures hybrides distribuée/partagée lorsque la taille du problème excède la capacité de la mémoire locale • Lorsque Lorsq e l’algorithme parallèle est plus pl s efficace 93 Coût dd’un un programme parallèle Influence du coût de communication sur l’accélération Supposons la fraction séquentielle S=0 aalors o s Tséq = Tcalcul Tpar Tséq Tpar Tcomm Tcalcul Tcalcul = + Tcomm N = Tcalcul Tcalcul + Tcomm N = N 1 + N Tcomm Tcalcul Est un paramètre important 94 Conception de programmes parallèles • Vérifier dd’abord abord si un code // nn’est est pas déjà disponible pour ce problème, dans une bibliothèque // Sinon : • Bien comprendre le problème à résoudre en parallèle parallèle. Si on démarre à partir d’un code séquentiel, il faut bien comprendre le code • Déterminer si le problème peut réellement être parallélisé • Identifier les parties coûteuses en temps de calcul • Identifier les opérations qui interdisent la parallélisation (par ex dépendance de données) • Rechercher des algorithmes éventuellement mieux adaptés à la parallélisation, événtuellement restructurer le code 95 Décomposition p ou Partitionnement • Une des premières étapes est de décomposer le problème blè en parties i approximativement i i de d même ê taille ill qui seront distribuées sur différentes tâches • 2 méthodes éth d pour dé décomposer ett affecter ff t à ≠ tâches tâ h // : Décomposition de domaine : les données associées au pb sont décomposées Décomposition fonctionnelle : le problème est décomposé en fonction du travail à effectuer, effectuer chaque tâche exécute une portion de la totalité du travail. Le choix de la méthode est dicté par ll’application application. 96 Décomposition de domaine • Ce modèle sera d’autant plus efficace que le rapport : (taille des sous-domaine/taille des frontières) est grand ( l l / communications) (calculs i i ) 1D block 1D cyclic 2D Bloc,* 2D 97 Décomposition fonctionnelle • Ce modèle est adaptée p aux problèmes p qui q peuvent se découper naturellement en # tâches Ensemble d’instructions du problème Tâche 1 Tâche 2 Tâche 3 Tâche 4 98 Communications 2 cas de d fi figure : • Les tâches travaillent indépendamment les unes des autres, avec très peu de communications entre tâches : le problème est dit «embarrassingly parallel » • Les tâches ont des données à échanger, D un surcoût si les comm. comm ne peuvent être masquées par les calculs D des synchronisations entre tâches Temps de communication de B octets = α + B β Où α temps de latence et β temps de transfert d’1 octet Trop de petites communications D domination des temps de latence (en général α >> β) La solution : concaténer les petits messages pour envoyer de plus gros paquets et améliorer ainsi les performances Définir les structures de communication et les algos appropriés 99 Communications synchrones/asynchrones • Les communications synchrones requièrent un « handshake » entre tâches qui échangent les données. Elles sont dites bloquantes. • Les comm. asynchrones y sont non bloquantes. q Une tâche ne sera pas bloquée sur l’instruction de comm,, elle ppeut continuer à traiter les instructions suivantes pendant que la comm. s’effectue. 100 Communications point à point/collectives • Point à point – une tâche agit en tant que émetteur/producteur de données, et l’autre en tant que récepteur/consommateur. • Collective – met en jjeu le partage p g de données entre plusieurs tâches (plus que 2), qui sont p comme étant membres d’un souvent spécifiées groupe. Des exemples classiques : broadcast, ggather, reduction, scatter 101 Communications collectives 102 Répartition p de la charge g • Notion de load balancing : consiste à distribuer le travail de façon à ce que toutes les tâches soient occupées tout le temps • Quelques règles pour s’en approcher : – Pour des opérations sur des tableaux où toutes les tâches effectuent un travail similaire Distribuer des ens. de données de façons uniformes – Pour des itérations de boucles où les itérations sont similaires, Répartir de façon uniforme les itérations entre tâches – Lorsque le travail de chaque tâche est variable et imprédictible p dynamique y q du travail Utiliser une répartition 103 G Granularité l ité • Grain fin Peu de calcul entre les communications F ilit le Facilite l load l d balancing b l i Risque de surcoût dû aux comm. et aux synchros • Gros G grain i Beaucoup de calculs entre 2 comm. Plus simple d’améliorer les performances Plus difficile d’améliorer le load balancing 104 Entrées / Sorties parallèles • Des systèmes de fichiers // : GPFS, PVFS , Lustre, CxFS, GFS, P FS PanFS • Une couche logicielle s’interfaçant entre le programme parallèle et le système de fichiers : BPFS (Basic Parallel File System) • Une interface de programmation d’entrées/sorties // dans MPI 2 • Travailler sur des zones partagées ? – Confiner les comms au niveau de la tâche 1 puis utiliser des comms parallèles pour propager les données aux autres tâches – Sur les architectures distribuées, souvent plus efficace de travailler dans des zones locales aux nœuds (scratch local au nœud) – Créer C é des d noms de d fichiers fi hi uniques i pour chaque h tâche. â h 105 Coût d’une application // en temps humain h i • En ggénéral,, l’application pp pparallèle est pplus complexe p que l’appli. séquentielle correspondante. p des # étapes p du • Son coût se mesure en tenant compte cycle de développement – – – – – Conception Codage Déboguage T i Tuning Maintenance 106 Portabilité • Des standards de programmation : MPI, HPF, Threads Posix, OpenMP p • Les systèmes et les hardware peuvent jouer sur la portabilité Scalabilité • Généralement, des limites intrinsèques à l’algorithme • Le hardware joue un rôle important (débit bus mémoire-cpu sur SMP, débit réseau de comm., taille mémoire, é i vitesse it d’horloge d’h l du d proc., …)) 107 Ressources nécessaires au code // par rapport au code séq. • + de cpus • Souvent + de mémoire pour la duplication des données • Sur des exécutions de courte durée, durée la version // peut être plus lente que la version séq (surcoût associé à la mise en œuvre de séq. l’environnement //) 108 Exemple 1 f (i j) fn(i,j) do j=1,n do i=1,n ( ,j) = fn(i,j) ( ,j) A(i,j) end do end do Solution parallèle: do j=mystart,myend do i=1,n A(i,j) = fn(i,j) end do end do Problème « Embarrasingly // » Distribution par bloc-colonne (J fortran, données rangées par colonne) tâche1 tâche2 … tâche n 109 Exemple 1 (suite) Implémentation 1 (modèle SPMD) : if (I am a master) Initialize the array sendd eachh worker k its it j_first, j fi t j_end j d send each worker its portion of the array Else receive from master myj_first, myj_end do j=myj j=myj_first,myj_end first myj end do i=1,n Répartition statique du travail A(i,j) = fn(i,j) end do Efficace si toutes les tâches ont la même end do quantité de travail et les processeurs sont send master results de même rapidité et sont identiquement end if chargés 110 Exemple 1 (suite) Implémentation 2 (schéma « pool de tâches ») : if (I am a master) do until no more jobs send to worker next job receive results from the worker end do tell worker no more jobs else if i am worker do until no more jobs Répartition dynamique du travail receive from master next job Granularité très fine calculate A(i,j) = fn(i,j) D plus l de d communications i i send results to master D La portion de travail « optimale » end do dépend du problème end if 111 Références • http://computing.llnl.gov • http://www.realworldtech.com htt // l ldt h • http://www.ncsa.illinois.edu/UserInfo/Traini ng ncsa (national center for supercomputing) • http://www.irisa.fr/ORAP (organisation associative pour le parallélisme) • http://calcul.math.cnrs.fr • http://www.idris.fr • http://www.cines.fr htt // i f 112