0% ont trouvé ce document utile (0 vote)
271 vues5 pages

Exercices Avec Solution MPI

Transféré par

Mohamed Bthabet
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
271 vues5 pages

Exercices Avec Solution MPI

Transféré par

Mohamed Bthabet
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 5

Exercices MPI avec solutions

Remarques :

MPI_Comm_size() : donne le nombre total de processeurs.

MPI_Comm_rank() : donne le numéro du processeur courant.

MPI_Get_processeur_name() : donne le nom de la machine contenant le


processeur courant.

Le programme MPI commence toujours par : MPI_Init() ;

Le programme MPI se termine toujours par MPI_Finalize() ;

Exercice 1 :
Ecrire un programme en MPI qui calcule le rang du processeur courant, le nombre total de
processeurs et le temps du déroulement du programme.

Il affiche le message suivant « processeur numéro (le rang du processeur courant) sur la
machine (le nom de la machine courante) parmi (le nombre de processeurs) processeurs.

Si le nombre de processeurs est différent de 4, affiche le message suivant «il faut avoir 4
processeurs ».

Solution Exercice 1 :
 include < studio.h >

 include " mpi.h "

main (int argc, char * argv[]) {

double debut_temps, fin_temps;

int nom_long, nbr_proc, rang ;

char nom_proc [MPI_MAX_PROCESSOR_NAME] ;

MPI_Init (& argc, & argv) ;

Debut_temps = MPI_Wtime();

MPI_Comm_rank (MPI_COMM_WORLD, & rang);

MPI_Comm_size (MPI_COMM_WORLD, & nbr_proc);

1
MPI_Get_processor_name (nom_proc, nom_long);

printf ( “ processeur numéro %d sur la machine %s parmi %d processeurs \n”, rang,


nom_proc,num_proc);

if (num_proc != 4) fprintf (“ il faut avoir 4 processeurs \n”);

fin_temps = MPI_Wtime() ;

printf ( “ temps écoulé sur %d = %f \n”, num_proc, fin_temps – debut_temps);

MPI_Finalize () ;

return 0;

Commentaires sur la solution de l’exercice 1:


MPI_Wtime()  donne le temps du déroulement du programme.

MPI_MAX_PROCESSOR_NAME : est une constante qui donne la longueur du nom du


processeur le plus long.

Exercice 2 :
Calculer la moyenne des nombres avec MPI_Gather() et MPI_Scatter() .

Solution Exercice 2 :
 include < studio.h >

 include < stdlib.h >

 include " mpi.h "

main (int argc, char * argv[]) {

int nbr_proc, rang ;

MPI_Init (& argc, & argv) ;

MPI_Comm_rank (MPI_COMM_WORLD, & rang);

MPI_Comm_size (MPI_COMM_WORLD, & nbr_proc);

If (rang == 0) {

// La fonction creer_nbrs_alea (….) génère un tableau des nombres aléatoires.

2
nbrs_alea = creer_nbrs_alea (element_par_paroc, nbr_proc) ;

// Création d’un buffer qui va contenir le sous ensemble des nombres aléatoires

float * sous_nbrs_alea = maloc (sizeof(float) * elements_par_proc) ;

// Diviser et envoyer les nombres aléatoires du processeur 0 vers tous les autres processeurs

MPI_Scatter ( nbrs_alea, elements_par_proc, MPI_FLOAT, 0, MPI_COMM_WORLD) ;


La racine
// calculer la moyenne de tous les sous ensembles

float sous_moy = calculer_moy (sous_nbr_alea, elements_par_proc) ;

// Grouper (Gather) tous les moyennes parallèles dans le processeur racine

float * sous_moys = NULL ;

if ( rang == 0) {

// Réservation de l’espace mémoire du tableau Sous_moys

Sous_moys = malloc (sizeof (float) * nbr_proc) ;

MPI_Gather (& sous_moy, 1, MPI_FLOAT, sous_moys, 1, MPI_FLOAT, 0,


MPI_COMM_WORLD) ; La destination

MPI_Finalize () ;

return 0;

3
Exercice 3 :
Calculer la moyenne des nombres avec MPI_Reduce ().

Solution Exercice 3 :
 include < studio.h >

 include < stdlib.h >

 include " mpi.h "

main (int argc, char * argv[]) {

int nbr_proc, rang ;

MPI_Init (& argc, & argv) ;

MPI_Comm_rank (MPI_COMM_WORLD, & rang);

MPI_Comm_size (MPI_COMM_WORLD, & nbr_proc);

float * nbrs_alea = NULL;

nbrs_alea = creer_nbrs_alea ( elements_par_proc);

// Somme des nombres locales

float som_locale = 0 ;

int i ;

for (i=0; i<nb_elements_par_proc; i++) {

som_locale += nbr_alea [i];

// afficher les nombres aléatoires dans chaque processeur

printf (“la somme locale pour le processeur %d est : %f \n“, rang, som_locale) ;

// réduire (reduce) toutes les sommes locales en somme globale

MPI_Reduce (& som_locale, 1, MPI_FLOAT , & som_globale, 1, MPI_FLOAT, MPI_SUM,


0, MPI_COMM_WORLD) ;

// Afficher le résultat

La racine 4
If (rang==0)

float moy_globale = som_globale / (nbr_proc*element_par_proc) ;

printf (“ somme totale = %f , la moyenne totale est :%f \n“, som_globale, moy_globale) ;

MPI_Finalize () ;

return 0;

Exercices additionnelles :
- Ecrire un programme MPI permettant de réaliser les calculs
matricielles entre deux matrices A et B en utilisant 10
processeurs (addition, soustraction, multiplication, matrice
inverse, transposé, etc …).
- Expliquer la différence entre MPI, Cuda et OpenMP par un
exemple de programmation.
- Ecrire un programme en MPI permettant de résoudre un
problème d’intelligence artificielle (en imagerie, robotique,
détection d’objets, réseaux de neurone, etc…)

Vous aimerez peut-être aussi