我有一个MPI程序来计算排序时间。我用mpirun -np 2 mpiSort
运行它。所以这给了我2个过程的排序时间。
我想让排序时间达到平均5次。我该如何自动完成?
如果我在mpiSort
程序中进行循环。它实际上执行5(次)x 2(处理)= 10次。
编辑:mpiSort
并行进行排序。基本上,我尝试mpirun -np 2 mpiSort
而没有输入5次。因为我想对4个核心,8个核心做同样的事情。
答案 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();