Parallel Programming with MPI and OpenMP Michael J. Quinn
Chapitre 6 Lalgorithme de Floyd
Sujets couverts Chemin le plus court entre toutes les paires de noeuds Tableau 2-D dynamique Communication entre deux noeuds
Le problème du chemin le plus court entre toutes les paires de noeuds dun graphe A E B C D A B C D E ABCD E Matrice dadjacence
Algorithme de Floyd for k 0 to n-1 for i 0 to n-1 for j 0 to n-1 a[i,j] min (a[i,j], a[i,k] + a[k,j]) endfor
Création dynamique dun tableau 1-D A Heap Run-time Stack
Création dynamique dun tableau 2-D Heap Run-time Stack BstorageB
Création dynamique dun tableau 2-D int **B, i; Bstorage = (int*) malloc (M*n*sizeof(int)); B=(int**) malloc (m*sizeof(int*)); for (i=0; i<m; i++) B[i] = &Bstorage[i*n];
Conception dun algorithme parallèle Partition Communication Répartition du travail
Partition Doit-on décomposer les données ou le code? On peut facilement extraire du parallélisme de données La même instruction doit être exécutée n 3 fois Pas de parallélisme de tâche On peut voir le problème comme n 2 applications de la même tâche à effectuer en parallèle sur des données différentes.
Communication Tâches primitives Mise-à-jour de a[3,4] lorsque k = 1 Iteration k: Chaque tâche de la ligne k diffuse sa valeur aux tâches de la même colonne Iteration k: chaque tâche de la colonne k diffuse sa valeur aux tâches de la même ligne
Répartition du travail p processeurs n 2 valeurs de sortie On associe environ n 2 /2 valeurs à chaque processeur
2 méthodes possibles On regroupe par lignesOn regroupe par colonnes
Comnparaison Regroupement par colonne On élimine la diffusion entre les lignes On élimine la diffusion entres les colonnes dun même groupe Regroupement par ligne On élimine la diffusion entre les colonnes On élimine la diffusion entres les lignes dun même groupe On choisi le regroupement par ligne puisque sur la plupart des systèmes les matrices sont représentées ligne par ligne.
Fichier dentrée Fichier Un processus est chargé de lire le fichier dentrée et de distribuer son contenu aux autres
Communication entre deux noeuds Deux processus veulent communiquer Un processus envoie un message Lautre processus reçoit le message En opposition avec une diffusion ou un processus envoie un message à tous les autres.
Send/Receive
Function MPI_Send int MPI_Send ( void *message, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm )
MPI_Datatype MPI_CHAR MPI_DOUBLE MPI_FLOAT MPI_INT MPI_LONG MPI_LONG_DOUBLE MPI_SHORT MPI_UNSIGNED_CHAR MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_UNSIGNED_SHORT
Function MPI_Recv int MPI_Recv ( void *message, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status )
MPI_status 3 champs: MPI_SOURCE: id du processus envoyant le message MPI_TAG: le tag du message MPI_ERROR: code derreur
Utilisation de Send/Receive … if (ID == j) { … Receive from I … } … if (ID == i) { … Send to j … } …
Implémentation de MPI_Send et MPI_Recv Processus expéditeurProcessus récepteur Tampon du programme Tampon du système Tampon de la mémoire MPI_Send MPI_Recv
Retour deMPI_Send Le processus expéditeur est bloqué tant que la mémoire nest pas libéré La mémoire est libéré lorsque Le message est copié dans le tampon, ou Le message est transmis Scénario typique: Le message est copié dans le tampon La transmission seffectue pendant que lexpéditeur poursuit son exécution
Retour de MPI_Recv Le processus récepteur jusquà ce que le message soit copié dans le tampon Si le message narrive jamais alors le processus ne débloquera jamais
Interblocage Lorsquun processus attend un événement qui ne se produira jamais Les appels send/receive sont une cause importante dinterblocage Deux processus: Les deux reçoivent avant denvoyer Aucun send ne correspond à un receive Un processus envoie un message à un mauvais destinataire.