280 likes | 422 Views
Parallel Programming in C with MPI and OpenMP. Michael J. Quinn. Chapitre 9. Classement de documents. Objectifs. Complète l’introduction aux fonction MPI Implémentation d’un programme de type: manager-worker Utilisation de communications non bloquantes.
E N D
Parallel Programmingin C with MPI and OpenMP Michael J. Quinn
Chapitre9 Classement de documents
Objectifs • Complète l’introduction aux fonction MPI • Implémentation d’un programme de type: manager-worker • Utilisation de communications non bloquantes.
Problème de classement de documents • On recherche dans des répertoires et sous-répertoires des documents (ex: .html, .txt, .tex, etc.) • On utilise un dictionnaire de mots clef afin de créer un vecteur “profil” pour chaque document. • On mémorise les vecteurs profils
Dépendence des tâches(1) Lire le dictionnaire Identifier les documents Lire les documents Générer les vecteurs profils Afficher les vecteurs
Partition et Communication • La 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) Lire le dictionnaire Identifier les documents Lire le Document 1 Lire le Document n-1 Lire le Document 0 Générer le vecteur Profil 0 Générer le vecteur Profil 1 Générer le vecteur Profil n-1 Afficher les vecteurs
Nombre restreint de processus • Nombre 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 vs. SPMD • SPMD (single program multiple data) • Chaque processus exécute la même fonction • Forme particulière de MIMD • Gestionnaire/travailleurs • Le processus gestionnaire a des responsabilité différentes des processus travailleurs • Dans 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 Identifier les documents Lire le dictionnaire Lire les Documents Générer les vecteurs profils Afficher les vecteurs Travailleurs Gestionnaires
Pseudocode du gestionnaire Identifier les documents Recevoir du travailleur 0 la taille du dictionnaire Créer une matrice pour mémoriser les vecteurs profils répéter Recevoir un message d’un travailleur Si le message contient un vecteur profil Mémoriser le vecteur S’il reste un document alors envoyer le nom du fichier au travailleur Sinon envoyer un message de terminaison Jusqu’à ce que tous les travailleurs aient terminé Sauver la matrice de vecteur dans un fichier.
Pseudocode des travailleurs Envoyer un premier message au gestionnaire Si id==0 alors Lire le dictionnaire d’un fichier Diffuser le dictionnaire aux autres travailleurs Construire une table de hachage à partir du dictionnaire Si id==0 alors Envoyer la taille du dictionnaire au gestionnaire Répéter Recevoir un nom de fichier du gestionnaire Si le nom est nul alors terminer Lire le document et générer le vecteur profil Envoyer le vecteur au gestionnaire indéfiniment
MPI_Abort • Permet 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_split int 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 bloquant • MPI_Isend, MPI_Irecv: initie les opérations • MPI_Wait: Bloque jusqu’à la complétion • On peut faire un appel non bloquant tôt • MPI_Isend: Aussitôt que le message est prêt • MPI_Irecv: Aussitôt que le tampon est disponible • Permet le chevauchement de la communication et du calcul.
Pointeurvers un objet qui identifiel’opération Function MPI_Isend int MPI_Isend ( void *buffer, int cnt, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm, MPI_Request *handle )
Pointeurvers un objet qui identifiel’opération Function MPI_Irecv int MPI_Irecv ( void *buffer, int cnt, MPI_Datatype dtype, int src, int tag, MPI_Comm comm, MPI_Request *handle )
Function MPI_Wait int MPI_Wait ( MPI_Request *handle, MPI_Status *status )
MPI_Status typedefstruct _statusMPI_Status; struct _status { intMPI_SOURCE; intMPI_TAG; intMPI_ERROR; intst_length; /* message length */ };
Recevoir le nom des fichiers • Les travailleurs ne connaissent pas à l’avance la longueur des noms qu’ils vont recevoir • Alternatives • Allocation statique: Prévoir un grand tableau • Allocation dynamique: recevoir la longueur des noms en cours d’exécution • On choisira la seconde alternative
Function MPI_Probe int MPI_Probe ( int src, int tag, MPI_Comm comm, MPI_Status *status ) Bloque jusqu’à ce qu’un message soit prêt à recevoir Permet de voir le statut avant de recevoir le message
Function MPI_Get_count int MPI_Get_count ( MPI_Status *status, MPI_Datatype dtype, int *cnt ) Permet de connaître la taille du message