2016-09-20 3 views
1

Я пытаюсь отправить сообщение размером 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 байта или что-то в этом роде, но я не могу понять это.

Любая помощь будет оценена!

+1

Миллисекунда - долгое время в компьютерной земле. Вы пытались посмотреть значение tv_usec для обеих временных меток? Вы можете обнаружить, что они разные. Кроме того, в зависимости от вашей ОС значения с высоким разрешением могут не поддерживаться. Вы также должны проверить возвращаемое значение из 'gettimeofday', чтобы убедиться в его успешности. – paddy

+4

Два комментария: 1/вы делите '(t2.tv_usec-t1.tv_usec)' на '1000', который является целым делением, поэтому результат равен 0. и 2/лучше использовать 'MPI_Wtime()', цель которого именно такова. – Gilles

+1

Вы не проверяете возвращаемое значение 'MPI_Recv'. Он может сбой ... – LPs

ответ

1

Может быть, лучший способ для измерения времени, чтобы измерить его в микросекундах

(t2.tv_sec - t1.tv_sec) * 1000000 + t2.tv_usec - t1.tv_usec 

и посмотреть, если вы получаете какие-либо значения.

+0

Это привело к появлению номеров. Думаю, я не ожидал, что значения будут меньше одной миллисекунды. Они все еще намного ниже, чем ожидалось, но это еще одна проблема. Благодаря! –

Смежные вопросы