Il nucleo della funzione che implementa il test Roundtrip è :
elapsed_time = 0;
if(ctx->is_master){ /*sono il processo 0?*/
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;/*to contiene il
pid dell'altro processo*/
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,0,MPI_COMM_WORLD,&status);/*sincronizzazione*/
t0=MPI_Wtime();
for(i=0;i<reps;i++){
MPI_Send(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),MPI_COMM_WORLD,&status);
}
t1=MPI_Wtime();
elapsed_time = t1 -t0;
}
if(ctx->is_slave){/*sono il processo compagno di 0? di defualt sarò
processo con pid size-1*/
recv_from = MPI_ANY_SOURCE;
if (source_type == SpecifiedSource) recv_from = to;/*to contiene il
pid del compagno,cioè 0*/
MPI_Send(sbuffer,len,MPI_BYTE,from,0,MPI_COMM_WORLD);
for(i=0;i<reps;i++){
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),MPI_COMM_WORLD,&status);
MPI_Send(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
}
}
dove :
L'algoritmo :
L'ultima fase è quella si smoothing dove una apposita funzione scorre la lista dei risultati e per ogni nodo calcola una stima del suo valore in base al precedente ed al successivo :
t_est:= (t_successivo-t_precedente)/(dim_msg_successivo-dim_msg_precedente)*(dim_msg_attuale-dim_msg_precedente) + t_precedente.
se il risultato del test è sbagliato di oltre il 10% rispetto al tempo stimato si ripete il test di quel particolare nodo.