Cours 1

publicité
Parallélisme Cours 1 TD : 20% -­‐ TP : 30% -­‐ Examen : 50% Feuille A4 manuscrite (pas de photocopie) [email protected] (prendre rdv par mail pr le contacter) A quoi sert le parallélisme ? Augmenter la performance, traiter plus de choses. Soit parallélisme et distribution. Pb classique : recherche max dans un tableau, tri (quicksort, mergesort, et tri bitonique), distribution de données (où, comment, communication entre machine des données). Vocabulaire : -­‐ Quand plusieurs taches sont exécutées les unes à la suite des autres, on parle d’exécution séquentielle. -­‐ Quand plusieurs taches sont exécutées simultanément, on parle d’exécution parallèle. -­‐ On parle de concurrence quand plusieurs taches indépendantes voient leur exécution progresser. On parle de parallélisme au niveau hardware (matériel), et de concurrence au niveau logiciel (software). I.
Hardware Architecture pour le parallélisme : Il y a deux composantes au problème : augmentation de données ou d’instruction. On va prendre les machines parallélismes et les classer en performance pour données ou instructions. Classification de Flynn (1966): Single Instruction Multiple Instruction Single Data SISD MISD CPU mono-­‐coeur Pipeline Multiple Data SIMD MIMD GPU, processeur vectoriel) (Plusieurs ordinateurs, multicoeur, GPU) Pipeline (MISD): Economise les instructions en mémoire car le processeur pour travailler à besoin de charger les données et les instructions. Il ne charge les instructions qu’une fois, même si 50 données rentrent. d1, d2, d3 i1 i2 i3 SIMD : Exécute la même instruction pour toutes les données, en lockstep. (à vérif.) Lockstep : tout le monde s’exécute au même temps. d1, d2, d3, …., dn i1 i1 i1 i1 Les i1 sont des unités de calcul. Jeu d’instruction vectoriel bas niveau : MMX/SSE, Altivec. De l’ordre de O(1) Défaut de la classification de Flynn : on ne se demande pas où se trouve les données. Soit les données sont centralisés, soit éparpillés sur les machines. Mémoire partagée : Les données et instructions sont localisées dans une unique zone mémoire accessible par toutes les unités de calcul. Shared Memory Soit : a = a + 1 Mémoire distribuée : Les instructions et données ne sont pas dans une unique zone. Les unités de calcul doivent pouvoir communiquer pour s’échanger les données. Private / Distributed Mémory Soit : a <-­‐ fetch (m, a) (récupère la valeur a sur une machine m) a <-­‐ a + 1 push (m, a) Pb on ne sait pas quelle valeur de a vont avoir les autres machines, a ou a + 1 ? C’est contextuel car on ne sait quelle valeur veux utiliser la machine. Strict consistency : tout le monde a la bonne valeur de a. Eventuel consistency : tout le monde aura la bonne valeur de a, dans un temps indéterminé, si on laisse le système tourner assez longtemps (un nombre d’étape par exemple). Ex : Facebook accès à des instructions sur les pages des autres. Processeur vectoriel : les données sont prises en un bloc, plus on a de donnée plus on augmente les unités de calcul. Pourquoi on n’a pas rendu les processeurs plus performants, pourquoi on a sorti du multicoeur ? Par manque de place. Tout les processeurs des machines multicoeur ont leur mémoire cache privé, qui donne sur une mémoire cache plus grande, et ainsi de suite jusqu’à celle de la machine (hiérarchie). Pb : un processeur a donc une mémoire partagée et une mémoire privé. On en revient à notre précèdent problème. Pour le résoudre : -­‐ 1ere technique, le processeur 2 va voir dans le cache du processeur 1 (pour 2 processeurs). -­‐ 2ieme technique, propagation de la valeur dès la modification dans la hiérarchie des caches. Machines parallèles : Qu’on soit en mémoire partagé ou privé, comment communique-­‐t-­‐il ? Dans les machines MIMD : interconnexion. 1. Par un bus, reliant les machines ensembles avec la mémoire partagée. è avantage : pas cher è désavantage : perte du bus, pas d’accès parallèle (utilisation du bus une machine à la fois [collision lorsque plusieurs machines communique en même temps sur le bus]), taille limité du bus (le signal doit être envoyé jusqu’au bout puis revenir pour pouvoir être écouté) Pour résoudre ce manque d’accès parallèle, on fait un tirage au sort d’un numéro pour pouvoir parler. On utilise l’exponential de Bachoff. Mais lorsqu’il y a beaucoup de monde, il y a un problème, car il n’y a pas de passage à l’échelle. Schéma : Si on a n machine, on a 20% de chance de communiquer. Exponential Bachoff : on commence en [0, n], si il y a 2 même numéro tiré au sort, on augmente [0, 2n], etc. 2. Lien dédié : O(n2). Impraticable avec beaucoup de machine (fils) 3. Routeur : 0(nlogn) 4. Matrice interconnexion pb les connexions ne peuvent pas s’entrecouper. 5. Ethernet → pb : 24 port. On peut relier les Switch entre eux, mais le temps de communication de processeur relié à des Switch diffèrent est long. De plus le câblage est long, et parfois inutile, si certaines machines n’ont aucun besoin de communiquer. Utilité du parallélisme : le meilleur algorithme pour un cas particulier d’architecture de machine. débit Latence Ethernet 100 Mb/s 50 𝜇 s 1Gb/s 10Gb/s infinibande 40Gb/s 5 𝜇 s II.
Software Niveau de langage (Bas → proche machine) Haut niveau : java, python, ruby Modèle de programmation : Open MP, MPI, Map/Reduce, Bag of Task, Machine à Tri (modèle théorique), PRAM (modèle théorique). Bas niveau: assembleur, c Outils : Threads, Spin-­‐lock, Mutex, Sémaphore, Moniteur Sémaphore : Thread1 Thread2 input : a 1,2,3 1. x = a 1,2,3 2. x = x + 1 a == 3 3. a = x 1 si a = 1, alors a = 2. 1,2,3 2,3 a == 2 On voudrais une exécution atomique : personne ne peut arrêter l’exécution (ici 1,2,3) Section critique (SC) : Un ensemble d’un bloc de code qui ne peut être exécuté que par un seul thread à la fois. Propriété d’une solution pour implémenter une SC : -­‐ exclusion mutuelle : pas plus d’un thread en SC -­‐ pas de blocage infini : si aucun thread en section critique et au moins un en attente, alors il rentrera dans un temps fini en SC -­‐ équité (absence de famine) -­‐ code identique Sémaphore de dijkstra : -­‐ valeur -­‐ P( ) -­‐ V( ) P(Sémaphore : s) { V(Sémaphore : s){ Si (s.val <= 0){ s.val = s.val + 1 bloquer thread réveiller thread en attente } } Sinon s.val = s.val -­‐ 1 } Attention : le sémaphore doit être implémenté par le système d’exploitation (pour empêcher 2 thread de l’exécuter). Egalement, les CPU modernes ont une instruction atomique, le Test-­‐and-­‐Set, qui exécute et modifie la valeur en une fois. 
Téléchargement