Я пытаюсь отправить сообщение размером 1Mb с использованием MPI_Send и MPI_Recv и измерить, сколько времени потребуется, чтобы отправить это сообщение. Вот мой c-код.MPI_Send и MPI_Recv, измеряя время передачи сообщения 1Mb
#include <stdio.h>
#include <mpi.h>
#include <assert.h>
#include <sys/time.h>
int main(int argc,char *argv[])
{
int rank,p;
struct timeval t1,t2;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&p);
printf("my rank=%d\n",rank);
printf("Rank=%d: number of processes =%d\n",rank,p);
assert(p>=2);
if(rank==0) {
int x[255] = { 0 };
int dest = 7;
int i = 0;
while (i<254)
{
x[i] = 255;
i++;
}
gettimeofday(&t1,NULL);
MPI_Send(&x[0],255,MPI_INT,dest,1,MPI_COMM_WORLD);
gettimeofday(&t2,NULL);
int tSend = (t2.tv_sec-t1.tv_sec)*1000 + (t2.tv_usec-t1.tv_usec)/1000;
printf("Rank=%d: sent message %d to rank %d; Send time %d millisec\n", rank,*x,dest,tSend);
} else
if (rank==7) {
int y[255]={0};
MPI_Status status;
gettimeofday(&t1,NULL);
MPI_Recv(&y[0],255,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
gettimeofday(&t2,NULL);
int tRecv = (t2.tv_sec-t1.tv_sec)*1000 + (t2.tv_usec-t1.tv_usec)/1000;
printf("Rank=%d: received message %d from rank %d; Recv time %d millisec\n",rank,*y,status.MPI_SOURCE,tRecv);
}
MPI_Finalize();
}
Этот код компилируется и работает нормально, но он всегда говорит, что он завершает отправку и прием в 0 миллисекунд, что невозможно. Я предполагаю, что мой синтаксис при отправке массива неправильный, поэтому я просто отправляю 4 байта или что-то в этом роде, но я не могу понять это.
Любая помощь будет оценена!
Миллисекунда - долгое время в компьютерной земле. Вы пытались посмотреть значение tv_usec для обеих временных меток? Вы можете обнаружить, что они разные. Кроме того, в зависимости от вашей ОС значения с высоким разрешением могут не поддерживаться. Вы также должны проверить возвращаемое значение из 'gettimeofday', чтобы убедиться в его успешности. – paddy
Два комментария: 1/вы делите '(t2.tv_usec-t1.tv_usec)' на '1000', который является целым делением, поэтому результат равен 0. и 2/лучше использовать 'MPI_Wtime()', цель которого именно такова. – Gilles
Вы не проверяете возвращаемое значение 'MPI_Recv'. Он может сбой ... – LPs