Table of Contents
- 1. Espace de travail :
- 2. Utilisation de gdb avec MPI :
- 2.1. -gdb avec mpich2 (ma version, déconseillé mais fonctionne très bien)
- 2.2. une console par proc MPI (Vincent Perrier) :
- 2.3. un screen par proc MPI (Xavier Lacoste) : http://bfroehle.com/2011/09/14/debugging-mpi-python/
- 2.4. option « detach-on-fork » de gdb ?
- 2.5. une barrière MPI (François Pellegrini) :
- 2.6. ddt (sur PlaFRIM)
- 3. Utilisation de valgrind avec MPI :
- 4. mpi avec valgrind et gdb
1 Espace de travail :
1.1 connexion à une des machines suivantes : loki agni vulcain hephaistos
1.2 ~/<login>/{src,bin,test}
1.3 compilation depuis src
make install
1.4 exécution depuis test
1.5 suggestion d'avoir un screen :
1.5.1 un screen a été créé par utilisateur
1.5.2 pour le réattacher, il faut tapper :
screen -dr <login>
1.5.3 C-a C-a pour changer de fenêtre
2 Utilisation de gdb avec MPI :
2.1 -gdb avec mpich2 (ma version, déconseillé mais fonctionne très bien)
2.1.1 avant la compilation, lors du configure il faut mettre option –with-pm=mpd,hydra
2.1.2 exemple :
mpirun -gdb -n 4 ../bin/ring r <args>
2.2 une console par proc MPI (Vincent Perrier) :
mpirun -n 4 xterm -sb -geometry 200x50+0+900 -sl 1000 -hold -e gdb --eval-command=run --args ../bin/ring
2.3 un screen par proc MPI (Xavier Lacoste) : http://bfroehle.com/2011/09/14/debugging-mpi-python/
2.4 option « detach-on-fork » de gdb ?
2.4.1 est-ce qu'elle pourrait fonctionner avec MPI ?
2.5 une barrière MPI (François Pellegrini) :
if (rank == 0) { char c; printf ("Waiting for key press...\n"); scanf ("%c", &c); } MPI_Barrier (comm);
2.6 ddt (sur PlaFRIM)
3 Utilisation de valgrind avec MPI :
3.1 compiler valgrind
3.1.3 vérifier la ligne dans la sortie du configure afin que le wrapper puisse
être bien généré
checking primary target for usable MPI2-compliant C compiler and mpi.h... yes, /opt/mpich2-1.5rc3-mpd-hydra/bin/mpicc checking secondary target for usable MPI2-compliant C compiler and mpi.h... no
3.2 Premier exemple :
mpirun -n 4 valgrind ../bin/ring
3.2.1 Trop d'erreurs de MPI
3.2.2 Les sorties de valgrind sont par processeur et il peut être fastidieux de
retrouver ses petits lorsque le nombre de processeurs devient important. Il est nécessaire de trouver aisément quel processeur est à l'origine de quelle sortie.
- afficher la correspondance entre processus MPI et numéro de processus au
niveau système
char procnam[MPI_MAX_PROCESSOR_NAME] ; int namelen; MPI_Get_processor_name(procnam,&namelen); printf ("Processus %d, host: %s, with MPI rank %d on %d\n", getpid(), procnam, world_rank, world_size);
LD_PRELOAD=/opt/valgrind-3.9.0/lib/valgrind/libmpiwrap-amd64-linux.so mpirun -n 4 valgrind ../bin/ring2
3.2.3 trop de sorties qui peuvent être imbriquées les unes aux autres
- rediriger sortie standard ou d'erreur par proc mpi
ce qui permet également de voir sur certains clusters les sorties en temps réel (comme Avakas)
#include <fcntl.h> ... int bak, new; char s[50]; ... fflush (stdout); bak = dup (1); sprintf (s, "out_%d", world_rank); new = open(s, O_CREAT|O_WRONLY|O_TRUNC, 0600); dup2 (new, 1); ... fflush (stdout); dup2 (bak, 1); close (bak);
LD_PRELOAD=/opt/valgrind-3.9.0/lib/valgrind/libmpiwrap-amd64-linux.so mpirun -n 4 valgrind ../bin/ring3
3.3 si la compilation de valgrind n'est pas suffisante pour les erreurs de MPI
3.3.1 utiliser les fichiers de suppressions d'erreurs
- attention à être au plus près des erreurs que vous voulez supprimer, sinon
vous risquez de ne plus voir certaines de vos erreurs
- un exemple dans l'installation de valgrind :
/opt/valgrind-3.9.0/lib/valgrind/default.supp
- la possibilité de les générer à la volée :
valgrind --leak-check=full --show-reachable=yes --error-limit=no --gen-suppressions=all --log-file=minimalraw.log ./minimal
- pour plus d'infos : https://wiki.wxwidgets.org/Valgrind_Suppression_File_Howto
3.4 sur PlaFRIM :
3.4.1 il faut rajouter après mpirun : « –mca btl tcp,self »
4 mpi avec valgrind et gdb
4.1 options –vgdb=yes –vgdb-error=1
4.1.1 quelle version de gdb ?
4.1.2 quelle version de valgrind ?
4.2 ligne à mettre dans ~/.gdbinit
define vg target remote | vgdb --pid=$arg0 end document vg Start a vgdb relay application with specified pid process (arg0) end
4.3 premier exemple :
4.3.1 décommenter la partie 51 à 58 de ring3.c
4.3.2 à faire dans un terminal :
LD_PRELOAD=/opt/valgrind-3.9.0/lib/valgrind/libmpiwrap-amd64-linux.so mpirun -n 4 valgrind --vgdb=yes --vgdb-error=0 ../bin/ring3
4.3.3 chercher le numéro de proc <p> dans un fichier out*
4.3.4 dans un autre terminal depuis test (en remplaçant <p> par le numéro de proc identifié ci-dessus) :
gdb ../bin/ring3 vg <p>
4.4 deuxième exemple :
4.4.1 à faire dans un terminal :
LD_PRELOAD=/opt/valgrind-3.9.0/lib/valgrind/libmpiwrap-amd64-linux.so mpirun -n 4 valgrind --vgdb=yes --vgdb-error=3 ../bin/ring3
4.4.2 chercher le numéro de proc <p> dans un fichier out*
4.4.3 dans un autre terminal depuis test (en remplaçant <p> par le numéro de proc identifié ci-dessus) :
gdb ../bin/ring3 vg <p>