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