1 / 28

Parallel Programming in C with MPI and OpenMP

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.

misu
Download Presentation

Parallel Programming in C with MPI and OpenMP

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Parallel Programmingin C with MPI and OpenMP Michael J. Quinn

  2. Chapitre9 Classement de documents

  3. Objectifs • Complète l’introduction aux fonction MPI • Implémentation d’un programme de type: manager-worker • Utilisation de communications non bloquantes.

  4. 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

  5. Problème de classement de documents

  6. Dépendence des tâches(1) Lire le dictionnaire Identifier les documents Lire les documents Générer les vecteurs profils Afficher les vecteurs

  7. 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

  8. 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

  9. 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.

  10. Gestionnaire-Travailleurs

  11. 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.

  12. 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

  13. 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.

  14. 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

  15. Task/Channel Graph

  16. 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.

  17. Prototype de MPI_Abort int MPI_Abort ( MPI_Comm comm, /* Communicator */ int error_code) /* Code d’erreur*/

  18. 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.

  19. 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

  20. 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);

  21. 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.

  22. 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 )

  23. 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 )

  24. Function MPI_Wait int MPI_Wait ( MPI_Request *handle, MPI_Status *status )

  25. MPI_Status typedefstruct _statusMPI_Status; struct _status { intMPI_SOURCE; intMPI_TAG; intMPI_ERROR; intst_length; /* message length */ };

  26. 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

  27. 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

  28. Function MPI_Get_count int MPI_Get_count ( MPI_Status *status, MPI_Datatype dtype, int *cnt ) Permet de connaître la taille du message

More Related