MPI通信延迟 - 消息的大小是否重要?

时间:2011-12-08 20:38:25

标签: time matrix benchmarking delay mpi

我一直在使用并行算法中的时间测量(基准测试),更具体的矩阵乘法。我正在使用以下算法:

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,则每个节点的迭代次数等于4150万,而如果A是2400000x6而B是6x6,则每个节点迭代2880万次。虽然第二种情况需要较少的迭代次数,但它需要大约1.00秒,而第一种情况只需要大约0.46秒。

逻辑上,第二个应该更快,因为它每个节点的迭代次数更少。 做一些数学计算,我意识到MPI在第一个案例中每个消息发送和接收83,000个元素,在第二个案例上发送和接收4,800,000个元素。

消息的大小是否证明了延迟?

1 个答案:

答案 0 :(得分:1)

通过MPI发送的消息大小肯定会影响性能 你的代码看一下流行的MPI中发布的THESE图表 实施的网页。

正如您在第一张图中所看到的,通信延迟会增加 消息大小。此趋势适用于任何网络,而不仅仅适用于InfiniBand 如图中所示。