MPI C中的一般运行时测量

时间:2015-09-27 19:33:10

标签: c mpi barrier

目标是衡量运行时间与#of进程的关系。

我只是MPI的初学者并被困在某个地方。

我写了一个hello world程序,想要测试全局运行时。

我尝试使用barrier,以确保在测量系统时间之前所有进程都终止,但是我遇到了分段错误。

我的代码:

#include <mpi.h> 
#include <stdio.h> 
int main(int argc, char *argv[]) {
  double time1, time2;
  double duration=0.0000;
  int npes, myrank;
  time1 = clock();
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &npes);
  MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
  printf("From process %d out of %d, Hello World!\n", myrank, npes);
  time2 = clock();
  if (time2-time1>duration) {
    duration = time2-time1;
  }
  duration = time2-time1;
  MPI_BARRIER(MPI_COMM_WORLD);
  printf("runtime is %f ", duration);
  MPI_Finalize();
  return 0;
}

帮我弄清楚为什么我会出现分段错误?

1 个答案:

答案 0 :(得分:1)

我可以从代码中注意到的第一件事是你已经测量了MPI_Barrier之前的时间,这意味着甚至在所有进程打印“hello world"之前就可以测量运行时。”确保正确性衡量MPI_Barrier之后的时间。

此外,您可能希望使用MPI_Wtime()来衡量MPI流程所用的时间。

您的代码只会在每台机器上打印运行时,为了计算全局运行时,您必须使用MPI_Reduce。此函数将计算指定的操作(在本例中为MAX)并将结果存储在根目录中。

所以这就是你的代码应该是什么样的:

#include <mpi.h> 
#include <stdio.h> 
int main(int argc, char *argv[]) {
   double time1, time2,duration,global;
   int npes, myrank;
   MPI_Init(&argc, &argv);
   time1 = MPI_Wtime();
   MPI_Comm_size(MPI_COMM_WORLD, &npes);
   MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
   printf("From process %d out of %d, Hello World!\n", myrank, npes);
   MPI_Barrier(MPI_COMM_WORLD);
   time2 = MPI_Wtime();
   duration = time2 - time1;
   MPI_Reduce(&duration,&global,1,MPI_DOUBLE,MPI_MAX,0,MPI_COMM_WORLD);
   if(myrank == 0) {
       printf("Global runtime is %f\n",global);
   }
   printf("Runtime at %d is %f \n", myrank,duration);
   MPI_Finalize();
   return 0;
}