BE-MPI-1envois de messages bloquants Page 1 of 3 01/03/2010 Calcul parallèle et distribué, et Grilles de calculs Cours de 3ème année SI à Supélec BE de programmation MPI-1 par envois de messages bloquants Objectifs du Bureau d'etude : (parallélisation en mémoire distribuée) Stéphane Vialle Les clusters de PC sont aujourd'hui des plates-formes de calculs opérationnelles et industrielles. La distribution de tâches indépendantes se fait automatiquement dans certains environnements de développement, mais la distribution d'une application nécessitant des échanges de résultats intermédiaires ou une circulation des données (trop volumineuses pour être stockées en totalité sur chaque PC) reste à la charge du développeur. Elle demande des connaissances en algorithmique parallèle et un savoir-faire en programmation distribuée. Ce BE a pour objectif de pratiquer la programmation des clusters de PC par envois de messages à l'aide MPI. Il consiste à implanter l'algorithme du produit de matrices denses sur un anneau de processeurs (algorithme vu en cours). Plate-forme de développement : Pour les développements et mise au point : vous travaillerez sous Linux sur une machine dualcoeurs "cripc##" de la salle de TL. Pour les mesures de performances : vous utiliserez le 'ic-cluster' installé à Supélec sous Linux. Il s'agit d'un cluster de PC monosockets bi-cores(les machines ic#.ic). VOUS VOUS LOGGUEREZ SOUS UN DES COMPTES D'EXPERIMENTATION "intercell_#" sur le campus de metz de Supelec pour toute la durée du BE. Vous transfererez vos fichiers à Metz, réserverez des noeuds de calculs sur le iccluster, recompilerez vos fichiers sur ce cluster, et y exécuterez vos programmes distribués. Rmq : la version de MPI installée sur ce cluster est OpenMPI, et utilise le "ssh" associé à des certificats pour lancer ses processus sur les noeuds du cluster. Les comptes d'expérimentation ont été configuré pour cela, et possèdent déjà des certificats. Documents à rendre : Vous rendrez un SEUL document par binôme : un fichier Word (.doc) ou PDF : il sera nommé avec vos noms précédés de "BE-MPI-Bloquant". Ex : "BE-MPI-
BE-MPI-1envois de messages bloquants Page 2 of 3 01/03/2010 Bloquant-Martin-Dupont.pdf" il comportera sur la première page : vos nom et prénoms, et le nom de votre option de 3A, la date de remise du rapport, le titre ("BE de programmation MPI par envois de messages bloquants"). il comportera ensuite : pour chaque étape : une description de la parallélisation réalisée (pourquoi? comment?), vos mesures de performances (Texec, MegaFlops, SpeedUp) sur un cluster de PC, pour les plus performants de vos codes, des graphiques de synthèse représentant les performances fonction du nombre de PC utilisés et éventuellement de la taille du problème, votre analyse/synthèse des performances obtenues, en annexe : les codes sources des parties importantes du code à chaque étape (ex : les routines de calcul et de communication). Date limite de remise de vos rapports : vendfredi 5 mars 2010 à 18h00. Remise par e-mail à S. Vialle. Travail à effectuer : Stratégie de développement et de mesure de performances : MPI demande de concevoir une application parallèle dès le départ, et d'utiliser des noyaux de cacluls optimsiés sur chaque noeud pour les étapes de calculs. Afin de cumuler toutes les sources de performance on partira toujours d'un code séquentiel optimisé puis multithreadé pour ces noyaux de calculs (comme vu à la fin du premier BE). Les codes de calcul de ce BE seront évalués par leurs temps d'exécution des principales boucles de calculs et le nombre de MegaFlops associés. Vous calculerez les accélérations et efficacités des différentes version de vos codes vis-àvis du temps d'exécution optimisée et multithreadé sur un noeud multi-coeurs du cluster (référence = code parallèle OpenMP optimisé sur un noeud). Exercices : 1. Parallélisation d'un produit de matrices denses avec MPI_Sendrecv_replace sur une même machine de la salle de TL : a. Paralléliser le produit de matrices denses sur un anneau en utilisant MPI et la routine MPI_Sendrecv_replace et vérifiez l'exactitude des résultats : Enoncé détaillé. b. Ajouter une parallélisation OpenMP à la routine de calcul locale, au programme distribué de la question précédente, et vérifiez l'exactitude des résultats. 2. Prise en main du ic-cluster sur le campus de Metz de Supelec : a. Logguez vous sur une machine d'entrée de Metz par ssh depuis un 'xterm' : ssh phome.metz.supelec.fr -l intercell_# (ou # est un numéro qui vous sera affecté durant le BE). b. Logguez vous maintenant sur la frontale vera.ic (une des machines frontales
BE-MPI-1envois de messages bloquants Page 3 of 3 01/03/2010 du cluster) : ssh vera.ic c. Transférer vos fichiers sur le compte intercell_# à Metz par scp : pour transférer un fichier sur le compte à Metz : depuis une machine de Metz, sous le compte intercell_# entrez : scp <votre loggin à Gif>@cripc#.supelec.fr:<nom de votre fichier avec son chemin d'accès>. pour transférer un répertoire sur le compte de Metz : depuis une machine de Metz, sous le compte intercell_# entrez : scp -r <votre loggin à Gif>@cripc#.supelec.fr:<nom de votre fichier avec son chemin d'accès>. d. Demandez des noeuds de calculs sur le cluster à travers l'environnement OAR : Enoncé détaillé e. Re-compilez vos codes sur le ic-cluster et exécutez les pour vérifiez leur bon fonctionnement. 3. Mesures de performances sur le ic-cluster : a. Mesurez les performances d'une exécution utilisant un processus MPI et 1 thread OpenMP par noeud, sur 1, 2, 4 et 8 noeuds. b. Mesurez les performances d'une exécution utilisant un processus MPI et 2 thread OpenMP par noeud, sur 1, 2, 4 et 8 noeuds c. Tracez des courbes de performances (MegaFlops) en fonction du nombre de noeuds (nombre de machines utilisées), variant de 1 à 8 noeuds. d. Calculez et tracez le Speedup de l'exécution sur P noeuds avec 2 threads pr process MPI, par rapport à l'exécution sur un seul noeud avec 2 threads. 4. Implantez maintenant une parallélisation utilisant les routines MPI_Bsend et MPI_Recv. Mesurez et tracez les performances. 5. Si le temps le permet, implantez une parallélisation utilisant les routines MPI_Ssend et MPI_Recv (attention : lors de la réception de données veillez à ne pas écraser des données non-encore expédiées à leurs destinataires... ). Mesurez et tracez les performances. 6. Synthèse et analyse globales des résultats : quelles leçons tirez-vous de l'exploitation d'un cluster de PC?
BE MPI Bloquant Sendrecv_replace Page 1 of 2 BE de programmation MPI-1 par envois de messages bloquants Stéphane Vialle Exercice : Parallélisation en MPI, en utilisant la routine MPI_Sendrecv_replace Implantez l'algorithme de produit de matrices denses sur un anneau de processeurs (algorithme vu en cours), à l'aide de la routine MPI_Sendrecv_replace pour réaliser la circulation de données : 1. Complétez le squelette de programme "Enonce-MatrixprodRingMPI" : complétez les routines ProcessorInit (fichier init.c), ComputationAndCirculation et OneStepCirculation (fichier main.c). Enonce-MatrixprodRingMPI.zip Pour simplifier les développements, la taille des tableaux utilisés est fixée à la compilation : il vous faudra modifier votre code source et recompiler chaque fois que vous déciderez de changer le nombre de PC utilisés. 2. Compilation : Sous Linux vous utiliserez le compilateur "mpicc" d'openmpi, qui utilise gcc habituellement. Le Makefile du squelette utilise mpicc, et les comptes sur les machines cpripc# et sur le IC-cluster sont configurés pour accéder à ce compilateur. Vous pouvez cependant changer les options de compilation si elles ne vous conviennent pas. Rmq : sous Windows (non demandé dans ce BE) on peut utiliser le compilateur classique de Visual Studio et configurer le "projet" pour utiliser les fichiers d'entêtes et la bibliothèque de la version de MPI installée. 3. Exécution et mise au point : Les exécutions et les tests avec un ou plusieurs processus MPI se feront tout d'abord sur UNE seule machine pour la phase de mise au point, puis sur plusieurs machines pour la phase de mesure de performances. On multipliera des matrices de 1024x1024 "double" pour les mises au point, en lançant tous les processus sur la machine courante, c'est à dire sans préciser de liste de machines à utiliser. Ex : "mpirun -np 4./MatrixProduct". On vérifiera que l'on obtient bien les bons résultats!! Une fois le programme parallèle mis au point, on l'exécutera sur plusieurs machines en générant un fichier 'machinefile.txt' listant les PC disponibles une seule fois chacun, et en exécutant par exemple : "mpirun -np 4 -machinefile
BE MPI Bloquant Sendrecv_replace Page 2 of 2 machinefile.txt./matrixproduct" (voir plus loin pour la génération de ce fichier de machines sur le ic-cluster). 4. Mesures de performances : On multipliera des matrices de 4096x4096 "double" pour les tests de performance en précisant l'option "-machinefile machines.txt" pour lancer les processus MPI sur diverses machines (ex : "mpirun -np 4 -machinefile machines.txt MatrixProduct"). Pour évaluer rapidement le bon fonctionnement de votre implantation mesurez vos temps d'exécution sur 1 à 8 PCs en lançant seulement UN processus MPI par machine. Remarque : vous contrôlerez le nombre de processus MPI lancés par l'option "-np #" de mpirun.
BE MPI Bloquant OAR Page 1 of 2 BE de programmation MPI-1 par envois de messages bloquants Stéphane Vialle Exercice préliminaire : Prise en main du IC-cluster et de l'environnement OAR Un cluster de calcul possède toujours un environnement d'allocation/gestion de ses noeuds de calculs, et de lancement et gestion de programmes batch ou de sessions interactives. Dans le cas du IC-cluster il s'agit de l'environnement "OAR" de la communauté GRID'5000 (grille d'expérimentation française). 1. Constitution du cluster : Le IC-cluster (ou "cluster InterCell") est un cluster de 260 PCs dual-coeurs (256 PC + 4 PC de secours), équipés de processeurs Intel et installés sous Linux. Les 260 "noeuds de calcul" sont interconnectés par un unique switch Cisco Gigabit Ethernet très rapide. Cinq machines frontales sont utilisées pour accueillir les connexions des utilisateurs et pour allouer des noeuds de calcul à travers l'environnement OAR. Vous vous connecterez par ssh sur la frontale 'vera.ic' (par exemple). Vous ne vous connecterez PAS sur les noeuds de calcul par ssh, mais seulement grace aux commandes OAR. 2. Utilisation d'oar pour créer des sessions de travail interactives : La commande 'oarstat' permet de voir les 'sessions' en cours d'exécution et en attente sur le cluster. Sur le IC-cluster la commande 'oarsub -l nodes=8,walltime=5:00:00 -I' permet d'allouer 8 coeurs!! En fait, la configuration actuelle d'oar sur le IC-cluster considère des ressources de calcul, qui sont (actuellement) des coeurs. Donc, la commande précédente tente d'allouer 8 coeurs, soit 4 PC dual-coeurs, pour une durée de 5h, en mode interactif. S'il reste bien 8 coeurs de disponibles, OAR va vous allouer une session et vous logguer automatiquement sur le premier de ses 8 coeurs. Par défaut OAR alloue un seul coeur pour seulement 2h... pensez donc à préciser le nbr de coeurs voulus (deux fois le nombre de PC voulus) et la durée de session voulue! Quand une session se termine les processus en cours d'exécution dans cette session sont tués. Allouez toujours un nombre pair de coeurs, pour allouer des PC entiers (et éviter de partager un même PC avec d'autres utilisateurs). Ouvrez deux terminaux sur la frontale, puis faite une demande de session interactive par oarsub, et ensuite une commande oarstat depuis l'autre terminal sur la frontale. Vous devez observer votre session dans la liste des sessions en cours d'exécution.
BE MPI Bloquant OAR Page 2 of 2 La commande 'oardel #numéro_de_session' permet de supprimer une de vos sessions en cours d'exécution (depuis une machine frontale). Mais un simple CTRL-D entré dans la session interactive vous delogguera du premier coeur alloué, et supprimera votre session. 3. Génération de la liste des machines disponibles : Depuis n'importe quel noeud de calcul alloué par oarsub, vous disposez de la variable d'environnement : 'OAR_NODEFILE', qui indique le nom d'un fichier qui contient la liste des ressources de la session. Entrez 'more $OAR_NODEFILE' est observez la liste des ressources du cluster qui vous sont alloués. Pour générer un fichier contenant la liste des PC disponibles (la liste des "noeuds" de calcul disponibles), où chaque noeud n'est listé qu'une seule fois, exécutez la commande : sort -u $OAR_FILE_NODES > machinefile.txt Entrez 'more machinefile.txt' est observez la liste des noeuds du cluster qui vous sont alloués.