Messages asynchrones bufferises securises avec MPI

  
Principe

Programme : 

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

#define SIZE 1000

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

{

    int namelen, numprocs, myid, size, flag ;

    char processor_name[MPI_MAX_PROCESSOR_NAME], buff[SIZE], msg[SIZE] ;

    MPI_Status status ;

    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)

    {

      strcpy(msg,"Message 1") ;

      size=sizeof(char)*strlen(msg) ;

      fprintf(stderr,"%d envoie [%s]\n",myid, msg) ;

      MPI_Buffer_attach( buff, SIZE) ;

      MPI_Ibsend((void*) msg, size, MPI_CHAR, 1, 1, MPI_COMM_WORLD, &requete) ;

      /* Attends que la communication soit ok */

      MPI_Wait(&requete, &status) ;

      system("sleep 3") ; strcpy(msg,"Message 2") ;

      fprintf(stderr,"%d envoie [%s]\n",myid,msg) ;

      MPI_Ibsend((void*) msg, 15, MPI_CHAR, 2, 1, MPI_COMM_WORLD, &requete) ;

      /* 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") ;

      MPI_Buffer_detach(buff, &size) ;

    } else

    { strcpy(msg,"") ;

      MPI_Irecv(msg, 15, 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, msg) ;

        else

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

        system("sleep 1") ;

        }

      } while (!flag) ;

    }

    /** heure de fin **/

    endwtime = MPI_Wtime();

    printf("Temps ecoule sur %d = %f\n", myid, endwtime-startwtime);

    /** fin du pg **/

    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.001695

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.037471

2 a recu <Message 2>.

Temps ecoule sur 2 = 3.085405


Ph. RIS 1997