Quelques expériences avec MPI

Ça y est, ça marche. J’y suis depuis hier, mais ça marche. Petit compte-rendu de manipes pour faire tourner un programme MPI entre deux machines Linux (apparemment, entre mon Mac et un Linux ça a pas l’air de vouloir. Tant pis).

Primo : écrire un programme MPI. J’ai trouvé çuilà sur le web :

#include "mpi.h" #include <math.h>
int main(argc,argv)      int argc;      char *argv; {   int done = 0, n, myid, numprocs, i, rc; double PI25DT = 3.141592653589793238462643;   double mypi, pi, h, sum, x, a;
  MPI_Init(&argc,&argv);   MPI_Comm_size(MPI_COMM_WORLD,&numprocs);   MPI_Comm_rank(MPI_COMM_WORLD,&myid);   while (!done)    {       if (myid == 0) {         printf("Enter the number of intervals: (0 quits) ");         scanf("%d",&n);       }       MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);       if (n == 0) 	break;       h = 1.0 / (double) n;       sum = 0.0;       for (i = myid + 1; i <= n; i += numprocs) {         x = h * ((double)i - 0.5);         sum += 4.0 / (1.0 + x*x);       }       mypi = h * sum;       MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
      if (myid == 0)         printf("pi is approximately %.16f, Error is %.16f ", pi, fabs(pi - PI25DT));     }   MPI_Finalize(); }

Ça vaut ce que ça vaut, il me fallait juste un petit exemple.

Après avoir installé ce qu’il faut, on compile le bousin :

$ mpicc.mpich -o test3.LINUX test3.c

et on vérifie que ça marche sur un proc :

$ mpirun test3.LINUX Enter the number of intervals: (0 quits) 45 pi is approximately 3.1416338058529365, Error is 0.0000411522631434 Enter the number of intervals: (0 quits) 0 $

Bon. Ensuite, pour que l’exécution se passe correctement entre les deux machines, faut pouvoir s’y connecter. On configure donc l’authentification par clé entre les deux machines (de machine1 vers machine2). Il se trouve que machine1 et machine2 partagent le home par NFS, je ne transfère donc pas la clé (mais normalement, il faut) :

machine1 $ ssh-keygen -q -f ~/.ssh/id_rsa -t rsa

(mettre une passphrase, tout ça)

machine2 $ cat id_rsa.pub >> ~/.ssh/authorized_keys

On vérifie que ça marche :

machine1 $ ssh machine2 Enter passphrase for key '/home/balise/.ssh/id_rsa': machine2 $ exit

Sur ce, on revient à la machine1, on lance ssh-agent :

machine1 $ nohup ssh-agent -s | grep -v echo > ~/.ssh-agent machine1 $ source ~/.ssh-agent Agent pid 3665

On rajoute une paire de trucs dans le profile :

[ -z "$SSH_CLIENT" ] && . $HOME/.ssh-agent alias keyon="ssh-add -t 10800" alias keyoff='ssh-add -D' alias keylist='ssh-add -l'

ce qui permet de lancer keyon, après avoir re-sourcé le profile :

machine1 $ source ~/.bash_profile machine1 $ keyon Enter passphrase for /home/balise/.ssh/id_rsa: Identity added: /home/balise/.ssh/id_rsa (/home/balise/.ssh/id_rsa) Lifetime set to 10800 seconds

On vérifie que tout est OK pour le login avec clé :

machine1 $ ssh machine2 machine2 $ exit

o/.

On édite alors le fichier /usr/lib/mpich/share/machines.LINUX pour y mettre

machine1 machine2

Un petit export de variable :

machine1 $ export P4_RSHCOMMAND=/usr/bin/ssh

et voila :

machine1 $ mpirun -np 2 test3.LINUX Enter the number of intervals: (0 quits) 42 pi is approximately 3.1416398947081130, Error is 0.0000472411183199 Enter the number of intervals: (0 quits) 0

Juste pour vérifier ce qui est effectivement exécuté :

machine1 $ mpirun -np 2 -t test3.LINUX Procgroup file: machine1 0 /home/balise/mpi/test3.LINUX machine2 1 /home/balise/mpi/test3.LINUX "/home/balise/mpi/test3.LINUX"  -p4pg "/home/balise/mpi/PI7009" -p4wd "/home/balise/mpi"

Et voila, on est content, on peut faire la danse de l’ingénieur.

Un commentaire sur « Quelques expériences avec MPI »

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.