1

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

我想获得 5 次的排序时间来平均它们。我如何自动做到这一点?

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

编辑:mpiSort并行排序。基本上,我试图在mpirun -np 2 mpiSort不输入 5 次的情况下做到这一点。因为我想对 4 核、8 核做同样的事情。

4

2 回答 2

0

您可以在五个核心上运行mpirun -np 5 mpiSort并在最后添加一个MPI_gather。排序代码实际上是否使用 MPI(即MPI_init在开始时调用?)。假设你是,你可以在 5 个核心上运行,并在最后简单地平均化,减少,

# 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每个进程的排序时间在哪里。

于 2016-11-04T09:37:47.413 回答
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();
于 2016-11-09T05:19:44.913 回答