Ç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.
Je regarde danser l’ingé, j’ai rien compris, mais je regarde danser l’ingé… Bravo à toi, ma belle ! 😉