Algorithmes parallèles auto-adaptatifs et applications Daouda TRAORÉ Directeurs de thèse Jean-Louis ROCH & Denis TRYSTRAM Projet MOAIS Laboratoire d’Informatique de Grenoble (UMR 5217), France Vendredi 19 Décembre 2008 Motivations Evolution des machines parallèles: de machines avec processeurs identiques vers: Grilles de calcul => ressources hétérogènes et dynamiques Systèmes multi-processus (Processeurs multi-cœurs, SMP, MPsoc) applications concurrentes sur une même unité => les cœurs apparaissent comme de vitesses variables Processeurs graphiques : GPUs + CPUs => hétérogénéité, fréquences et opérations différentes Questions: Est-ce qu’un algorithme parallèle peut fonctionner dans ce contexte? Avec quelles garanties de performance ? Sous quelles hypothèses? Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 2/52 Evolution de la programmation parallèle Initialement: processeurs identiques (MPI) Aujourd’hui: Interfaces de haut-niveau permettant d’abstraire l’architecture. Grille Multi-coeurs, SMP GPU Cuda Google MapReduce OpenMP, Cilk++, intel TBB Athapascan/Kaapi Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 3/52 Objectif de la thèse Construction d’algorithmes parallèles adaptatifs S’adaptent à la plate-forme d’exécution - Inconscients du nombre de processeurs (en anglais, processor oblivious) Adaptation à la charge de la plate-forme Avec des garanties d’efficacité - Temps d’exécution si possible optimal p/r aux ressources (dynamiquement) allouées Définition (algorithme auto-adaptatif) Un algorithme auto-adaptatif est un algorithme qui est capable de changer automatiquement son comportement en fonction de son contexte d‘exécution (données manipulées, plate-forme d’exécution, occupation des processeurs, …). • Contexte: LIG / EP INRIA Moais: Thème sur la conception d’algorithmes adaptatifs [Roch&al gzip2001, TSI2005,...] Master ROCO D. Traoré 2005 : un algorithme de préfixe adaptatif (mais clairvoyant…) Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 4/52 Plan du mémoire et contributions 1. Introduction 2. Programmation parallèle 3. Algorithmes parallèles adaptatifs[définitions] 4. Un algorithme adaptatif pour le calcul parallèle des préfixes 5. Algorithmes adaptatifs de tri parallèle 6. Schéma générique des algorithmes parallèles adaptatifs 7. Application du schéma à la librairie standard STL 8. Conclusion et perspectives [objectifs et contributions, organisation] [notions] CARI’06] Daouda Traoré [EUROPAR’06, [RENPAR’08] [PDP’08, EUROPAR’08] [EUROPAR’08, MSAS’08] Algorithmes parallèles auto-adaptatifs et applications 5/52 Plan de la présentation Algorithmes pour processeurs identiques: illustration sur le calcul parallèle des préfixes Ordonnancement par vol de travail Schéma générique adaptatif Algorithme adaptatif pour le calcul parallèle des Préfixes Application du schéma à la STL Conclusion et perspectives Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 6/52 Algorithmes pour processeurs identiques: illustration sur le calcul parallèle des préfixes Calcul des préfixes – Entrée : x0, x1, …, xn – Sortie : p0, p1, ..., pn i avec p i = xi k =0 Applications : parallélisation de boucles, additions modulaires [Blelloch’89] Algorithme séquentiel : for(p[0]=x[0], i=1; i <= n; i++) p[i]=p[i-1]*x[i]; // n opérations Borne inférieure sur p processeurs identiques : Parallélisation optimale sur p processeurs identiques [Snir’86, Nicolau-Wang’96] Daouda Traoré 2n p 1 [Fich’83] Algorithmes parallèles auto-adaptatifs et applications 7/52 Algorithmes pour processeurs identiques: illustration sur le calcul parallèle des préfixes Un nouvel algorithme optimal pour le calcul des préfixes [chap. 3, pages 27-36] - Soit s et q le quotient et le reste de la division de n+1 par p+1: n+1 = s(p+1) + q Division du tableau initial en p+1 blocs de taille éventuellement différentes p+1 blocs p-q+1 blocs s+1 Daouda Traoré … q-1 blocs s+1 s+2 … s+2 Algorithmes parallèles auto-adaptatifs et applications s-p+1 8/52 Algorithmes pour processeurs identiques: illustration sur le calcul parallèle des préfixes Algorithme statique en p+1 blocs … s+1 p-1 s+1 … s+2 s+2 1 p-1 étapes p-1 1 … … p-1 s+1-p Daouda Traoré s+1-p s+2-p 1 s+2-p Algorithmes parallèles auto-adaptatifs et applications s+1-p 9/52 Algorithmes pour processeurs identiques: illustration sur le calcul parallèle des préfixes Analyse théorique du temps d’exécution de l’algorithme proposé Théorème [chap. 3, page 30] Si 0 ≤ q ≤ 1 et (p+3)/2 ≤ q ≤ p, alors le temps d’exécution de l’algorithme (optimal) sur p processeurs identiques vérifie 2n Tp = p 1 Théorème [chap. 3, pages 31 et 32] Si 2 ≤ q ≤ (p+3)/2, alors le temps d’exécution de l’algorithme à 1 de l’optimal sur p processeurs identiques vérifie 2n Tp = 1 p 1 et le nombre d’opérations vérifie : 2np Wp = p 1 Remarque: Une variante donne un temps toujours optimal, mais n’a pas été programmée Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 10/52 Algorithmes pour processeurs identiques: illustration sur le calcul parallèle des préfixes Machine AMD Opteron 4 processeurs 2,6 accélération 2,4 2,2 n grand, temps d’une opération très petit (temps d’addition de deux implantation "algo proposé" implantation "NicolauWang" borne inférieure 2 1,8 1,6 Doubles par exemple). Dans l’algorithme de Nicolau-Wang On a 2n/(p+1) synchronisations 1,4 1,2 1 n=21 n=141 n=261 n=381 n=421 1 processeur taille 0,14 temps 0,12 n petit, temps d’une opération assez élevé 0,1 implantation "algo proposé" implantation "NicolauWang" implantation "séquentielle" 0,08 0,06 0,04 0,02 0 n=100001 10000001 taille Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 11/52 Algorithmes pour processeurs identiques: illustration sur le calcul parallèle des préfixes Inconvénients de la parallélisation sur des processeurs identiques Nombre d’opérations : toujours le même si les p processeurs initialement prévus pour l’exécution ne sont pas disponibles. Exemple : si on suppose que Un seul processeur exécute l’algorithme parallèle Les autres étant mobilisés pour d’autres calculs => le nombre d’opérations effectuées par un seul processeur est 2np p 1 L’algorithme optimal sur processeurs identiques n’est pas performant Si les processeurs sont de vitesses différentes (temps d’exécution final = temps d’exécution du processeur le plus lent) Si le temps de l’opération * est variable Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 12/52 Plan de la présentation Algorithmes pour processeurs identiques: illustration sur le calcul parallèle des préfixes Ordonnancement par vol de travail Schéma générique adaptatif Algorithme adaptatif pour le calcul parallèle des Préfixes Application du schéma à la STL Conclusion et perspectives Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 13/52 Ordonnancement par vol de travail Principe Suit le principe glouton : à tout instant où il existe une tâche prête non encore ordonnancée, tous les processeurs sont actifs. Algorithme distribué Chaque processeur gère localement une pile des tâches qu’il a rendues prêtes (créées, ou débloquées). steal tâches P0 P1 P2 [Blelloch’90, ], [Leiserson & Kuszmaul 2001] Lorsqu’un processeur devient inactif, il choisit (au hasard) un processeur dont la pile en cours d’exécution contient une tâche prête et lui vole une tâche (la plus ancienne, en haut de la pile (FIFO). Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 14/52 Modèle de coût associé au vol de travail (1/2) Notations • W = travail = le nombre d’opérations de l’algorithme parallèle sur 1 processeur • Tp = la durée d’exécution de l’algorithme parallèle sur p processeurs • D = la profondeur de l’algorithme parallèle (le nombre d’opérations sur T p le chemin critique) P i (t) • Pave = la vitesse moyenne des p processeurs : P ave = t=1 i=1 T.p Théorème[Arora, Blumofe, Plaxton 02, Bender, Rabin 02] Avec une grande probabilité; Le temps d’exécution Tp d’un programme utilisant l’ordonnancement par vol de travail est majoré par : W D Tp pP ave O( P ave ) Le nombre de vols (réussis ou échoués) est inférieure à O(p.D) Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 15/52 Modèle de coût associé au vol de travail (2/2) Efficacité de la parallélisation • • Wseq = travail de l’ algorithme séquentiel Wseq Tseq = temps d’exécution de l’algorithme séquentiel : Tseq = P ave Intérêt : Si W ≈ Wseq et D très petit, Tp = Tseq W D O( ) pP ave P ave p En général W ≥ c1Wseq, c1 mesure le surcoût dû à l’ordonnancement et au parallélisme. Surcoût de parallélisme Gestion des tâches : tâches empilées dans une pile Exemple : algorithme récursif, Grain fin : surcoût arithmétique (récursivité) Minimisation du surcoût d’ordonnancement Principe du travail d’abord[Frigo et al98, Roch01] Ce principe consiste à minimiser le surcoût de création de tâches de l’ordonnancement par vol de travail. Appels de création de tâches traduits en appel local de fonction séquentielle. Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 16/52 Bibliothèques implémentant le vol de travail Cilk[ Frigo et al 98] Création de tâches : spawn Synchronisation : sync Architectures cibles : mémoires partagées Athapascan/Kaapi Athapascan [Roch et al, PACT 98] : interface applicative cilk A () { x = spawn C(); y = spawn B(); sync; return (x+y); } A (Shared_w<int> res) { shared<int> x; shared<int> y; Basé sur le graphe de flot de données } Création de tâches : Fork Création de données : Shared Architectures cibles : mémoires partagées et distribuées Kaapi [Gautier et al 07] : moteur exécutif, qui supporte Athapascan Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications Fork<C>()(x); Fork<B>()(y); Fork<M>()(x, y, res); 17/52 Ordonnancement par vol de travail : limite Emulation séquentielle de l’algorithme parallèle Nombre d’opérations arithmétiques supérieur à celui de l’algorithme séquentiel Exemple : Calcul des préfixes, optimal avec n opérations ! : x0, x1, …, xn - Sortie : p0, p1, ..., pn - Entrée i avec p i = xi k =0 Un algorithme parallèle récursif (Diviser Pour Régner) : pref(n/2) pref(n/2) … final(n/2) W(n) = 2W(n/2) + n/2 = (1/2) n*log(n) => l’émulation séquentielle de l’algorithme parallèle fait plus d’opérations que l’algorithme séquentiel optimal ! Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 18/52 Plan de la présentation Algorithmes pour processeurs identiques: illustration sur le calcul parallèle des préfixes Ordonnancement par vol de travail Schéma générique adaptatif Algorithme adaptatif pour le calcul parallèle des Préfixes Application du schéma à la STL Conclusion et perspectives Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 19/52 Schéma générique adaptatif Ordonnancement par vol de travail: amélioration Principe de base [Roch&al TSI 2005] Remplacer l’émulation séquentielle de l’algorithme parallèle par un « vrai » algorithme séquentiel plus efficace. =>Utiliser le couplage de deux algorithmes : Un séquentiel: qui minimise le travail (nombre d’opérations) W Un parallèle: qui minimise la profondeur parallèle D Points clefs: À tout instant, chaque processus actif exécute un algorithme séquentiel, mais peut être volé par un processus inactif Un processus « suit » l’algorithme séquentiel (optimal) Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 20/52 Couplage adaptatif de deux algorithmes Un processeur occupé a une tâche et l’exécute avec un algorithme séquentiel Ps T0.Run_seq() Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 21/52 Couplage adaptatif de deux algorithmes Un processeur devient libre et exécute une opération d’extraction de travail chez un processeur actif sans l’interrompre. Ps T0.Run_seq() steal Pv Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 21/52 Couplage adaptatif de deux algorithmes Un processeur devient libre et exécute une opération d’extraction de travail chez un processeur actif (victime) sans l’interrompre. Ps T0.Run_seq() Pv T’0.Run_seq() Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 21/52 Couplage adaptatif de deux algorithmes La victime a fini sa tâche et préempte son voleur Ps Pv T’0.Run_seq() Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 21/52 Couplage adaptatif de deux algorithmes La victime effectue un saut (jump) sur le travail déjà fait par le voleur, le voleur finalise éventuellement ses calculs grâce aux résultats de la victime. Ps Ps T0.Run_seq() jump Pv T’0.Finalize Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 21/52 Couplage adaptatif : Amortissement des synchronisations (extraction séquentielle du travail) A la fois les processeurs victime et voleur peuvent modifier les informations sur le travail en cours de traitement Nécessité de se synchroniser ( pour la cohérence des données) Côté victime work extract_seq() { lock(); //verrouiller ws = NextWorkSeq(); unlock(); //déverrouiller return ws; } Côté voleur work extract_par() { //Micro-loop lock(); //verrouiller wv = WorkToSteal(); unlock(); //déverrouiller return wv; } Côté victime Run_seq() { While((ws= extract_seq())≠Ø) { local_run(ws) // Nano-loop } } Daouda Traoré - Si taille(ws) est petite => surcoût élévé. - Choix de taille (ws) : taille (ws) = profondeur (wrest); => travail arithmétique ≈ Wseq Algorithmes parallèles auto-adaptatifs et applications 22/52 Couplage adaptatif : Amortissement des synchronisations (extraction séquentielle du travail) Exemple : transform STL : boucle avec n calculs indépendants f1 ni=l-fi f2 alog(n1) alog(n2) l 1,4 1,2 1 Temps[s] Machine utilisée : AMD Opteron Opteron 875 2,2 Ghz, Compilateur gcc, option –O2 transform STL transform adapt 0,8 0,6 0,4 0,2 0 1,00E 1,00E 1,00E 1,00E 1,00E +05 +06 +07 +08 +09 taille Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 23/52 Schéma adaptatif : Amortissement du surcoût arithmétique Pour Certains d’algorithmes: – – Wseq n’est pas connu d’avance W > Wseq Exemple: algorithme find_if qui permet de trouver le premier élément d’une séquence vérifiant un predicat P0 P1 P2 P3 position ou se trouve l’élément Le temps séquentiel de l’algorithme est Tseq = 2 Le temps final de l’algorithme parallèle est le temps final du processeur ayant terminé le dernier. Donc T4 = 6 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 24/52 Schéma adaptatif : Amortissement du surcoût arithmétique Pour s’adapter : division dynamique du travail global en des étapes (Macro-loop [Danjean, Gillard, Guelton, Roch, Roche, PASCO’07]), avec synchronisation après chaque pas schéma de type algorithme de Floyd n_cur elts n_cur / log(n_cur) Exemple : find_if P0, P1, P2 P0, P1, P2 B1 Daouda Traoré B2 P0, P1, P2 B3 Algorithmes parallèles auto-adaptatifs et applications 25/52 Schéma adaptatif : Amortissement du surcoût arithmétique Exemple : find_if STL Comparaison avec find_if parallèle MPTL [Baertschiger 06] Machine utilisée : AMD Opteron (16 cœurs); Données : doubles; Taille tableau : 106; Position élément : 105; Temps STL : 3,60 s; Temps prédicat ≈ 36μ Accélération inférieure à 1 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 26/52 Schéma adaptatif : Amortissement du surcoût arithmétique Exemple : find_if STL Accélération par rapport au temps STL en fonction de la position où se trouve l’élément 16 Machine utilisée : AMD Opteron (16 cœurs); Données : doubles; Taille tableau : 106; Temps prédicat ≈ 36μ accélération 14 12 pos=100 pos=1000 10 pos=10000 pos=100000 8 pos=500000 6 pos=1000000 accélération idéale 4 2 0 1 3 5 7 9 11 13 15 Nombre de processeurs Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 27/52 Schéma adaptatif : Analyse théorique Trois niveaux de boucles utilisés dans l’algorithme du du schéma nano-loop => limite le surcoût de synchronisation micro-loop => permet le vol de travail et la préemption macro-loop => limite le surcoût arithmétique Analyse de la complexité de l’algorithme du schéma Théorème [chap. 6, pages 89 et 90] Si le temps parallèle d’exécution d’un algorithme sur un nombre infini de processeurs fait (1+)Wseq opérations avec ≥ 0, alors avec une grande probabilité, Tp Daouda Traoré 1 Wseq ( D log 2 Wseq ) p Algorithmes parallèles auto-adaptatifs et applications 28/52 Spécification et implantation du Schéma Interface C++ sur Kaapi Suit le schéma de l’algorithme adaptatif Classes à instancier : WorkAdapt, JumpWork, FinalizeWork Les fonctions à instancier : Fonctions Spécifications bool extract_seq() extrait une partie du travail local bool extract_par() appelée lors du vol (extraction du parallélisme void local_run() exécution séquentielle efficace void join(const WorkAdapt stolenwork) fusionne les résultats void jump(JumpWork* &) construit le travail à sauter void after_jump(const JumpWork* ) donne les informations sur le travail sauté bool extract_nexmacro_work() extrait la taille d’une macro-étape bool get_finalize_work (FinalizeWork*&) donne le travail à finaliser void get_main_result() retourne le résultat de la victime void get_thieft_result() retourne le résultat du voleur void must_jump() autorise le saut Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 29/52 Spécification et implantation du Schéma Interface C++ sur Kaapi Pour construire un algorithme adaptatif, l’utilisateur remplit les fonctions nécessaires Class MyWorkAdapt : public WorkAdapt { … bool extract_seq() { …. } bool extract_par() { …. } void local_run() { } void join(const WorkAdapt stolenwork) { …. } … } Lancement du moteur adaptatif sur le travail construit void MyalgoAdapt (… ) { MyWorkAdapt my_work = new MyWorkAdapt(….); adapt::run(my_work); } Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 30/52 Spécification et implantation du schéma Gestion des vols Implémentation « sans pile » du couplage séquentiel-parallèle Mais le parallélisme récursif sans surcoût peut rester géré par Kaapi avec sa pile Gestion des vols: Remplacer la pile distribuée de tâches créées par une liste distribuée de tâches volées Intérêt : peu de vols => peu de tâches insérées dans la liste; les surcoûts de création sont aussi limités. Gestion lors de la préemption : w w v11 v1 v12 v2 v11 v3 (a) avant préemption de v1 Daouda Traoré v12 v2 (b) après préemption de v1 v3 v31 v31 v12 v12 Algorithmes parallèles auto-adaptatifs et applications 31/52 Plan de la présentation Algorithmes pour processeurs identiques: illustration sur le calcul parallèle des préfixes Ordonnancement par vol de travail Schéma générique adaptatif Algorithme adaptatif pour le calcul parallèle des Préfixes Application du schéma à la STL Conclusion et perspectives Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 32/52 Algorithme adaptatif du calcul parallèle des préfixes (1/7) Calcul des préfixes – – Entrée : x0, x1, …, xn Sortie : p0, p1, ..., pn i avec p i = xi k =0 Algorithme séquentiel : for(p[0]=x[0], i=1; i <= n; i++) p[i]=p[i-1]*x[i]; // n opérations Borne inférieure sur p processeurs identiques : 2n p 1 Parallélisation optimale sur p processeurs identiques [Snir’86, Nicolau-Wang’96] [Fich’83] Ne sont pas adaptés si le temps de l’opération * varie ou si les processeurs sont à vitesse variable Parallélisation sur un nombre non borné de processeurs [Ladner-Fischer’80, LinSu’02] Peuvent être émulés par vol de travail mais effectuent plus de 2n opérations But : trouver un algorithme adaptatif qui se comporte optimalement [EUROPAR’2006, CARI’2006] Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 33/52 Algorithme adaptatif du calcul parallèle des préfixes (2/7) a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 Ps p1 p2 p3 pi=a0*…ai a4 a5 a6 ai=a4*…*ai Pv a5 a6 Pv pi=a0*…ai Ps 1ère étape de la macro-loop 1 2 3 4 5 6 7 8 temps Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 34/52 9 Algorithme adaptatif du calcul parallèle des préfixes (2/7) a1 a2 a3 a6 a7 a8 a9 a10 a11 a12 a13 Ps p1 p2 p3 pi=a0*…ai a6 p3 a4 a5 ai=a4*…*ai Pv a5 a6 Pv pi=a0*…ai Ps 1ère étape de la macro-loop 1 2 3 4 5 6 7 8 temps Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 34/52 9 Algorithme adaptatif du calcul parallèle des préfixes (2/7) a1 a2 a3 a6 a7 a8 a9 a10 a11 a12 a13 Ps p1 p2 p3 jump p6 p7 p8 p9 pi=a0*…ai a4 a5 p4 a p54 i=a10*…*ai ai=a4a*…*a i a10 a11 a12 Pv a11 a12 Pv pi=a0*…ai 1ère étape de la macro-loop Ps 2ème étape de la macro-loop 1 2 3 4 5 6 7 8 temps Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 34/52 9 Algorithme adaptatif du calcul parallèle des préfixes (2/7) a1 a2 a3 a6 a7 a8 a9 a13 Ps p1 p2 p3 jump p6 p7 p8 p9 pi=a0*…ai a12 p9 a4 a5 p4 p5 ai=a10*…*ai a10 a11 a12 Pv a11 a12 Pv pi=a0*…ai 1ère étape de la macro-loop Ps 2ème étape de la macro-loop 1 2 3 4 5 6 7 8 temps Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 34/52 9 Algorithme adaptatif du calcul parallèle des préfixes (2/7) a1 a2 a3 a6 a7 a8 a9 p1 p2 p3 jump p6 p7 p8 p9 a12 a13 jump Ps p12 p13 pi=a0*…ai T2 = 9 temps optimal = 9 a4 a5 a10 a11 p4 p5 p10 a p11 ai=a10*…*ai Pv Pv pi=a0*…ai 1ère étape de la macro-loop Daouda Traoré 2ème étape de la macro-loop Ps 3ème étape de la macro-loop Algorithmes parallèles auto-adaptatifs et applications 1 2 3 4 5 6 7 8 temps 34/52 9 Algorithme adaptatif du calcul parallèle des préfixes (3/7) Analyse théorique du temps d’exécution Théorème [chap. 4, pages 53 et 54] Le temps Tp sur p processeurs du calcul n+1 préfixes par l’algorithme adaptatif vérifie Avec une grande probabilité : Tp Daouda Traoré 2n (log 3 n) ( p 1)P ave Algorithmes parallèles auto-adaptatifs et applications 35/52 Algorithme adaptatif du calcul parallèle des préfixes (4/7): validation expérimentale Taille des données : n=3.105, temps d’une opération ≈ 1ms accélération 4,5 9 4 3,5 3 8 7 6 5 accélération optimale préfixe adaptatif 2,5 2 1,5 1 0,5 0 1 2 3 4 5 6 7 4 3 2 1 0 1 8 2 4 6 8 10 12 14 16 Nombre de processeurs Nombre de processeurs Machine Itanium-2 (8 cœurs) Daouda Traoré accélération optimale préfixe adaptatif Machine AMD Opteron (16 cœurs) Algorithmes parallèles auto-adaptatifs et applications 36/52 Algorithme adaptatif du calcul parallèle des préfixes (5/7): validation expérimentale Taille des données : n= 108, temps d’une opération = addition de deux doubles Temps d’exécution 3,5 1,8 3 1,6 2,5 prefixe statique prefixe adaptatif 2 1,5 1,4 prefixe statique prefixe adaptatif 1,2 1 0,8 1 0,6 0,5 1 2 3 4 5 6 7 8 0,4 1 2 3 4 5 6 7 8 Nombre de processeurs Machine Itanium-2 (8 cœurs) Daouda Traoré Machine AMD Opteron (16 cœurs) Algorithmes parallèles auto-adaptatifs et applications 37/52 Algorithme adaptatif du calcul parallèle des préfixes (6/7): validation expérimentale Taille des données : n= 104, temps d’une opération ≈ 2ms 45 1 1760 Mhz 2 550 Mhz 40 35 3 1100 Mhz 30 4 1650 Mhz 5 660 Mhz 6 440 Mhz 7 1320 Mhz 8 880 Mhz 9 550 Mhz 10 1760 Mhz Temps [s] fréquence processeur théorique 2Tseq ( p 1) ave temps minimum de préfixe adaptatif temps moyen de préfixe adaptatif temps maximum de préfixe adaptatif temps moyen de préfixe statique (SWARM) 25 20 15 10 5 0 1 2 3 4 10 Nombre de processeurs [Simulateur CpuBurning /Cérin] Dix Machines de fréquences différentes AMD Opteron Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 38/52 Algorithme adaptatif du calcul parallèle des préfixes (7/7): validation expérimentale Taille des données : n=5120000, temps d’une opération ≈ 1ms 5 4,5 accélération 4 Accélération théorique optimale prefixe adaptatif en distribué 3,5 3 2,5 2 1,5 1 1 2 3 4 5 6 7 Nombre de processeurs 8 8 Machines distribuées AMD Opteron [accès des données paginé via mmap] Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 39/52 Plan de la présentation Algorithmes pour processeurs identiques: illustration sur le calcul parallèle des préfixes Ordonnancement par vol de travail Schéma générique adaptatif Algorithme adaptatif pour le calcul parallèle des Préfixes Application du schéma à la STL Conclusion et perspectives Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 40/52 Applications du schéma à la librairie standard C++ La librairie STL (Standard Template Library) : Fournit : conteneurs, algorithmes, itérateurs Avantage : généricité Parallélisation de la STL PSTL (Parallel Standard Template Library) [Johnson et al 97] STAPL (Standard Adaptive Parallel Libary) [Thomas et al 88 ] MPTL (Multi-Processing Template Library) [Baertschiger 06 ] MCSTL (Multi-Core Standard Template Library) [Singler et al 07 ] Intel TBB (Thread Building Blocks) [Reinders 07] PaSTeL [Saule & Videau, RENPAR’08] KASTL (Kaapi Adaptive Standard Template Library) Implémenté sur le noyau exécutif kaapi Basé le schéma adaptatif Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 41/52 Applications du schéma à la librairie standard C++ Classification des algorithmes de la STL Classe Algorithmes implémentés Algorithmes sans fusion de résultats copy, copy_bacward, fill, fill_n, for_each, generate, generate_n, replace, replace_if, replace_copy, replace_copy_if, swap_ranges, transform Algorithmes avec fusion de résultats count, count_if, accumulate, inner_product, partial_difference Algorithmes avec terminaison anticipée find, find_if, find_end, find_first_of, adjacent_find, search_n Algorithmes avec surcoûts de parallélisme partial_sum, remove_copy_if, unique_copy Algorithmes de partition et de tri merge, stable_sort, partition, sort Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 42/52 Applications du schéma à la librairie standard C++ Algorithmes sans fusion de résultats Fonctions : extract_seq, extract_par, local_run (1) Algorithmes avec fusion de résultats Fonctions : (1) et join, jump (2) Algorithmes avec terminaison anticipée Fonctions : (2) et extract_nextmacro_work (3) Algorithmes avec surcoûts de parallélisme Fonction et classe : (3) et la classe FinalizeWork Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 43/52 Applications du schéma à la librairie standard C++: partition « Partition »: primitive de base dans un tri de type « quicksort » Soit un tableau T[0..n], et un élément quelconque appelé pivot pris dans le tableau. Le but de l’algorithme de partition est d’arriver à la situation suivante : 1. 2. T[i] < pivot pour i appartenant à [0..k[ T[i] >= pivot pour j appartenant à [k..n[ Exemple : soit T = [10, 5, 2, 8, 20, 6, 32, 3, 7 ] et pivot = 8; T_partionné = [7,5,2,3,6, 20, 32, 8,10] Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 44/52 Applications du schéma à la librairie standard C++: partition adaptative Tableau initial P1 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative Initialement P1 commence le calcul P1 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative P2 vol du travail chez P1 P1 P2 steal Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative P1 et P2 font la partition dans leurs intervalles respectifs P1 P2 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative P3 vol du travail chez P1 P1 P3 steal Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative Les trois processeurs font la partition dans leurs intervalles respectifs P1 P2 P3 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative P4 vol du travail chez P2 P2 P4 steal Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative Les quatre processeurs font la partition dans leurs intervalles respectifs P1 P2 P3 P4 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative Les quatre processeurs font la partition dans leurs intervalles respectifs P1 P2 P3 P4 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative Les quatre processeurs font la partition dans leurs intervalles respectifs P1 P2 P3 P4 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative Les quatre processeurs font la partition dans leurs intervalles respectifs P1 P2 P3 P4 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative Les quatre processeurs font la partition dans leurs intervalles respectifs P1 P2 P3 P4 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative P1 a fini sa partie droite et préempte P3 P1 P2 P3 P4 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative P1 a fini sa partie droite et préempte P3 P1 P2 P4 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative Les processeurs continuent les calculs en parallèle P1 P2 P4 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative P1 a fini sa partie droite et préempte P2 P1 P2 P4 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative P1 a fini sa partie droite et préempte P2 P1 P4 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative P1 a fini sa partie droite et préempte P4 P1 P4 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative P1 a fini sa partie droite P1 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++: partition adaptative Réarrangement des blocs non terminés P1 Réarrangement des blocs mal placés Daouda Traoré Tous les éléments qui sont dans cette partie sont supérieurs au pivot Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++ : partition adaptative Réarrangement des blocs non terminés P1 Tous les éléments qui sont dans cette partie sont inférieurs au pivot Tous les éléments qui sont dans cette partie sont supérieurs au pivot Appel à partition adaptive sur ce intervalle Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 45/52 Applications du schéma à la librairie standard C++ : validations expérimentales sort 22 Machine : Opteron (16 cœurs ) Données : Doubles Taille : 108 Temps [s] 18 sort STL sort adaptatif sort TBB 14 10 6 2 1 3 5 7 9 11 13 15 Nombre de processeurs Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 46/52 Applications du schéma à la librairie standard C++ : validation expérimentales unique_copy : supprime dans une séquence des éléments contigus égaux Exemple : 1 1 2 3 0 0 10 15 15 15 1 2 3 0 10 => 10 15 6 Machine : Opteron (16 cœurs ) Données : Doubles Taille : 108 Temps [s] 0,7 unique_cop y adaptatif unique_cop y de MCSTL 0,5 0,3 0,1 1 3 5 7 9 11 13 15 Nombre de processeurs Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 47/52 Applications du schéma à la librairie standard C++ : validation expérimentales partial_sum : identique au calcul des préfixes Machine : Opteron (16 cœurs ) Données : Doubles Taille : 3.105 Temps [s] 50 45 40 35 30 25 20 15 10 5 partial_sum adaptatif 2n/p partial_sum de TBB (grain adaptatif) partial_sum de TBB (grain=100) partial_sum de TBB (grain=1875) 2n/(p+1) 1 3 5 7 9 11 13 15 Nombre de processeurs Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 48/52 Applications du schéma à la librairie standard C++ : validations expérimentales merge 8 processeurs 6 Machine : Opteron (16 cœurs ) Données : Doubles accélération 5 4 Merge adaptatif Merge MCSTL Merge STL 3 2 1 0 1,E+05 1,E+06 1,E+07 1,E+08 taille Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 49/52 Plan de la présentation Algorithmes pour processeurs identiques: illustration sur le calcul parallèle des préfixes Ordonnancement par vol de travail Schéma générique adaptatif Algorithme adaptatif pour le calcul parallèle des Préfixes Application du schéma à la STL Conclusion et perspectives Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 50/52 Conclusion Spécification d’un schéma générique qui permet de développer des programmes parallèles adaptatifs Garanties théoriques prouvées Interface C++ sur Kaapi développée Validation expérimentales sur plusieurs exemples Calcul parallèle des préfixes Fusion de listes triées, partition, tri par fusion et tri introspectif Algorithmes de la STL : unique_copy, remove_copy_if, transform, accumulate, …. Bonnes performances expérimentales obtenues par rapport à d’autres algorithmes implantés dans d’autres librairies (MCSTL, TBB, SWARM) Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 51/52 Perspectives Optimisation de l’interface développée Supprimer les verrous : important pour un travail de petite taille Expérimenter et améliorer en contexte distribué (calcul automatique des seuils) Implémenter le schéma sur d’autres bibliothèques Comme : Cilk, Cilk++, intel Tbb Comparer les performances Avoir des algorithmes caches et processeurs inconscients (vrai pour plusieurs algorithmes (préfixe, partition, …), mais reste sort adaptatif?) Utilisation pour des applications de simulations 3D (SOFA, Everton) -> ressources hétérogènes: CPU/GPU [Soares et al 07] Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications 52/52 Daouda Traoré Algorithmes parallèles auto-adaptatifs et applications