#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
double getL (int measure, int mirror, int rank)
{
int i;
double start, stop,rtt,L;
int *buffer;
MPI_Status mpi_stat;
buffer = (int *) malloc (sizeof(int));
start = stop = rtt = L = 0.0;
if (rank == measure)
{
start = MPI_Wtime();
// Envoyer un message de taille 0 vers le processus 1 (mirror)
// ...
// attendre la rponse du processus 1
// ...
stop = MPI_Wtime();
rtt = (stop - start);
L = rtt/2;
}
else
{
// attendre le message du processus 0
// ...
// envoyer une rponse vers le processus 0
// ...
}
return (L);
}
double getTput (int measure, int mirror, int rank, int size,double L)
{
int i;
double start, stop, total ,tput;
int *buffer;
MPI_Status mpi_stat;
buffer = (int *) malloc (size*sizeof(int));
start = stop = total = tput = 0.0;
if (rank == measure)
{
/* il faudrait faire quelques communications pour "chauffer"
* le rseau, mais faisons simple */
start = MPI_Wtime();
// Envoyer un message de taille size vers le processus 1
// ...
// attendre la rponse du processus 1
// ...
stop = MPI_Wtime();
total = stop - start;
tput = size/(total-(2*L/1E6));
}
else
{
// attendre le message de taille size du processus 0
// ...
// envoyer une rponse vers le processus 0
// ...
}
return (tput);
}
int main (int argc, char **argv)
{
int rank;
int size;
int msgsize;
int i;
double NWS_Latency, NWS_Tput;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
if (size != 2)
{
if (rank==0)
printf("Cette exprience requiert SEULEMENT deux processus\n");
exit(0);
}
NWS_Latency = getL(0,1,rank);
// tester avec diffrentes tailles de message
msgsize=1048576;
NWS_Tput = getTput(0,1,rank,msgsize,NWS_Latency);
if (rank == 0)
{
printf("Valeurs de Latence et Dbit au niveau d'une application MPI\n");
printf("Latence = %f microsecondes\n",(NWS_Latency*1E06));
printf("Debit = %f Mo/s\n", (NWS_Tput/1E06));
}
MPI_Finalize();
}