Olivier Lemer
Dans chaque battement, un processus peut
Un signal est reçu pour déclencher un nouveau battement.
(pulse)
Un processus est prêt quand tous ses messages ont été reçus.
battement
signal
Algorithmes synchrones
Deux exemples d'algorithme synchronisé.
Un algorithme synchrone
Initialement, chaque processus connait uniquement
n
.Topologie : description du graphe ("qui est connecté à qui")
En fin d'algorithme, chaque processus doit connaitre aussi
Comment représenter la topologie ?
Algorithme synchrone
Une matrice nxn de booléens
(i,j)
"i a j comme voisin"
Un dictionnaire
V⟼𝒫(V)
(à chaque processus, associe un sous-ensemble de processus)
Taille :
O(V²)
Taille :
O(E+V)
Comment représenter la topologie ?
Algorithme synchrone
Un dictionnaire : V⟼𝒫(V)
Quelle valeur initiale ?
Quoi faire à chaque battement ?
Quand m'arrêter ?
Quand mon dictionnaire a une taille de n
.
Uniquement mes voisins
(c'est tout ce que je sais, de toute façon)
Exemple
B
A
C
D
F
E
A:BCD
dictA
D:AEF
dictD
dictF
F:D
Battement 1
Envoi des premiers messages
B
A
C
D
F
E
A:BCD
dictA
D:AEF
dictD
dictF
F:D
D:AEF
A:BCD
E:D
F:D
B:A
C:A
D:AEF
Battement 2
Traitement des messages précédents
Envoi des messages
B
A
C
D
F
E
dictA
D:AEF
dictD
dictF
F:D
D:AEF
A:BCD
E:D
F:D
A:BCD
B:A
C:A
D:AEF
E:D
F:D
Battement 3
Traitement des messages précédents
B
A
C
D
F
E
A:BCD
B:A
C:A
D:AEF
E:D
F:D
dictA
D:AEF
A:BCD
B:A
C:A
E:D
F:D
dictD
dictF
F:D
D:AEF
Battement 3
Traitement des messages précédents
B
A
C
D
F
E
A:BCD
B:A
C:A
D:AEF
E:D
F:D
dictA
D:AEF
A:BCD
B:A
C:A
E:D
F:D
dictD
dictF
F:D
D:AEF
A:BCD
E:D
Battement 3
Traitement des messages précédents
Envoi des messages
B
A
C
D
F
E
A:BCD
B:A
C:A
D:AEF
E:D
F:D
dictA
D:AEF
A:BCD
B:A
C:A
E:D
F:D
dictD
dictF
F:D
D:AEF
A:BCD
E:D
Battement 4
Traitement des messages précédents
B
A
C
D
F
E
A:BCD
B:A
C:A
D:AEF
E:D
F:D
dictA
D:AEF
A:BCD
B:A
C:A
E:D
F:D
dictD
dictF
F:D
D:AEF
A:BCD
B:A
C:A
E:D
"Le compte est bon !
Mais pas forcément chez mes voisins,
je l'envoie une dernière fois"
"Le compte est bon !
Mais pas forcément chez mes voisins,
je l'envoie une dernière fois"
Battement 4
Traitement des messages précédents
Envoi des messages
B
A
C
D
F
E
A:BCD
B:A
C:A
D:AEF
E:D
F:D
dictA
D:AEF
A:BCD
B:A
C:A
E:D
F:D
dictD
dictF
F:D
D:AEF
A:BCD
B:A
C:A
E:D
"Le compte est bon !
Mais pas forcément chez mes voisins,
je l'envoie une dernière fois"
"Le compte est bon,
et mes voisins ont l'info, j'ai fini"
Battement 5
Traitement des messages précédents
Envoi des messages
"Le compte est bon,
et mes voisins ont l'info, j'ai fini"
Pseudocode
Variables
sync
synchroniseur
Utilisé pour avancer par battements
dict
dictionnaire
Topologie du réseau
À chaque nouveau battement i
dernierBattement := true
ssi dict
a une taille de n
Pour chaque message du battement i-1
Mise à jour de dict
avec le dictionnaire du message
Envoi de dict
à tous les voisins actifs
Si dernierBattement
Quitter le synchroniseur
Remarque : tout se fait à travers un synchroniseur
i-1
" sont obtenus du synchroniseur.(Souvenez-vous : quand un processus n'a plus besoin de synchronisation, il dit "j'ai fini" au lieu de "je suis prêt" en fin de battement)
Propriétés
Messages par battement
Taille d'un message
2 par lien, donc O(E)
Jusqu'à O(V+E)
Donc O(E) pour tout réseau connecté
(Parce que le réseau connecté ayant le moins de liens possible est un arbre, et a E = V-1 liens, donc V devient négligeable asymptotiquement)
Mémoire par processus
Comme les messages, O(E).
Comment réduire la taille des messages ?
Chaque lien est stocké en double !
Envoyer un set de liens connus.
C'est tout ?
Envoyer aussi la liste des processus dont on connait les voisins (nécessaire pour savoir quand s'arrêter)
Sinon, connaitre le diamètre d du réseau et s'arrêter au battement d+1.
A
B
C
D
E
Étant donné le réseau ci-contre, simuler l'algorithme
synchronisé de découverte de topologie, en décrivant
l'état des dictionnaires à la fin de chaque battement.
A
B
C
D
E
A:BC
B:AC
C:ABD
D:EC
E:D
A:BC
B:AC
C:ABD
B:AC
A:BC
C:ABD
C:ABD
A:BC
B:AC
D:EC
D:EC
C:ABD
E:D
E:D
D:EC
A
B
C
D
E
A:BC
B:AC
C:ABD
D:CE
B:AC
A:BC
C:ABD
D:EC
C:ABD
A:BC
B:AC
D:EC
E:D
D:EC
C:ABD
E:D
A:BC
B:AC
E:D
D:EC
C:ABD
A:BC
B:AC
C:ABD
D:CE
E:D
B:AC
A:BC
C:ABD
D:EC
E:D
C:ABD
A:BC
B:AC
D:EC
E:D
D:EC
C:ABD
E:D
A:BC
B:AC
E:D
D:EC
C:ABD
A:BC
B:CA
A:BC
B:AC
C:ABD
D:CE
E:D
B:AC
A:BC
C:ABD
D:EC
E:D
C:ABD
A:BC
B:AC
D:EC
E:D
D:EC
C:ABD
E:D
A:BC
B:AC
E:D
D:EC
C:ABD
A:BC
B:CA
Noter le dernier broadcast après avoir reçu toutes les informations. Sans cela, C n'aurait pas propagé les voisins de E à A et B.
Un algorithme synchrone
Exemple parfait d'algorithme distribué dans le but d'améliorer les performances.
Multiplication de matrices
Remarque : parallélisation par distribution
Input : deux matrices nxn, A et B
Output : une matrice nxn, C = AB
Ressources : n^2 processus
Arrangement en grille
en tore !
Les processus d'une extrémité sont connectés à ceux de l'extrémité opposée.
Quels
et
avoir initialement ?
Avoir (i,j) qui possède Aij et Bij ne marche pas
est donc calculé progressivement, en k battements.
À chaque battement k, (i,j)
Processus en (i,j) calculera
Quels
et
avoir initialement ?
Shift
est donc calculé progressivement, en k battements.
À chaque battement k, (i,j)
Processus en (i,j) calculera
de i vers la gauche.
de j vers le haut.
Shift
Ainsi, (i,j) a
tels que
Quels
et
avoir initialement ?
est donc calculé progressivement, en k battements.
À chaque battement k, (i,j)
Processus en (i,j) calculera
(i,j) commence avec
tels que
Comment changer de
et
à chaque battement ?
On veut passer à
On peut simplement envoyer
Résumé & Pseudocode
Résumé
En tant que processus (i,j)
Je suis en charge de
, initialement 0.
Je commence avec
tels que
À chaque battement
J'ajoute
à
J'envoie
au voisin à gauche
J'envoie
au voisin au dessus
Je reçois les
pour mon prochain battement
Pseudocode
Variables
Aik
nombre
Valeur de A en ma possession
Cij
nombre, initialement 0
Somme intermédiaire
Bkj
nombre
Valeur de B en ma possession
n
entier, constant
Largeur des matrices
Avec initialement,
Aik = A[i][(i+j)%n]
Bkj = A[(i+j)%n][j]
Cij = 0
Pseudocode
À chaque nouveau battement b
(en commençant à 0)
Si b > 0
Aik ←
message reçu de la droite au battement précédent
Bkj ←
message reçu d'en dessous au battement précédent
Cij ← Cij + Aik * Bkj
Envoi de Aik
à ma gauche
Envoi de Bkj
au dessus
Si b
vaut n-1
Quitter le synchroniseur
Propriétés
Messages par battement
Taille d'un message
Un par lien.
Donc 2V
Donc 2n^2
Constante
Mémoire par processus
Constante
À chaque battement, quelles valeurs intermédiaires ont chaque processus lorsqu'ils exécutent l'algorithme de Cannon pour effectuer la multiplication suivante.
2 1 0
1 2 0
1 3 0
3 2 2
0 3 0
0 1 1
Valeurs de A
Valeurs de B
6 2 0
0 6 0
0 3 0
Valeurs de C
En fin de battement...
... 1 :
1 0 2
2 0 1
3 0 1
0 3 0
0 1 1
3 2 2
6 2 0
0 6 1
9 3 2
... 2 :
0 2 1
0 1 2
0 1 3
0 1 1
3 2 2
0 3 0
6 4 1
0 8 5
9 6 2
... 3 :