Utilisateur:Kabyhaswell/ProgrammationParallèleMPI/Exercices/Premiers pas

Leçons de niveau 17
Une page de Wikiversité, la communauté pédagogique libre.
Premiers pas
Image logo représentative de la faculté
Exercices no1
Leçon : ProgrammationParallèleMPI
Chapitre du cours : Modèle_d'exécution

Exercices de niveau 17.

Exo préc. :Sommaire
Exo suiv. :Communications_de_base
En raison de limitations techniques, la typographie souhaitable du titre, « Exercice : Premiers pas
Kabyhaswell/ProgrammationParallèleMPI/Exercices/Premiers pas
 », n'a pu être restituée correctement ci-dessus.



Lancement[modifier | modifier le wikicode]

Exercice 1-1 : lancement simple[modifier | modifier le wikicode]

Exécutez, sur votre machine, 4 processus du programme hostname

Exercice 1-2 : lancement sans options[modifier | modifier le wikicode]

Si on ne passe pas le nombre de processus avec l'option -n <N>, l'environnement d'exécution utilise tous les cœurs disponibles. En utilisant votre machine local, combien d'instances du programme hostname sont lancées si vous ne la passez pas ?

Exercice 1-3 : machinefile[modifier | modifier le wikicode]

Nous avons vu que le nombre de processus à lancer sur une machine pouvait être donné dans le machinefile. En utilisant un machinefile qui contient uniquement votre machine (donc localhost), lancez 3 instance du programme hostname sans passer l'option -n <N> au mpiexec.

Exercice 1-4 : machinefile et limites[modifier | modifier le wikicode]

On peut également donner dans le machinefile une limite au nombre de processus à lancer par machine. Écrivez un machinefile qui n’autorise pas plus de deux processus sur la machine locale.

Essayez de lancer deux instances du programme hostname avec l'option -n 2.

L'oversubscription s'autorise avec l'option --oversubscribe. Essayez de lancer trois instances du programme hostname avec l'option -n 3 et votre machinefile. Que se passe-t-il ?

L'oversubscription s'interdit avec l'option --nooversubscribe. En l’interdisant, essayez de lancer trois instances du programme hostname avec l'option -n 3 et votre machinefile. Que se passe-t-il ?


Compilation[modifier | modifier le wikicode]

Exercice 1-5 : Compilation d'un programme simple[modifier | modifier le wikicode]

Copiez le code suivant dans un fichier.

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

int main( int argc, char** argv ) {
  int rank, size;
  /* Initialisation (obligatoire) */
  MPI_Init( &argc, &argv );
  /* On détermine qui on est et combien il y a de processus, et on l’affiche) */
  MPI_Comm_size( MPI_COMM_WORLD, &size );
  MPI_Comm_rank( MPI_COMM_WORLD, &rank );
  printf( "Bonjour, je suis le processus %d/%d\n", rank, size ); 
  /* Finalisation (obligatoire) */
  MPI_Finalize();
  return EXIT_SUCCESS;
}

Essayez de le compiler avec un compilateur normal, par exemple gcc. Que se passe-t-il ? Pourquoi ?

Compilez-le maintenant avec mpicc.

Avec ldd, regardez quelles bibliothèques sont liées avec l’exécutable produit. Que constatez-vous à propos de MPI ?

Exercice 1-6 : Compilation d'un programme nécessitant des bibliothèques[modifier | modifier le wikicode]

Copiez le code suivant dans un fichier.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <mpi.h>

int main( int argc, char** argv ) {
  int rank;
  struct timespec ts;
  MPI_Init( &argc, &argv );
  MPI_Comm_rank( MPI_COMM_WORLD, &rank );
  clock_gettime( CLOCK_REALTIME, &ts );
  printf( "Bonjour, je suis le processus %d, il est %ld secondes apres l'Epoch et sqrt( 5 ) = %lf\n", rank, ts.tv_sec, sqrt( 5.0) ); 
  MPI_Finalize();
  return EXIT_SUCCESS;
}

Ce programme fait appel à deux fonctions se trouvant dans des bibliothèques : clock_gettime a besoin de librt et sqrt a besoin de libm. Certains compilateurs les incluent eux-mêmes, certaines versions de la libc les fournissent, donc il n'est pas toujours nécessaire de lier avec ces bibliothèques. Cependant, l’objet de cet exercice est d'utiliser les appels aux fonctions qui se trouvent dans ces bibliothèques en les passant à la compilation.

Compilez le programme ci-dessus en liant avec les bibliothèques nécessaires.

Avec ldd, regardez quelles bibliothèques sont liées avec l'exécutable produit.