Table of Contents

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.1 MPI doit être en bibliothèque dynamique

  1. option –enable-shared pour MPICH

3.1.2 Mettre la dépendance vers MPI

  1. –with-mpicc=/opt/mpich2-1.5rc3-mpd-hydra/bin/mpicc

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

  1. la solution est de précharger le wrapper de valgrind pour MPI à l'aide de LDPRELOAD
    LD_PRELOAD=/opt/valgrind-3.9.0/lib/valgrind/libmpiwrap-amd64-linux.so mpirun -n 4 valgrind ../bin/ring
    

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.

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

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

  1. attention à être au plus près des erreurs que vous voulez supprimer, sinon

    vous risquez de ne plus voir certaines de vos erreurs

  2. un exemple dans l'installation de valgrind :

    /opt/valgrind-3.9.0/lib/valgrind/default.supp

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

4.4.4 gdb nous indique la ligne où valgrind a identifié une erreur

Created: 2019-11-15 or. 17:06

Validate