如何多次运行相同的MPI程序

时间:2016-11-04 01:13:01

标签: mpi mpich mpic++

我有一个MPI程序来计算排序时间。我用mpirun -np 2 mpiSort运行它。所以这给了我2个过程的排序时间。

我想让排序时间达到平均5次。我该如何自动完成?

如果我在mpiSort程序中进行循环。它实际上执行5(次)x 2(处理)= 10次。

编辑:mpiSort并行进行排序。基本上,我尝试mpirun -np 2 mpiSort而没有输入5次。因为我想对4个核心,8个核心做同样的事情。

2 个答案:

答案 0 :(得分:0)

您可以使用mpirun -np 5 mpiSort在五个核心上运行,并在末尾添加MPI_gather。排序代码实际上是否使用MPI(即在开头调用MPI_init?)。假设你是,你可以在5个内核上运行,最后只需使用reduce进行平均,

# include <mpi.h>
#include <iostream>
using namespace std;

int main ( int argc, char *argv[] )
{

    int ierr, rank, nprocs, root=0;
    double time, buf;
    ierr = MPI_Init ( &argc, &argv );
    ierr = MPI_Comm_rank (MPI_COMM_WORLD, &rank);
    ierr = MPI_Comm_size (MPI_COMM_WORLD, &nprocs);
    time = 0.5;
    ierr = MPI_Reduce (&time, &buf, 1, MPI_DOUBLE_PRECISION, 
                          MPI_SUM, root, MPI_COMM_WORLD);
    if (rank == root){
        buf = buf / nprocs;
        cout << buf << "\n";
    }

  MPI_Finalize ( );

}

其中time分别处理排序时间。

答案 1 :(得分:0)

放入循环是可行的方法。我很困惑,因为我得到了10个endTime = MPI_Wtime()的值,我只使用了其中的5个来自根进程。感谢@EdSmith的MPI_Reduce代码,正确的计算时间是使用MPI_Reduce的两个进程的平均值。

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nProcs);

for (int run=0; run<5; run++) {
  ...
  endTime = MPI_Wtime();
  totalTime = endTime - startTime;
  MPI_Reduce (&totalTime, &workTime, 1, MPI_DOUBLE_PRECISION, MPI_SUM, root, MPI_COMM_WORLD);
  if (rank == root) {
    paraTime = workTime/nProcs;
  }
  ...
}

MPI_Finalize();