Задержка связи MPI - имеет ли значение размер сообщения? - PullRequest
1 голос
/ 09 декабря 2011

Я работал с измерением времени (бенчмаркингом) в параллельных алгоритмах, точнее, с умножением матриц. Я использую следующий алгоритм:

if(taskid==MASTER) {
  averow = NRA/numworkers;
  extra = NRA%numworkers;
  offset = 0;
  mtype = FROM_MASTER;
  for (dest=1; dest<=numworkers; dest++)
  {
     rows = (dest <= extra) ? averow+1 : averow;    
     MPI_Send(&offset, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD);
     MPI_Send(&rows, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD);
     MPI_Send(&a[offset][0], rows*NCA, MPI_DOUBLE, dest, mtype,MPI_COMM_WORLD);
     MPI_Send(&b, NCA*NCB, MPI_DOUBLE, dest, mtype, MPI_COMM_WORLD);
     offset = offset + rows;
  }
  mtype = FROM_WORKER;
  for (i=1; i<=numworkers; i++)
  {
     source = i;
     MPI_Recv(&offset, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status);
     MPI_Recv(&rows, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status);
     MPI_Recv(&c[offset][0], rows*NCB, MPI_DOUBLE, source, mtype, 
              MPI_COMM_WORLD, &status);
     printf("Resultados recebidos do processo %d\n",source);
  }
}

else {
  mtype = FROM_MASTER;
  MPI_Recv(&offset, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status);
  MPI_Recv(&rows, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status);
  MPI_Recv(&a, rows*NCA, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD, &status);
  MPI_Recv(&b, NCA*NCB, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD, &status);

  for (k=0; k<NCB; k++)
     for (i=0; i<rows; i++)
     {
        c[i][k] = 0.0;
        for (j=0; j<NCA; j++)
           c[i][k] = c[i][k] + a[i][j] * b[j][k];
     }
  mtype = FROM_WORKER;
  MPI_Send(&offset, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD);
  MPI_Send(&rows, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD);
  MPI_Send(&c, rows*NCB, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD);
}

Я заметил, что для квадратных матриц это занимает меньше времени, чем для прямоугольных. Например: если я использую 4 узла (один в качестве главного), и A равен 500x500, а B равен 500x500, число итераций на узел равно 41,5 миллиона, тогда как если A равно 2400000x6 и B равно 6x6, оно повторяется 28,8 миллиона раз на узел. Хотя второй случай занимает меньше итераций, он занял около 1,00 секунды, а первый - всего около 0,46 секунды.

Логически, второе должно быть быстрее, учитывая, что на узел приходится меньше итераций. Делая некоторую математику, я понял, что MPI отправляет и получает 83 000 элементов на сообщение в первом случае и 4 800 000 элементов во втором.

Оправдывает ли размер сообщения задержку?

1 Ответ

1 голос
/ 13 декабря 2011

Размер сообщений, отправляемых через MPI, определенно повлияет на производительность вашего кода.Посмотрите на ЭТИ графики, размещенные на одной из популярных страниц реализации MPI.

Как видно на первом графике, задержка связи увеличивается с размером сообщения.Эта тенденция применима к любой сети, а не только к InfiniBand, как показано на этом графике.

...