Messages asynchrones securises avec MPI

  
Principe

Programme : 

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

#define SIZE 32
int main(int argc, char* argv[])
{

double startwtime, endwtime;
int namelen, numprocs, myid, err, flag, combien=0 ;
MPI_Status status ;
char processor_name[MPI_MAX_PROCESSOR_NAME], buff[SIZE] ;
MPI_Request requete ;
MPI_Init(∓argc,∓argv);

startwtime = MPI_Wtime();
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(processor_name,&namelen);
fprintf(stderr,"\nProcessus %d sur la machine %s parmi %d processus.\n", myid, processor_name, numprocs);
if (numprocs != 3) fprintf(stderr,"Il me faut 3 processus !\n") ;

if (myid==0)
{

MPI_Isend((void*) "Message 1", SIZE*sizeof(char), MPI_CHAR, 1, 1, MPI_COMM_WORLD, ∓requete) ;

fprintf(stderr,"%d envoie [%s].\n",myid,"Message 1") ;
/* Attends que la communication soit ok */
MPI_Wait(&requete, &status) ;
system("sleep 3") ;

MPI_Isend((void*) "Message 2", SIZE*sizeof(char), MPI_CHAR, 2, 1, MPI_COMM_WORLD, ∓requete) ;

fprintf(stderr,"%d envoie [%s].\n",myid,"Message 2") ;
/* test la communication */
MPI_Test(&requete, &flag, &status) ;

if (flag) fprintf(stderr,"Le second envoi s'est bien passe.\n") ;

else fprintf(stderr,"Le second envoi s'est mal passe.\n") ;

}

else { /* se met en attente d'une reception asynchrone */

MPI_Irecv(buff, SIZE*sizeof(char), MPI_CHAR, 0, MPI_ANY_TAG, MPI_COMM_WORLD, ∓requete) ;

do { /* test la communication */

MPI_Test(&requete, &flag, &status) ;
if (flag) fprintf(stderr,"%d a recu <%s>.\n",myid,buff) ;

else

{

fprintf(stderr,"La reception sur %d s'est mal passee.\n", myid) ;
system("sleep 1") ;

}

} while (!flag) ;

}

endwtime = MPI_Wtime();
printf("Temps ecoule sur %d : %f\n", myid, endwtime-startwtime);
MPI_Finalize();
return 0;

}


Resultat de l'execution :

Processus 0 sur la machine lil. parmi 3 processus.

0 envoie [Message 1].

Processus 1 sur la machine lil. parmi 3 processus.

1 a recu <Message 1>.

Processus 2 sur la machine lil. parmi 3 processus.

La reception sur 2 s'est mal passee.

Temps ecoule sur 1 : 0.001697

La reception sur 2 s'est mal passee.

La reception sur 2 s'est mal passee.

0 envoie [Message 2].

Le second envoi s'est bien passe.

Temps ecoule sur 0 : 3.034710

2 a recu <Message 2>.

Temps ecoule sur 2 : 3.093239


Ph. RIS 1997