MPI : Un outil pour le multi-coeur? Romaric David / Loïc Gouarin Université de Strasbourg / Laboratoire de mathématiques d'orsay 16 décembre 2010
Plan 1 Introduction 2 Principe de MPI 3 Les bases de MPI 4 Les moins-bases de MPI 5 Et le multi-coeur? 6 Conclusion
Introduction Plan 1 Introduction 2 Principe de MPI 3 Les bases de MPI 4 Les moins-bases de MPI 5 Et le multi-coeur? 6 Conclusion
Introduction Comment paralléliser son code? GPU1 GPU2 GPU1 GPU2 Mémoire core1 core2 core3 core4 Mémoire core1 core2 core3 core4 réseau
Introduction Quels sont les outils pour paralléliser son code? 1 Processus / Posix Threads 2 Standard OpenMP 3 Libdispatch 4 GPU CUDA OpenCL HmPP 5 Standard MPI MPI-1 MPI-2 MPI-3 (dans un futur proche)
Principe de MPI Plan 1 Introduction 2 Principe de MPI 3 Les bases de MPI 4 Les moins-bases de MPI 5 Et le multi-coeur? 6 Conclusion
Principe de MPI MPI : Message Passing Interface conçue en 1993 (MPI-1), 1995 (MPI-2), en cours (MPI-3) norme dénissant une bibliothèque de fonctions, utilisable avec les langages C et Fortran permet d'exploiter des ordinateurs multiprocesseurs et des réseaux d'ordinateurs pour exécuter des applications parallèles communiquant explicitement par passage de messages.
Principe de MPI MPI : Message Passing Interface Fonctionnalités de MPI-1 MPI-1 est conçue comme un ensemble de fonctions de nom standardisé permettant de travailler sur des processus lancés en parallèle. nombre de processus, numéro du processus : de 0 à...... ; communications point à point (1 source, 1 destinataire) communications collectives (au moins 1 source, au moins 1 destinataire) communicateurs (des groupes de processus), types dérivés (à construire par le programmeur), topologies (pour mieux repérer les processus).
Principe de MPI MPI : Message Passing Interface Fonctionnalités de MPI-2 gestion dynamique des processus : création, destruction I/O parallèles interfaçage avec Fortran95 et C++ communications de mémoire à mémoire (remote-dma)...
Principe de MPI MPI : Message Passing Interface Fonctionnalités de MPI-3 Source : cours MPI de l'idris, version 2.28, Octobre 2010 prise en compte des architectures multi-coeurs communications collectives non bloquantes révision des copies de mémoire à mémoire tolérance aux pannes bindings Fortran 2003 et 2008
Principe de MPI MPI : Message Passing Interface Programme séquentiel monprogramme.c Mémoire core exécution int main (int argc, char **argv) { a = malloc(a_lot*sizeof(double)); }
Principe de MPI SPMD : Single Program Multiple Data Mémoire core int main (int argc, char **argv) { a = malloc(a_lot*sizeof(double)); } monprogramme.c réseau Mémoire core
Principe de MPI Implémentations de MPI MPI ne dénit que le nom des fonctions, en aucun cas l'implémentation. Pour cette raison, il existe un grand nombre d'implémentations, qui ne sont compatibles entre elles qu'au niveau source. MPICH2 : http ://www-unix.mcs.anl.gov/mpi/mpich2/, l'implémentation portée par le labo d'un des principaux acteurs de la norme, William Gropp Open MPI : http ://www.open-mpi.org/, un MPI modulaire quant aux réseaux de communication utilisés Intel MPI, HP MPI, Bull MPI, IBM MPI MPJ Express, pour Java Diérents bindings python dont mpi4py
Les bases de MPI Communication point à point Plan 1 Introduction 2 Principe de MPI 3 Les bases de MPI 4 Les moins-bases de MPI 5 Et le multi-coeur? 6 Conclusion
Les bases de MPI Communication point à point Communication point à point bloquante I Une communication point à point met en jeu 2 processus, repérés par leur numéro. Elle est la résultante de 2 actions : Déroulement d'une communication Un processus fait appel à MPI_Send, indique type et taille des données, ainsi que le numéro (rang) du processus destinataire Le processus dont le rang est indiqué par le processus émetteur fait appel à MPI_Recv, avec type et taille des données identiques. Ce processus indique le rang du processeur émetteur La mise en correspondance de ces deux opérations permet au message d'être livré à son destinataire. Par défaut, les
Les bases de MPI Communication point à point Communication point à point bloquante II communucations sont bloquantes : le programme ne peut sortir de l'appel à MPI_Send / MPI_Recv qu'après complétion de l'opération. Si l'on se trompe, cela peut facilement faire bloquer un programme.
Les bases de MPI Communication point à point Communication point à point bloquante Exemple 0 7 1 valeur = 1000 6 2 5 4 3
Les bases de MPI Communication point à point Code Fortran correspondant program point_a_point implicit none include 'mpif.h' integer, dimension(mpi_status_size) :: statut integer, parameter :: etiquette=100 integer :: rang,valeur,code call MPI_INIT(code) call MPI_COMM_RANK(MPI_COMM_WORLD,rang,code) if (rang == 1) then valeur=1000 call MPI_SEND(valeur,1,MPI_INTEGER,5,etiquette,MPI_COMM_WORLD,code) elseif (rang == 5) then call MPI_RECV(valeur,1,MPI_INTEGER,1,etiquette,MPI_COMM_WORLD, statut,code) print *,'Moi, processus 5, j''ai reçu ',valeur,' du processus 1.' end if call MPI_FINALIZE(code)
Les bases de MPI Communication point à point Envoi d'un tableau program table_point_a_point... real *8, dimensions=(100,200) :: demoarray call MPI_INIT(code) call MPI_COMM_RANK(MPI_COMM_WORLD,rang,code) if (rang == 1) then! Read demo array from file call MPI_SEND (demoarray,20000,mpi_double,5,...) elseif (rang == 5) then call MPI_RECV(demoarray,20000,MPI_DOUBLE,1,etiquette, MPI_COMM_WORLD,statut,code) print *,'Moi, processus 5, j''ai reçu un tableau du processus 1.' end if call MPI_FINALIZE(code) end program table_point_a_point
Attention : il est évident que l'avancement de la communication en arrière-plan consommera des RD/LG ressources. MPI : Un Sous outil pour OpenMPI, le multi-coeur il? existe Les bases de MPI Communication point à point Communication point à point non bloquante Une communcation non bloquante permet au programme de continuer son exécution pendant que le transfert des données se réalise en arrière-plan. Étapes d'une communication non-bloquante Initiation de la communication. En retour, on obtient une référence à cette communication Exécution de routines de calcul a Plus tard, attente sur la référence à la communication pour pouvoir relacher la référence à la communication a. Attention, ces routines doivent pas modier les données potentiellement en cours d'envoi
Les bases de MPI Communication point à point Communication point à point non bloquante Exemple de code program point_a_point_nb... integer real *8, dimensions=(100,200)... :: rang,valeur,code,requete :: demoarray if (rang == 1) then! Read demo array from file call MPI_ISEND (demoarray,20000,...,requete,code)! Compute on everything but demoarray, may take a long time call MPI_WAIT(requete,status,code) elseif (rang == 5) then call MPI_RECV(demoarray,20000,MPI_DOUBLE,1,etiquette,MPI_COMM_WORLD, statut,code) print *,'Moi, processus 5, j''ai reçu un tableau du processus 1.' end if... Un message envoyé en non-bloquant RD/LG peut êtrempi reçu : Un enoutil mode pourbloquant. le multi-coeur?
Les moins-bases de MPI Communication collective Plan 1 Introduction 2 Principe de MPI 3 Les bases de MPI 4 Les moins-bases de MPI 5 Et le multi-coeur? 6 Conclusion
Les moins-bases de MPI Communication collective Synchronisation globale Une communication collective est une communication mettant en jeu tous les processus. MPI_Barrier()
Les moins-bases de MPI Communication collective Diusion générale Le but est de diuser la même information à tous, depuis un processus appelé root. 0 1 2 A 3 0 A 1 A 2 A 3 A
Les moins-bases de MPI Communication collective Communication dispersive Le but est de répartir en une instruction un gros ensemble de données en plusieurs petits ensembles. On l'utilise pour distribuer des morceaux de tableaux. MPI_Scatter(buer_to_send, buer_to_receive, size_of_each_block,type, root) 0 1 0 A 1 1 A 2 2 A 1 A 2 A 3 A 4 3 2 A 3 3 A 4
Les moins-bases de MPI Communication collective Communication dispersive Exemple Fortran program scatter.. integer, parameter:: nb_valeurs=128 integer :: nb_procs,rang,longueur_tranche,i,code real, allocatable, dimension(:) :: valeurs,donnees call MPI_INIT (code)... longueur_tranche=nb_valeurs/nb_procs allocate(donnees(longueur_tranche)) if (rang == 2) then allocate(valeurs(nb_valeurs)) valeurs(:)=(/(1000.+i,i=1,nb_valeurs)/) end if call MPI_SCATTER (valeurs,longueur_tranche,mpi_real, donnees,longueur_tranche, MPI_REAL,2,... ) call MPI_FINALIZE (code)
Les moins-bases de MPI Communication collective Rassembler Le rassemblement est l'opération inverse de la dispersion : Tous les processus impliqués disposent d'un morceau de tableau Un d'entre eux va recoller les morceaux 0 A 1 1 A 2 0 1 2 A 3 3 A 4 2 A 1 A 2 A 3 A 4 3
Les moins-bases de MPI Communication collective Tout rassembler Les besoins courants, comme l'enchaînement d'un rassmblement suivi d'une rediusion à tous (Gather + Bcast) sont fournis par la norme : allgather 0 A 1 0 A 1 A 2 A 3 A 4 1 A 2 1 A 1 A 2 A 3 A 4 2 A 3 2 A 1 A 2 A 3 A 4 3 A 4 3 A 1 A 2 A 3 A 4
Les moins-bases de MPI Communication collective Echanges croisés Lors d'un commérage (alltoall), chaque processus procède à une communication dispersive de ses données. Le volume de communications est en conséquence (en fonction du carré du nombre de processus). 0 A 1 A 2 A 3 A 4 0 A 1 B 1 C 1 D 1 1 B 1 B 2 B 3 B 4 1 A 2 B 2 C 2 D 2 2 C 1 C 2 C 3 C 4 2 A 3 B 3 C 3 D 3 3 D 1 D 2 D 3 D 4 3 A 4 B 4 C 4 D 4
Les moins-bases de MPI Communication collective Réduction La réduction un mode de communication où l'échange des données s'accompagne d'opérations sur celles-ci. Les opérations doivent être commutatives et associatives (traduire eecutées dans un ordre quelconque). Par défaut, les opérations suivantes sont dénies : MPI_SUM : somme des éléments MPI_PROD : produit des éléments MPI_MAX : recherche du maximum MPI_MIN : recherche du minimum MPI_MAXLOC : recherche de l'indice du maximum MPI_MINLOC : recherche de l'indice du minimum...
Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Plan 1 Introduction 2 Principe de MPI 3 Les bases de MPI 4 Les moins-bases de MPI 5 Et le multi-coeur? 6 Conclusion
Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Contexte d'utilisation de MPI I Petit rappel... MPI est utilisé pour exécuter un ensemble de processus sur des ordinateurs multiprocesseurs et des réseaux d'ordinateurs pour exécuter des applications parallèles communiquant explicitement par passage de messages.
Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Contexte d'utilisation de MPI II... grosses conséquences Dans la norme MPI, il n'est rien dit du mode lancement des processus. En particulier, l'aectation des processus aux diérents ordinateurs et aux diérents processeurs est à la charge de l'utilisateur. MPI n'intervient que lorsqu'une fonction préxée par MPI_... est appelée. Entre deux appels à MPI, les processus peuvent faire ce que bon leur semble. Rien n'oblige non plus à démarrer les mêmes processus sur l'ensemble des machines, tant que leurs communications MPI correspondent.
Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Exécution des processus sur un ensemble de machines I La syntaxe indiquée ici est celle de l'imlémentation Open-Mpi. Lancement des processus, mode basique Par convention, on utilise la commande mpiexec. On lui indique : Le nombre de processus total Une liste de machines à utiliser Exemple : mpiexec -n 19 -machinele hostlist /path/to/binary Dans ce cas, les 19 processus seront répartis en round-robin sur les machines fournies dans hostlist
Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Exécution des processus sur un ensemble de machines II Pour aller un peu plus loin Des options avancées permettent de préciser : Pour chacune des machines, le nombre de processus à lancer Le nom du programme à lancer sur les machines On écrit alors un apple pour cela. Le chier comprend une suite de lignes de la forme -host hostname -np nb_procs /path/to/binary_for_host Dans ce cas, on choisit le nombre de processus machine par machine
Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Prise en compte de l'environnement d'exécution par MPI I En environnement cluster Les clusters de calcul sont souvent exploités par des environnements de gestion de les d'attente (gestion de batch) Ces environnements choisissent automatiquement pour l'utilisateur des machines disponibles sur lesquelles s'exécutera l'application MPI La liste des machines n'est pas connue au lancement du job. La couche de lancement MPI pourra la récupérer automatiquement lors du lancement de l'application (on parle d'intégration entre MPI et le gestionnaire de batch)
Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Prise en compte de l'environnement d'exécution par MPI II Choix du meilleur canal pour les communications En fonction de la répartition en processus par machine, MPI pourra réaliser les optmisations suivantes lors des communications. processus local remote processus self shared memory network(s) Question ouverte : coût d'un échange de données entre processus sur un même machine via MPI ou via des threads?
Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Exécution sur des machines multi-coeurs I Pour la répartition des processus MPI sur un ensemble de machines multi-coeurs, un grand nombre de possibilités s'orent à nous.
Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Exécution sur des machines multi-coeurs II Répartition des processus Un processus par coeur Avantage : 1 seul mode de programmation, utilisation de tous les coeurs. Inconvénient : Expressivité. Ecacité en mémoire. Performances dépendent des optimisations de la couche MPI. Question ouverte : placement des processus MPI sur les diérents coeurs? Cf Travaux de l'équipe Runtime du Labri (http ://runtime.bordeaux.inria.fr) Un processus par machine Avantage : 1 seul mode de programmation Inconvénient : Que faire des autres coeurs?
Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Exécution sur des machines multi-coeurs III La méthode utilisée couramment s'appuie sur la programmtion hybride : MPI (Inter-machines) + Threads/OpenMP + GPU. Ceci assure une mise en correspondance ne du modèle de programmation avec l'architecture. On lancera alors 1 processus MPI par machine.
1. On suppose que le système RD/LG a bien voulu MPI : Un placer outil pour un le thread multi-coeur par? coeur. On Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Exécution sur des machines multi-coeurs Exemple de répartition idéale avec 1 processeus par machine, 2 Threads OpenMP par processus, 1 GPU par thread 1 Représentation graphique GPU1 (OCL) GPU2 (OCL) GPU1 (OCL) GPU2 (OCL) Mémoire Mémoire c1 (OMP) c2 (OMP) c1 (OMP) c2 (OMP) réseau - (Communications MPI)
Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Exécution sur des machines multi-coeurs - pseudo-code MPI_Init(&argc, &argv); if (rank ==0) read_file(); /* All MPI processes) */ MPI_Scatter(...); #pragma omp parallel for schedule(static) for (i=0 ; i < BIG_NUMBER ; i++) start_gpu_computation(device=omp_get_thread_num()%2) MPI_Send(some_data,the_other) do_cpu_computation_that_does_not_fits_on_gpu() MPI_Gather(...); MPI_Finalize();
Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Exécution sur des machines multi-coeurs En pratique Le code précédent suppose que : Durant l'exécution des threads OpenMp, chaque thread se voit aecter un coeur. Assuré par le système, aidé par utilisateur Il y a autant de cartes GPU que de coeurs, ce qui en général n'est pas vrai procéder à un join des threads OpenMP avant d'utiliser les GPU, ou dédier un thread OpenMP au GPU Les appels MPI soient possibles dans les threads (dépend de l'implémentation).
MPI_THREAD_SINGLE : aucune cohabitation possible MPI_THREAD_FUNNELED : plusieurs threads mais seul le maitre appelle MPI MPI_THREAD_SERIALIZED : les appels MPI doivent être sérialisés par les threads MPI_THREAD_MULTIPLE : les appels à MPI peuvent être eectués en même temps par plusieurs threads (cas de OpenMPI) Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? MPI et les threads Niveaux de support Le niveau de cohabitation de MPI et des threads est donné par la fonction MPI_Init_thread(int *argc, char ***argv,int required, int *
Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Prise en compte du multi-coeurs dans MPI-3 I Une des notions fondamentales de MPI est l'association identitaire entre un processus et un rang, l'espace d'adressage n'étant pas partagé entre les processus : Pour la prise en compte du multi-coeurs, l'idée serait de permettre à plusieurs rangs MPI de partager le même espace d'adressage. On parle alors de MPI_Endpoint. L'intérêt est de simplier l'échange
Et le multi-coeur? Utilisation de MPI en environnement multi-coeurs Que mettre dans un processus MPI? Prise en compte du multi-coeurs dans MPI-3 II de données entre rangs MPI sur une même machine.
Conclusion Plan 1 Introduction 2 Principe de MPI 3 Les bases de MPI 4 Les moins-bases de MPI 5 Et le multi-coeur? 6 Conclusion
Conclusion Conclusion La programmation de grappes de machines multicoeurs exige de mettre en uvre plusieurs modèles de programmation parallèle. L'ajout de MPI comme surcouche de communucation entre machines multicoeurs ajoute des fonctionnalités riches en terme de description d'échange des données, d'e/s parallèles (Hdf5 par exemple). Le prix à payer est une hiérarchisation du code. Néanmoins, on peut imaginer coner une partie du travail de parallélisation du code des processus aux compilateurs.
Conclusion Bibliographie Il existe de nombreux cours MPI en ligne. Ont été utilisés : Le cours sur mpi4py (pour python), écrit par Loïc Gouarin pour l'angd "Python pour le Calcul Scientique" http://calcul.math.cnrs.fr Le cours MPI de l'idris (J. Chergui, I. Dupays, D. Girou, S. Requena, P. Wautelet http://www.idris.fr Le site de OpenMPI http://www.open-mpi.org Site des discussions du forum mpi : https://svn.mpi-forum.org/trace/mpi-forum-web