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;