Algorithmique parallèle 1.Modèle parallèle. 1. Définitions de bases. 2. Description de modèles. 3. Comparaison des puissances des modèles. Définition Machine parallèle: ensemble de processeurs qui sont capables de coopérer afin de résoudre un problème. Ceci inclut: – les super ordinateurs parallèles (milliers de processeurs). • connection Machine-5: 32 à 65536 nœuds • Cray T3E : 128 à 2048 nœuds • Top 500 : http://www.top500.org – les grappes (ou clusters). Machines Parallèles • Mémoires – Partagée. – ou distribuée. • Types de commutation (communications de circuits, de paquets, wormhole) • Mode synchrone ou asynchrone. Comment évaluer les algorithmes ? • Temps d’exécution (Tp ): Différence entre le moment où le premier processeur commence de l’algorithme et le moment où le dernier processeur termine. Tp= max j (Tcalculs j +Tcoms j +T attente ) Comment évaluer les algorithmes ? • Facteur d’accélération (speed up) Ap: rapport entre le temps d’exécution de l’algorithme séquentiel optimal Ts et le temps d’exécution de l’algorithme parallèle sur p processeurs. • Efficacité: rapport entre le facteur d’accélération et le nombre de processeurs Comment évaluer les algorithmes ? • Le travail (work) Wp : Wp = p* Tp. Temps exécution Optimal si la surface du rectangle vaut T s p Nombre de processeurs 1.2 Description des modèles Modèle P-RAM • P-RAM: Parallel Random Access Machine. – Mémoire centrale partagée. – Nombre non borné de processeurs – Taille de la mémoire infinie. Comment accéder à la mémoire? P-RAM: gestion de la mémoire • CREW (Concurrent Read Exclusive Write) – Nombre non borné de lectures simultanées. – Écriture d’un SEUL processeur dans une case mémoire. • EREW (Exclusive Read Exclusive Write) – Modèle restrictif mais proche des machines réels. CRCW (Concurrent Read Concurrent Write) • Accès lecture: plusieurs processeurs simultanément. • Accès écriture: plusieurs processeurs simultanément. – Mode consistant: tous les processeurs doivent écrire la même valeur. – Mode arbitraire: valeur du dernier processeur qui écrit. – Mode fusion: valeur obtenue par une fonction appliquée aux différentes valeurs écrites. Exemple: somme préfixe Définition: – Entrée: table A de n = 2k éléments – Sortie: table B de n = 2k éléments tel que i B[i]=Σj=1 A[j] Exemple: Tableau : 1 Résultat: 3 2 7 1 4 6 13 Algorithme sur une P-RAM (EREW). •Algorithme récursif: Donnée: Résultat: A = 1 A’ = 2 3 3 4 7 5 6 11 7 8 15 de A : X 3 X 10 X 21 X 36 de A’: 3 10 21 36 Algorithme sur une P-RAM (EREW). Donnée: Résultat: A = 1 A’ = 2 3 3 4 7 5 6 11 7 8 15 de A : 1 3 6 10 15 21 28 36 de A’: 10 3 21 36 Formalisation de l’algorithme Entrée: table A de n = 2 kéléments i A[j] Sortie: table B de n = 2 kéléments tel que B[i]=Σ j=1 Pour tout i=1 à n en parallèle faire C[0,i] := A[i] Pour tout (j=1; j < log n; j++) faire Pour tout i=1 à n/2 j en parallèle faire C[j,i] := C[j-1,2i-1]+ C[j-1,2i] Pour tout (j=log n; 1 <=j ; j--) faire Pour tout i=1 à n/2 j en parallèle faire B[j-1,2i] := C[j,i] B[j-1,2i+1] := C[j,i]+C[j-1,2i+1] B[j-1,1] := C[j-1,1] Remarque sur l’algorithme • Pour tout i=α à β en parallèle faire instructions... – Les instructions sont faites en parallèle pour toutes les valeurs i allant de α à β. • Évaluation de l’algorithme: – Chaque boucle prend un temps O(1). – Temps: O(log n). Autre exemple: calcul du rang. Définition: – Entrée: une liste chaînée de taille n – Sortie: tableau d tel que d[i] vaut la distance entre l’élément i et la fin de la chaîne. 0 si next[i]=nil d[i]= d[next[i]] +1 si next[i]=nil Algorithme P-RAM CRCW /* phase d’initialisation */ Pour tout i=1 à n en parallèle faire Si next[i] = nil alors d[i] := 0 sinon d[i] := 1 /* phase de calcul */ Pour toute étape=1 à log n faire Pour tout i=1 à n en parallèle faire si next[i]=nil alors d[i] := d[i] +d[next[i]] next[i]:= next[next[i]] Modèle CGM • • • • Ensemble de p processeurs interconnectés par un réseau. Mémoire locale: taille =O(n/p) où n taille du problème. Algorithme = une séquence de super-étapes. Une super-étape : – Calculs locaux – Temps de communication. – Synchronisation. Modèle CGM: algorithme en deux phases. 1. Phase de calcul local sur les données locales. Utilisation de l’algorithme optimal en séquentiel 2. Phase d’échange de données: redistribution. Envoi et réception des données de taille O(n/p) Algorithme: somme parallèle. P(2) P(2) P(3) Donnée: 1 2 3 4 5 6 7 8 Algo seq 1 3 6 4 9 15 7 15 24 Envoi Résultat: 6 1 3 9 6 + 15 =21 6 10 15 21 28 36 45 Formalisation de l’algorithme Entrée: tableau T de n/p éléments. Sortie: somme préfixe effectué sur les éléments de T. • Pour tout (j=2; j <= n/p ; j++) faire somme préfixe locale sur T • Envoyer T(n/p) aux processeurs num+1,num+2,…,p • Recevoir les valeurs des processeurs 1,2,…,num-1 et les mettre dans aux [1], aux[2],…,aux[num-1] • Pour tout (i=2; j <num ; i++) faire somme préfixe locale sur aux • Pour tout (i=1; j <= n/p ; i++) faire T[i]:=T[i]+aux[num-1] Évaluation de l’algorithme. • Coût de la phase séquentiel : O(n/p) • Coût de la communication globale: – Coût du tri globale de O(n) données de p processeurs noté Tg • Coût global: O(n/p) +Tg 1.3 Comparaison des puissances des modèles Notion: Puissance des modèles. • Question : une P-RAM CRCW est-elle plus puissante qu’une P-RAM CREW ? • Plus précisément, Peut-on trouver un algorithme tel que, pour un même nombre de processeurs, on obtienne avec une PRAM CRCW un temps d’exécution qu’il est impossible d’atteindre pour une P-RAM CREW ? • Oui, en considérant le problème de la recherche d’un maximum d’un tableau. Calcul du maximum d’un tableau A. • Algorithme en temps constant – sur une P-RAM CRCW en mode consistant. – avec O(n 2 ) processeurs. Pour tout i=1 à n en parallèle faire m[i] := true Pour tout i,j=1 à n en parallèle faire Si A[i] < A[j] alors m[i] := false Pour tout i=1 à n en parallèle faire Si m[i] = TRUE alors max :=A[i] O(1) O(1) O(1) Et sur une P-RAM en mode CREW? • Dans ce modèle on ne peut pas fusionner une liste de n éléments en moins de O(log n) étapes. • Coût de l’algorithme: O(log n) étapes. Pour tout i=1 à n en parallèle faire m[i] := TRUE Pour tout i,j=1 à n en parallèle faire Si A[i] < A[j] alors m[i] := TRUE Pour tout i=1 à n en parallèle faire Si m[i] = TRUE alors max :=A[i] O(1) O(1) O(log n) Séparation des modèles CREW et EREW. • • Problème: déterminer si un élément e se trouve dans un ensemble de n éléments distincts. Coût de l’algorithme optimale – pour une P-RAM CREW (n processeurs) Temps constant – pour une P-RAM EREW (n processeurs) O(log n) étapes Théorème sur les puissances. • Théorème: Tout algorithme sur une machine P-RAM CRCW à p processeurs ne peut pas plus de O(log p) fois plus rapide que le meilleur algorithme P-RAM EREW. • Idée de la preuve: – Un pas d’un algorithme P-RAM CRCW à p processeurs peut être simuler en O(log p) pas d’un algorithme P-RAM EREW. Récapitulatif. Tout algorithme sur une machine P-RAM CRCW à p processeurs ne peut pas plus de O(log n) fois plus rapide que le meilleur algorithme P-RAM CREW. Même résultat: • pour les machines CREW et EREW. • pour les machines CRCW et EREW. Théorème de Brent Soit A un algorithme – comportant un nombre total m d’opérations, – qui s’exécute en temps t, – sur une P-RAM avec un nombre indéterminé de processeurs, Alors on peut simuler A en temps O(m/p + t) sur une P-RAM avec p processeurs. Application du théorème de Brent • Prédire les performances si nbre de processeurs diminue. • Par exemple :calcul du max sur P-RAM EREW Pour tout i=log n à 0 faire k Pour tout j=0 à 2 -1 en parallèle faire A[j]= max(A[2j],A[2j+1]) • Temps : O(log n) avec n processeurs. • Temps : O(n/p + log n) avec p processeurs. • Temps : O(log n) avec n/log n processeurs. 2.Tri parallèle. 1. Réseau de tri. 2. Algorithme de tri dans le modèle CREW. Cours inspiré d’un chapitre du livre Introduction to algorithms de Cormen, Leiserson et Rivest. 2.1 Réseau de tri. Introduction: Réseau de tri • Modèle de calcul plus réaliste. Liste non triée Réseau de tri liste triée • Architecture dépendant du nombre d’éléments à trier. • Réseau de fusion pair-impaire, réseau bitonique. Réseau de tri • Réseaux composés de comparateurs et d’échangeurs : a min(a,b) b max(a,b) Réseau de tri-fusion • Simplification: trier des listes de n=2 k éléments. Algorithme de tri sur une suite (c1 ,c2 ,…,cn ) – trier(c1 ,c2 ,…,cn/2 ) et trier(cn/2+1,cn/2+2,…,cn ) en //. – Fusionner les deux listes triées. • Construction des réseaux TRIER(k) et FUSION(k) à partir des réseaux TRIER(k-1) et FUSION(k-1). Réseau de tri-fusion de petite taille. • Réseau de TRI(0) a(1) a(2) • Réseau TRI(1) TRI(0) • Réseau FUSION(1) a(1) b(1) a(2) b(2) a(1) a(2) b(1) b(2) FUSION(1) Construction du réseau fusion de deux listes de même taille et déjà triées. a(1) a(2) a(3) a(4) d(1) d(2) d(3) d(4) a(2i-1) a(2i) d(i+1) b(1) b(2) b(3) b(4) e(1) e(2) e(3) e(4) c(4) c(5) : FUSION(m) b(2i-1) b(2i) c(1) c(2) c(3) e(i) : c(2i) c(2i+1) FUSION(m+1) Construction du réseau tri. TRI(n-1) FUSION(n) TRI(n)= TRI(n-1) Coût du réseau tri-fusion • Pour un réseau de taille n=2m , • Temps = O(log n 2 ) 2 • Nombre de comparateur = O(nlog n ) • Travail = O(nlog n 4) Tri par transposition pair-impair Réseau formé de lignes de comparateurs a min(a,b) b max(a,b) Réseau de tri de taille n=2p Description : p copies de 2 lignes • Ligne 1: p comparateurs • Ligne 2: p-1 comparateurs prenant en entrée p-1 paires de fils 2i et 2i+1, 1 i p-1 • #de comparateurs =n(n-1)/2 8 7 6 5 4 3 2 1 Exemple: 7 8 5 6 3 4 1 2 7 5 8 3 6 1 4 2 5 7 3 8 1 6 2 4 5 3 7 1 8 2 6 4 3 5 1 7 2 8 4 6 3 5 2 7 4 8 6 1 3 2 5 4 7 6 8 1 3 5 6 7 8 1 2 4 Min Réalise-t-il un tri? Min Min Oui, car: • Parcours du minimum – Étape 1:0 ou 1 déplacement vers la gauche. – Chaque étape: 1 déplacement vers la gauche. Min Min Min Min Min A Réalise-t-il un tri? Oui, car: • Parcours du « 2ieme élément » – Étape 1: 0 ou 1 vers la gauche, 1 vers la droite lors de la rencontre du min. – Chaque étape : 1 déplacement vers la gauche. – Sauf deux, 0 déplacement lors de la comparaison entre lui et le min. • Évaluation du parcours. A Min A A A Coût du réseau tri pair-impair • Pour un réseau de taille n=2m , • Temps de calcul= O(n) • Nombre de comparateur = O(n(n-1)/2 ) • Travail = O(n 3 ) Tri pair-impair sur un réseau linéaire de processeurs. • p processeurs, n éléments à trier. • n divisible par p (simplification) • Adaptation du précédent réseau de tri sur un un réseau linéaire. 1.Tri local en parallèle sur les p processeurs O(n logn/p) 2. p étapes d’échange alternées entre deux processeurs voisin selon le réseau de tri pair-impair. Mais chaque processeur envoi n/p données Exemple: 5 processeurs, 15 données Init 8,7,0 15,2,24 19,1,22 11,9,3 6,12,13 tri 0,7,8 2,15,24 1,19,22 3,911, 6,12,13 impaire 0,2,7 8,15,24 1,3,9 11,19,22 6,12,13 paire 0,2,7 1,3,8 9,15,24 6,11,12 13,19,22 impaire 0,1,2, 3,7,8 6,9,11 12,15,24 13,19,22 paire 0,1,2, 3,6,7, 8,9,11 12,13,15 19,22,24 Coût • • Coût_calcul(Tri local) = O(n log n/p) Coût_calcul(échange)=O(p*n/p)=O(n) • • Temps de calcul = O(n log n/p +n) Travail = O(n (p +log n)) 2.2 Algorithme de tri dans le modèle CREW. Principe de l’algorithme de Cole 12345678 Fusion 3 5678 1234 Fusion 2 78 56 34 12 Fusion 1 8 7 6 5 4 3 2 1 Algorithme de Cole • basé sur l’algorithme de tri-fusion séquentiel de complexité O(n log n) . • de complexité O(log n) sur un machine PRAM de n processeurs. • avec n le nombre d’éléments à trier. Partie délicate: la fusion. • Manipulation de suites d’entiers. • Définition: – Un entier x est entre a et b si a <x b. – Rang d’un élément de x dans une suite L: rang(x,L)=card {j L, j <x} – Rang croisé de A dans B: R[A,B](e)=rang(e,B) Exemple: • J =[ 2, 3, 7, 8, 10, 14, 15, 17, 18, 21 ] • L=[ 5, 10, 12, 17 ] • On obtient Rang(5, J ) = 2, rang(10, J ) = 4, Rang(12, J ) =4, rang(17, J ) = 7 R[ L, J ]=[ 2, 4, 4, 7 ] Échantillonnage • Une suite L est un bon échantillonnage (BE) d’ une suite J si pour tout k 1 éléments consécutifs arbitraires de {-} L {+}, il y a au plus 2k+1 éléments de J. • Exemple: – J=[ 2, 3, 7, 8, 10, 14, 15, 17, 18, 21 ], L=[ 5, 10, 12, 17 ] – L est un BE de J car pour k=1, il y a au plus 3 éléments de J entre (-,5), (5,10), (10,12), (12,17), (17,-), pour k=2,…. Fusion_assistée(J,K,L) 1. Partitionner J et K en |L|+1 sous-ensembles J(i) et K(i) tel que, 1 i |L|+1 1. J(i)={j J, l i-1< j l i } 2. K(i)={k k, li-1< k li } Exemple: J =[ 2, 3, 7, 8, 10, 14, 15, 17, 18, 21 ] L=[ 5, 10, 12, 17 ] J(1)=[ 2, 3 ], J(2)=[ 7, 8, 10 ], J(3)=, J(4)=[ 14, 15, 17 ], J(5)=[ 18, 21 ] Fusion_assistée(J,K,L) 1. Partitionner J et K en |L|+1 sous-ensembles J(i) et K(i) tel que, 1 i |L|+1 1. J(i)={j J, l i-1< j l i } 2. K(i)={k k, li-1< k li } 2. Fusionner en parallèle les sous-ensembles. Pour tout i, 1 i |L|+1 faire en // res i:= Fusion(J(i),K(i)) Exemple: J =[ 2, 3, 7, 8, 10, 14, 15, 17, 18, 21 ] K=[ 1, 4, 6, 9, 11, 12, 13, 16, 19, 20] L=[ 5, 10, 12, 17 ] • L est 1 un BE de J et de K. J(1)=[2,3] K(1)=[1,4] res1 =Fusion([2,3], [1,4] ) =[1,2,3,4], J(2)=[7,8,10] K(2)=[6,9] res2 =Fusion([7,8,10], [6,9] ) =[7,8,9,10], J(3)=, K(3)=[11,12] res 3 =Fusion(, [11,12] ) =[11,12], J(4)=[14,15,17], K(4)= [13,16] res =Fusion([14,15,17], [13,16] ) 4 =[13,14,15,16,17], J(5)=[18,21], K(5)=[19,20] res5 =Fusion([18,21], [19,20]) Fusion_assistée(J,K,L) 1. Partitionner J et K en |L|+1 sous-ensembles J(i) et K(i) tel que, 1 i |L|+1 1. J(i)={j J, l i-1< j l i } 2. K(i)={k k, li-1< k li } 2. Fusionner en parallèle les sous-ensembles. Pour tout i, 1 i |L|+1 faire en // res i:= Fusion(J(i),K(i)) 3. Concaténer les résultats partiels. J|K :=res1 res 2…res |L|+1 Évaluation du coût des trois étapes de la fonction Fusion_assistée(J,K,L). • En supposant qu’on connaît R[L, J], R[L, K], R[J, L], R[K, L] , les trois étapes se font en temps constant. Évaluation du coût. 1. Partitionner J et K en |L|+1 sous-ensembles J(i) et K(i) tel que, 1 i |L|+1 1. J(i)={j J, l i-1< j l i } 2. K(i)={k k, li-1< k li } Partition de J (ou de K): |J| processeurs. • j J, P(j) lit rang(j,L)(=r) O(1) insère j dans J(r) Évaluation du coût. 2. Fusionner en parallèle les sous-ensembles. Pour tout i, 1 i |L|+1 faire en // res i:= Fusion(J(i),K(i)) Coût: O(1). Évaluation du coût. 3. Concaténer les résultats partiels. J|K :=res1 res2…res|L|+1 – Concaténation: Hypothèse: connaissance R[L,J], R[L,K] – Chaque élément l iL a un processeur responsable P(li )de lui. rang(li ,J|K)=rang(li ,J) +rang(li ,K) ; range les éléments de resi à partir du rang rang(li-1 ,J|K)+1. Évaluation du coût des trois étapes de la fonction Fusion_assistée(J,K,L). • En supposant qu’on connaît R[L, J], R[L, K], R[J, L], R[K, L] , les trois étapes se font en temps constant, avec |J|+|K|+|L| processeurs sur une P-RAM CREW. Algorithme globale. • Simplification: n est une puissance de 2. • Basé sur l’arbre binaire de «tri». 12345678 5678 78 8 1234 56 7 6 34 5 4 12 3 2 1 Au top 0, tous les nœuds stockent une liste sauf les feuilles qui stockent leur élément. Initialisation: 8 7 6 5 4 3 2 1 Algorithme global. • Au top 0, phase initialisation. • Opération d’un nœud au top t+1, – Recevoir X(t+1) et Y(t+1) de ses fils. – val(t+1) = Fusion_assistée(X(t), Y(t),val(t)) • Envoyer à son père Z(t+1) ={z4 , z8 , z12 ,….} où val(t+1)= {z1 , z2 , z3 ,…,zn } Déroulement de l’algorithme. • Dès qu’un nœud a reçu toute sa liste au top t alors, il envoi, à son père, – d’un élément sur 4 de val(t+1) au top t+1, – d’un élément sur 2 de val(t+1) au top t+2, – envoi de val(t+1) au top t+3. • Et au top t+4, il ne fait plus rien…. Exemple du déroulement l’algorithme de Cole Vision locale de l’algorithme sur ce nœud 0 Au top 0, les feuilles ont des listes triées de taille 2 Au top 1, ne rien faire Au top 2, ne rien faire val (3) Au top 3, val (3)= Fusion_assistée([8],[7],) 8 8 7 7 6 5 4 3 2 1 Exemple du déroulement l’algorithme de Cole Au top 3, calculer la Fusion_assistée([X],[X],) 78 56 8 8 7 6 7 6 34 5 5 12 4 4 3 3 2 2 1 1 Vision locale de l’algorithme sur ce nœud Au top 4, ne rien faire Au top Au top 5, 5, il reçoit [8] et [6] + val(5) =Fusion_assistée([8],[6],) 8 6 56 78 8 7 6 34 5 4 12 3 2 1 Vision locale de l’algorithme sur ce nœud Au top 4, ne rien faire Au top Au top 5, 5, il reçoit [8] et [6] + val(5) =Fusion_assistée([8],[6],) val(5)=[6,8] 6,8 8 6 56 78 8 7 6 34 5 4 12 3 2 1 Vision locale de l’algorithme sur ce nœud Au top 4, ne rien faire Au top 5, il reçoit [8] et [6] + val(5) =Fusion_assistée([8],[6],) Au top 6, il reçoit [7,8] et [5,6] 6,8 7, 8 5,6 56 78 8 7 6 34 5 4 12 3 2 1 Remarque • val(5) =Fusion_assistée([8],[6],) =[6,8] • val(5) est un bon échantillonnage de [7,8],[5,6]. Vision locale de l’algorithme sur ce nœud Au top 4, ne rien faire Au top 5, il reçoit [8] et [6] + val(5) =Fusion_assistée([8],[6],) Au top 6, il reçoit [7,8] et [5,6] 6,8 7, 8 5,6 56 78 8 7 6 34 5 4 12 3 2 1 Vision locale de l’algorithme sur ce nœud Au top 4, ne rien faire Au top 5, il reçoit [8] et [6] + val(5) =Fusion_assistée([8],[6],) Au top 6, il reçoit [7,8] et [5,6] + val(6) =Fusion_assistée([7,8],[5,6],val(5)) [5,6,7,8] 7, 8 5,6 78 56 8 7 6 34 5 4 12 3 2 1 Après le top 6, chaque nœud de niveau 3 a calculé sa propre liste. [5,6,7,8] 78 8 [1,2,3,4] 56 7 6 34 5 4 12 3 2 1 Au top 7, il reçoit 8 et 4. Au top 8, il reçoit [6,8] et [2,4] Au top 9, il reçoit [5,6,7,8] et [1,2,3,4]. puis plus rien…. Vision locale de l’algorithme sur ce nœud [5,6,7,8] 78 8 [1,2,3,4] 56 7 6 34 5 4 12 3 2 1 Au top 7, il reçoit 8 et 4, val(7)= Fusion_assistée([8],[4],) = [4,8] [8] [5,6,7,8] [4] [1,2,3,4] Au top 7, il reçoit 8 et 4, val(7) = [4,8] Au top Au top 8, 8, il reçoit [6,8] et [2,4] val(8)= Fusion_assistée([6,8],[2,4],val(7)) = [2,4,6,8] [4,8] [6,8] [5,6,7,8] [2,4] [1,2,3,4] Au top 7, il reçoit 8 et 4, val(7) = [4,8] Au top 8, il reçoit [6,8] et [2,4], val(8)= [2,4,6,8] Au top 9, il reçoit [5,6,7,8] et [1,2,3,4] val(9) = Fusion_assistée([5,6,7,8] , [1,2,3,4],val(8)) = [1,2,3,4, 5,6,7,8] [2,4,6,8] [5,6,7,8] [5,6,7,8] [1,2,3,4] [1,2,3,4] Au top 7, il reçoit 8 et 4, val(7) = [4,8] Au top 8, il reçoit [6,8] et [2,4], val(8)= [2,4,6,8] Au top 9, il reçoit [5,6,7,8] et [1,2,3,4] val(9) = Fusion_assistée([5,6,7,8] , [1,2,3,4],val(8)) = [1,2,3,4, 5,6,7,8] [1,2, 3,4,5,6,7,8] [5,6,7,8] [1,2,3,4] Au top 8, val(8)= [2,4,6,8], val(8)= [2,4,6,8], Au top 9, envoi [8] et [16] 16 [10,12,14,16] 8 [2,4,6,8] Au top 8, val(8)= [2,4,6,8], val(8)= [2,4,6,8], Au top 9, envoi [8] et [16] val(9) = Fusion_assistée([8],[16],) =[8,16] val(9) =[9,10,11,12,13,14,15,16] val(9)=[1,2,3,4, 5,6,7,8] 8,16 [9,10,11,12,13,14,15,16] [1,2,3,4, 5,6,7,8] Au top 8, val(8)= [2,4,6,8], val(8)= [2,4,6,8], Au top 9, envoi [8] et [16] val(9) = Fusion_assistée([8],[16],) =[8,16] val(9) =[9,10,11,12,13,14,15,16] val(9)=[1,2,3,4, 5,6,7,8] Au top 10, envoi [4,8] et [12,16] val(10) = Fusion_assistée([4,8],[12,16],[8,16]) =[4,8,12,16] 8,16 [4,8,12,16] 12,16 [9,10,11,12,13,14,15,16] 4,8 [1,2,3,4, 5,6,7,8] Algorithme global. • Au top 0, phase initialisation. • Opération d’un nœud au top t+1, – Recevoir X(t+1) et Y(t+1) de ses fils. – val(t+1) = Fusion_assistée(X(t), Y(t),val(t)) • Envoyer à son père Z(t+1) ={z4 , z8 , z12 ,….} où val(t+1)= {z1 , z2 , z3 ,…,zn } Déroulement de l’algorithme. • Dès qu’un nœud a reçu toute sa liste au top t alors, il envoi, à son père, – d’un élément sur 4 de val(t+1) au top t+1, – d’un élément sur 2 de val(t+1) au top t+2, – envoi de val(t+1) au top t+3. • Et au top t+4, il ne fait plus rien…. Coût • L’arbre fonctionne O(log n) avec O(n) processeurs. Un sommet du niveau k reçoit tous les 2 k éléments de sa liste au top t=3k : 3 tops à ses fils pour envoyer toutes leurs données à son père. Calcul du processeurs = – chaque nœud de l’arbre binaire a lu une fusion_assistée k k – Niveau k, n/2 nœuds, taille de la liste= 2 . – # de processeurs: O(2 k* n/2k ) =O(n). Coût • L’arbre fonctionne O(log n) avec O(n) processeurs. • Temps séquentiel = O(n log n) • Facteur d’accélération= O(n). • Efficacité =1 4. Ordonnancement 1. Définition de bases. 2. Problème d’ordonnancements classiques 3. Ordonnancement avec les communications. 4.1 Définition de bases. Graphe de tâches: Exemple. • Résoudre le système linéaire: Ax=b – Avec A= • Pour chaque i=1 à n faire x(i) =b(i)/a(i,i) Pour chaque j=i+1 à n faire b(i) =b(i) - x(i)*a(j,i) tâche T(i,i) tâche T(i,j) Remarque (1/2). • Pour chaque i=1 à n faire x(i) =b(i)/a(i,i) Pour chaque j=i+1 à n faire b(i) =b(i) - x(i)*a(j,i) • T < T’ : la tâche T doit s’effectuer avant T’. • T(1,1) < T(1,2) < …< T(1,n) <T(2,2)<…<T(n,n) Remarque (2/2). • Pour chaque i=1 à n faire x(i) =b(i)/a(i,i) Pour chaque j=i+1 à n faire b(i) =b(i) - x(i)*a(j,i) • T(1,1) < T(1,2) < …< T(1,n) <T(2,2)<…<T(n,n) • Chaque tâche T a un ensemble de variables d’entrée In(T), et de sortie Out(T). • Ex: In(T(i,i))={b(i),a(i,i)}, Out(T(i,i))={x(i)} . In(T(i,j))={b(j),a(j,i),x(i)}, Out(T(i,j))={b(i)}. Graphe de tâches: Définition. • Un graphe (ou système) de tâches est un graphe orienté G=(V,E,w) où – V: ensemble fini de tâches. – E: contraintes de précédence entre les tâches. – w: V correspond à la durée de la tâche. Retour à l’exemple. T(1,1) T(1,2) T(1,3) T(1,4) T(1,5) T(2,3) T(2,4) T(2,5) T(3,4) T(3,5) T(2,2) T(3,3) T(4,4) T(4,5) T(5,5) Définitions • Soit G=(V,E,w) d’un graphe de tâches, Sommets d’entrée Sommets de sortie v Prédécesseurs Successeurs Ordonnancement: définition • Un ordonnancement d’un graphe de tâches G=(V,E,w) est une fonction de V telle que, pour tout arc [u,v] E dans G, on a (u)+ w(u) (v). (respect des contraintes de dépendances) Conséquence: Soit G=(V,E,w) d’un graphe de tâches, il existe un ordonnancement dans G si et seulement si G est sans cycle. • Illustration: tâche 1 tâche 2 Conséquence: Soit G=(V,E,w) d’un graphe de tâches, il existe un ordonnancement dans G si et seulement si G est sans cycle. Graphe de tâches = DAG (Directed Acyclic Graph). Latence: Définition • • Soit G=(V,E,w) d’un graphe de tâches, Soit un ordonnancement pour G utilisant p processeurs (en posant p= si ressources illimitées). La latence MS(,p) (MakeSpan) de est son temps d’exécution total: MS(,p)= max {(v)+w(v)} - min ((v)) v V v V 4.2 Problème d’ordonnancements classiques Énoncé des problèmes. • • Soit G=(V,E,w) d’un graphe de tâches, Soit un ordonnancement pour G sur p processeurs (en posant p= si ressources illimitées). Pb(p): déterminer un ordonnancement de latence minimale MS(,p) sur p processeurs. Pb( ): déterminer un ordonnancement de latence minimale MS(, ) ayant des ressources illimités Remarque: • Soit G=(V,E,w) d’un graphe de tâches, • Soit un ordonnancement pour G sur p processeurs. • Soit C=(T(1),T(2),…,T(k)) un chemin dans G. • Alors, MS(, ) w(C) Paramètres de mesures. • Soit G=(V,E,w) d’un graphe de tâches, • Soit un ordonnancement pour G sur p processeurs. Seq = v V w(v) Facteur d’accélération s( ,p)=Seq/MS( ,p) Efficacité e( ,p)= s( ,p)/p 1 Résolution de Pb( ). • Soit G=(V,E,w) d’un graphe de tâches, • Pour tout sommet v, – Le niveau supérieur NS(v) est le plus grand poids d’un chemin menant d’un sommet d’entrée à v. – Le niveau inférieur NI(v) est le plus grand poids d’un chemin menant d’un sommet de sortie de v. En d’autres termes, • Soit G=(V,E,w) d’un graphe de tâches, Sommets d’entrée Sommets de sortie v Niveau supérieur NS(v) Niveau inférieur NI(v) Retour à l’exemple. T(1,1) T(1,2) T(1,3) T(1,4) T(1,5) T(2,3) T(2,4) T(2,5) T(3,4) T(3,5) T(2,2) T(3,3) NS(T(1,1))=0 NS(T(2,4))=3 NI(T(2,4))=5 T(4,4) T(4,5) T(5,5) Résolution de Pb( ). • Soit G=(V,E,w) d’un graphe de tâches, • On définit un ordonnancement ASAP tel que pour tout sommet v de V , ASAP (v)= NS(v) ASAP respecte les contraintes de précédence et est optimal. ASAP: As soon as possible. Retour à l’exemple. T(1,1) T(1,2) T(1,3) T(1,4) T(1,5) T(2,3) T(2,4) T(2,5) T(3,4) T(3,5) T(2,2) T(3,3) Poids de chaque tâche = 1 Chemin le + long: T(1,1) T(n,n) de poids 2n-1. T(4,4) T(4,5) T(5,5) Conclusion de Pb( ). • Construction d’une solution optimale de Pb( ). – calcul du paramètre NS pour chaque sommet. • Soit G=(V,E,w) un graphe de tâches, Pb( ) peut être résolu en temps O(|V| +|E|). Résolution de Pb(p). Le problème Pb(p) est NP-complet, contrairement au problème Pb( ), Recherche d’heuristiques Heuristiques gloutonnes. • Stratégie « ne pas laisser délibérément un processeur inactif » : c’est-à-dire, à chaque instant, on alloue autant de tâches que possible aux processeurs disponibles. • Cette stratégie donne de bon résultats. Retour à l’exemple: 3 processeurs T(1,1) T(1,2) T(1,3) T(1,4) T(1,5) T(2,3) T(2,4) T(2,5) T(3,4) T(3,5) T(2,2) T(3,3) T(1,1) T(1,2) T(2,3)…. T(4,4) T(4,5) T(1,3) T(2,2) T(2,4)…. T(1,4) T(1,5) T(2,5) T(3,3)….. T(5,5) Définition: tâche libre. • Soit G=(V,E,w) d’un graphe de tâches, Une tâche v V est libre au temps t si et seulement si son exécution n’a pas encore commencé et si tous ces prédécesseurs ont été exécutés au temps t. Retour à l’exemple: 3 processeurs T(1,1) T(1,2) T(1,3) T(1,4) T(1,5) T(2,3) T(2,4) T(2,5) T(3,4) T(3,5) T(2,2) T(3,3) Tâches libres T(1,1) T(1,2) T(2,3)…. T(4,4) T(4,5) T(1,3) T(2,2) T(2,4)…. T(1,4) T(1,5) T(2,5) T(3,3)….. T(5,5) Ordonnancement de listes. • Stratégie: « ne pas laisser délibérément un processeur inactif ». • à tout instant t, – si nombre de tâches libres = r – si nombre de processeurs disponibles = q, Alors au temps t, min(r,q) tâches libres débutent leur exécution. Ordonnancement de listes. 1. Initialisation: 1. Calculer les priorités de toutes les tâches. 2. Construire une file de priorité des tâches libres triées en ordre de priorité décroissant. 3. Temps courant t=0. 2. tant qu’il reste des tâches à exécuter… 1. Réactualiser la file des tâches libres. 2. S’il y a q processeurs libres, et r tâches libres, exécuter les min(r,q) premières tâches libres (et les supprimer dans la file des tâches libres). 3. Incrémenter t. Garantir des performances. • Soit G=(V,E,w) d’un graphe de tâches, • Soit un ordonnancement de listes. • Soit MSopt ( ,p) la latence d’ordonnancement optimal pour G sur p processeurs, • alors MS( ,p) (2-1/p)MSopt( ,p) Remarque: p*MS(,p)=Idle +Seq Seq= v Vw(v) Idle=temps inactif. actif P(1) P(2) P(3) P(4) Remarque • Pour tout ordonnancement , p*MS(,p)=Idle +Seq Avec Seq= v Vw(v) Idle=temps inactif. • Seq p * MSopt (p) Remarque: • Pourquoi T(1) n’a-t-il pas été exécuté avant ? Car l’éxécution de la tâche T(2) n’est pas finie. Ainsi de suite avec la tâche T(2), T(3)… T(6) T(4) T(7) T(1) P(1) P(2) actif P(3) P(4) T(5) T(3) T(2) Remarque: • Pourquoi T(1) n’a-t-il pas été exécuté avant ? Car l’éxécution de la tâche T(2) n’est pas finie. Ainsi de suite avec la tâche T(2), T(3)… • Par récurrence, on obtient un chemin de dépendance à partir de T(1) : C=T(1),T(2), T(3),…,T(r) • L’inactivité de certains processeurs peut se produire pendant l’exécution de ces r tâches. Idle r (p-1) j=1w(T(j)) (p-1) w(C) Remarque 1. Pour tout ordonnancement , p*MS(,p)=Idle +Seq Avec Seq= v Vw(v) Idle=temps inactif. 2. Seq p * MS opt(p) 3. Il existe un chemin C dans G Idle (p-1) w(C). 4. Donc p*MS(,p) (p+p-1)* MS opt(p) Garantir des performances. • Soit G=(V,E,w) d’un graphe de tâches, • Soit un ordonnancement de listes. • Soit MSopt ( ,p) la latence d’ordonnancement optimal pour G sur p processeurs, • Alors, MS( ,p) (2-1/p)MSopt( ,p) Ordonnancement basé sur le chemin critique. • Principe sur l’ordonnancement de listes. •Principe : l’ordre de priorité dépend de la valeur du niveau inférieur de la tâche + NS(T) est grand, + T est prioritaire. Ordonnancement basé sur le chemin critique. 3 T(1) T(2) T(4) tâche poids Chemin 3 T(5) 4 2 T(3) 3 4 T(6) 1 6 T(7) T(8) T(1) T(2) T(3) T(4) T(5) T(6) T(7) T(8) 3 3 2 6 1 7 3 3 4 4 4 3 3 3 6 6 T(3) T(8) Ordonnancement de liste : T(2) T(7) T(5) T(1) Ordonnancement optimal: T(4) T(6) T(3) T(6) T(2) T(5) T(7) T(4) T(1) T(8) T(1) T(2) T(3) T(4) T(5) T(6) T(7) T(8) poids Chemin 3 3 2 6 1 7 3 3 4 4 4 3 3 3 6 6 4.3. Ordonnancement avec communications Graphe de tâches avec communications. • Un graphe (ou système) de tâches avec communication est un DAG G=(V,E,w,c) où – – – – V: ensemble fini de tâches. E: contraintes de précédence entre les tâches. w: V correspond à la durée de la tâche. c: E : coût de communication. Ordonnancement: définition • Un ordonnancement d’un graphe de tâches G=(V,E,w,c) doit préserver les dépendances: – pour tout arc [u,v] E dans G, (u)+ w(u) (v) si u,v s’exécute sur le même processeur. (u)+ w(u) +c(u,v) (v) sinon Ordonnancement avec communications Pb(p): déterminer un ordonnancement de latence minimale MS(,p) sur p processeurs. Pb( ): déterminer un ordonnancement de latence minimale MS(, ) ayant des ressources illimités. Les deux problèmes sont des problèmes NP-complet. Exemple: énoncé 1 5 1 T(1) 1 T(3) 5 4 T(2) T(4) 2 2 1 1,5 T(6) 1 T(7) XX: coût de communication. XX: durée d’une tâche 1 3 T(5) 1,5 2 1 1 T(1) 5 T(3) 5 1 3 4 T(2) T(4) 2 1 1,5 2 T(5) T(6) 2 1,5 1 T(7) 1 Solution optimale : T(3) P(2) T(4) T(1) T(7) T(5) T(6) T(2) P(1) 0 1 2 3 4 5 6 7 8 9 Heuristiques de liste pour Pb(p) • Version naïve du chemin critique. Principe : l’ordre de priorité dépend de la valeur du niveau inférieur de la tâche. Mais comment calculer le niveau inférieur ? • Version du chemin critique modifié. Version naïve du chemin critique (CP). • Principe : l’ordre de priorité dépend de la valeur du niveau inférieur de la tâche. • Calcul du niveau inférieur : en supposant que toutes les tâches vont être affectées sur des processeurs différentes. Retour à d’exemple. 5 T(1) 1 1 T(3) 5 3 4 T(2) T(5) 2 1 T(4) 2 2 1 T(7) Chemin critique 1,5 T(6) 1 tâche 1 1,5 T(1) T(2) T(3) T(4) T(5) T(6) T(7) 14 8 11,5 6,5 6,5 3 1 Version du chemin critique modifié (MCP). • Principe: allouer une tâche libre au processeur qui permet de débuter son exécution au plus tôt, en fonction de précédentes affectations. • Application sur l’exemple. Comment comparer les deux heuristiques? • En utilisant des exemples: – Meilleur résultat pour CP que pour MCP. T(1) 5 5 T(2) 3 2 T(4) 1 6 T(3) 3 Comment comparer les deux heuristiques? • Fork Graph : – CP : 2w+c – MCP: 2w+c si w>c 3w si w<c w T(2) T(1) w c c T(3) w • Join Graph : – Même solution : 2w+c – Non optimal pour w<c T(2) c c T(1)w w T(3) Comparaison des heuristiques. • Théorique: garantir l’heuristique avec un facteur d’approximation. • Expérimentale : générer des graphes aléatoires de tâches. • Étude de cas: optimaliser pour certains types de graphes.