Post on 24-Feb-2016
description
Parallel Programmingin C with MPI and OpenMP
Michael J. Quinn
Chapitre 9Classement de documents
ObjectifsComplète l’introduction aux fonctions MPI
Implémentation d’un programme de type: manager-worker
Utilisation de communications non bloquantes.
Problème de classement de documentsOn recherche dans des répertoires et sous-répertoires des
documents (ex: .html, .txt, .tex, etc.)
On utilise un dictionnaire de mots clefs afin de créer un vecteur “profil” pour chaque document.
On mémorise les vecteurs profils
Problème de classement de documents
Dépendence des tâches(1)
Partition et CommunicationLa plus grande part du temps est passé à lire les document et
générer les vecteurs profils
Cela implique deux tâches primitives pour chaque document
Dépendance des tâches(2)
Nombre restreint de processusNombre de tâches inconnu avant l’exécution
Les tâches ne nécessitent pas de communiquer entre elles
Le temps de traitement des documents peut varier considérablement
Stratégie: On distribue les tâches aux processus en cours d’exécution.
Gestionnaire-Travailleurs
Gestionnaire/travailleurs vs. SPMD
SPMD (single program multiple data)Chaque processus exécute la même fonctionForme particulière de MIMD
Gestionnaire/travailleursLe processus gestionnaire a des responsabilité
différentes des processus travailleursDans un programme MPI de type
gestionnaire/travailleurs, le flot de controle se sépare rapidement entre le gestionnaire et les travailleurs.
Rôle du gestionnaire et des travailleurs
Pseudocode du gestionnaireIdentifier les documentsRecevoir du travailleur 0 la taille du dictionnaireCréer une matrice pour mémoriser les vecteurs profilsrépéter
Recevoir un message d’un travailleurSi le message contient un vecteur profil
Mémoriser le vecteurS’il reste un document alors
envoyer le nom du fichier au travailleur Sinon
envoyer un message de terminaisonJusqu’à ce que tous les travailleurs aient terminé Sauver la matrice de vecteur dans un fichier.
Pseudocode des travailleursEnvoyer un premier message au gestionnaireSi id==0 alors
Lire le dictionnaire d’un fichierDiffuser le dictionnaire aux autres travailleursConstruire une table de hachage à partir du dictionnaireSi id==0 alors
Envoyer la taille du dictionnaire au gestionnaireRépéter
Recevoir un nom de fichier du gestionnaireSi le nom est nul alors terminerLire le document et générer le vecteur profilEnvoyer le vecteur au gestionnaire
indéfiniment
Task/Channel Graph
MPI_AbortPermet de terminer tous les processus d’un communicator
donnée
Example d’utilisation: Lorsque le gestionnaire ne peut pas allouer l’espace nécessaire pour mémoriser les vecteurs profils.
Prototype de MPI_Abort
int MPI_Abort (
MPI_Comm comm, /* Communicator */
int error_code) /* Code d’erreur*/
Créer un communicator pour les travailleurs
Le dictionnaire est diffusé aux travailleurs
On ceut créer un communicator qui ne comprend que les travailleurs
Fonction MPI_Comm_split: Crée des nouveaux communicators à partir de couleurs et de clefs.
MPI_Comm_splitint MPI_Comm_split(
MPI_Comm comm, /* Communicator à diviser */
int color, /* Indique le sous-groupe */
int key, /* Rang dans le sous-groupe */
MPI_Comm *newcomm /* handle vers le sous-groupe */
)
Note: Lorsque color vaut MPI_UNDEFINED alors la valeur retournée dans newcomm vaut MPI_COMM_NULL
Création d’un communicator pour les travailleurs
int id;MPI_Comm worker_comm;
...
if (!id) /* Manager */ MPI_Comm_split (MPI_COMM_WORLD, MPI_UNDEFINED, id, &worker_comm);
else /* Worker */ MPI_Comm_split (MPI_COMM_WORLD, 0, id, &worker_comm);
Send / Receive non bloquantMPI_Isend, MPI_Irecv: initie les opérations
MPI_Wait: Bloque jusqu’à la complétion
On peut faire un appel non bloquant tôtMPI_Isend: Aussitôt que le message est prêtMPI_Irecv: Aussitôt que le tampon est disponible
Permet le chevauchement de la communication et du calcul.
Function MPI_Isendint MPI_Isend ( void *buffer, int cnt, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm, MPI_Request *handle)
Pointeur vers un objet qui identifie l’opération
Function MPI_Irecvint MPI_Irecv ( void *buffer, int cnt, MPI_Datatype dtype, int src, int tag, MPI_Comm comm, MPI_Request *handle)
Pointeur vers un objet qui identifie l’opération
Function MPI_Wait
int MPI_Wait (
MPI_Request *handle,
MPI_Status *status
)
MPI_Status
typedef struct _status MPI_Status;
struct _status { int MPI_SOURCE;int MPI_TAG;int MPI_ERROR;int st_length; /* message length */
};
Recevoir le nom des fichiersLes travailleurs ne connaissent pas à l’avance la longueur des
noms qu’ils vont recevoir
AlternativesAllocation statique: Prévoir un grand tableauAllocation dynamique: recevoir la longueur des noms en cours
d’exécution
On choisira la seconde alternative
Function MPI_Probeint MPI_Probe (
int src,
int tag,
MPI_Comm comm,
MPI_Status *status)
Bloque jusqu’à ce qu’un message soit prêt à recevoirPermet de voir le statut avant de recevoir le message
Function MPI_Get_countint MPI_Get_count ( MPI_Status *status,
MPI_Datatype dtype,
int *cnt)
Permet de connaître la taille du message