CSC 5001– High Performance Systems

Portail informatique

MPI - Travaux Pratiques

Hello world

Le but de cet exercice est de découvrir la chaine de compilation et de déploiement de MPI.

Écrire le programme MPI hello.c affichant "Hello from task <rank> / <nb tasks> on <machine>". Pour cela:
  • Initialisez MPI
  • Récupérez le rang MPI du processus courant
  • Récupérez le nombre de processus MPI
  • Récupérez le nom de la machine sur laquelle s'exécute le processus (cf man gethostname)
  • Finalisez MPI

  • Compilez-le et exécutez-le sur une ou plusieurs machines
  • Rappel sur mpirun:
    • -n <X> permet de controler le nombre de processus créés
    • -f spécifie les machines sur lesquelles lancer les processus
Vous devriez obtenir un affichage de ce type:
$ mpirun -f hosts -np 4 ./hello1 Hello World from task 2 / 4 on b313-03 Hello World from task 3 / 4 on b313-04 Hello World from task 1 / 4 on b313-02 Hello World from task 0 / 4 on b313-01

Modifiez le programme hello.c afin que les affichages soient ordonnés (ie. le rang 0 affiche en premier, puis le rang 1, etc.)

Pour cela, chaque rang N attend que le rang N-1 ait affiché son message, affiche son message, puis notifie le processus N+1.

Vous devriez obtenir un affichage ressemblant à:

$ mpirun -f hosts -np 4 ./hello2 Hello World from task 0 / 4 on b313-01 Hello World from task 1 / 4 on b313-02 Hello World from task 2 / 4 on b313-03 Hello World from task 3 / 4 on b313-04

Paralléliser une application

L'application stencil calcule une diffusion 2D (du type équation de la chaleur). Une matrice contient des valeurs (eg. la température d'un point de l'espace), et à chaque itération un stencil à 5 points est appliqué: pour chaque point (i,j), on calcule

Vk+1(i,j) = Vk(i-1, j) + Vk(i, j-1) + Vk(i, j) + Vk(i+1, j) + Vk(i, j+1)

Le programme génère un nombre aléatoire de "points chauds", calcule plusieurs itérations et écrit le résultat dans le fichier result.dat. Ce résultat peut être visualisé avec le script plot.gp (qui nécessite le logiciel GNUplot):

$ mpirun -np 1 ./stencil_mpi Initialization (problem size: 100) Start computing (50 steps) STEP 0... STEP 1... STEP 2... [...] STEP 49... 50 steps in 0.006758 sec (0.000135 sec/step) dumping the result data in result.dat $ ./plot.gp $ evince result.pdf

Le but de l'exercice est de paralléliser l'application avec MPI. Afin de simplifier la mise en oeuvre, chaque rang MPI manipule une matrice de taille N x N et calcule les valeurs de Vk+1(1,1) à Vk+1(N-2,N-2) à partir des valeurs de Vk(0,0) à V(N-1, N-1).

Complétez le code de stencil_mpi.c afin d'ajouter les communications MPI:
  • Après chaque itération le processus de rang MPI rank envoie la ligne 1 de cur_step au rang rank-1 et la ligne N-2 de cur_step au rang rank+1
  • Après chaque itération, le processus de rang MPI rank reçoit la ligne envoyée par rank-1 et la stocke dans next_step[0], et reçoit la ligne envoyée par rank+1 et la stocke dans next_step[N-1]
  • À la fin du programme, chaque processus envoie sa matrice au processus 0 afin d'écrire le résultat dans un fichier.

Communications non-bloquantes

Au lieu de calculer l'ensemble des points d'une matrice, puis envoyer certaines lignes aux voisins, on souhaite utiliser des communications non bloquantes afin de "cacher" le coût des communications: en calculant en premier les lignes à envoyer, on peut démarrer les communications, puis calculer les lignes restantes, avant d'attendre la fin des communications.

Modifiez votre programme afin d'implémenter cet algorithme.