我有一个 MPI 程序来计算排序时间。我用mpirun -np 2 mpiSort
. 所以这给了我2个过程的排序时间。
我想获得 5 次的排序时间来平均它们。我如何自动做到这一点?
mpiSort
如果我在程序中做一个循环。它实际上执行 5(次)x 2(进程)= 10 次。
编辑:mpiSort
并行排序。基本上,我试图在mpirun -np 2 mpiSort
不输入 5 次的情况下做到这一点。因为我想对 4 核、8 核做同样的事情。
您可以在五个核心上运行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
每个进程的排序时间在哪里。
放入循环是要走的路。我很困惑,因为我得到了 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();