如何多次运行相同的MPI程序
问题描述:
我有一个MPI程序来计算排序时间。我用mpirun -np 2 mpiSort
运行它。所以这给了我2个过程的排序时间。如何多次运行相同的MPI程序
我想要5次的排序时间来平均它们。我该如何自动做到这一点?
如果我在mpiSort
程序中做循环。它实际执行5(次)×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();
是的,它在开头有MPI_init。我认为你的代码要么通过不同的单核进行5次排序,要么通过5次核心进行排序?但是我想用5个核心完成排序时间。 – lucahuy
对不起,我不确定我是否理解,你可以发布一个简单的代码来清楚说明吗?他们平行排列吗?使用MPI,每个内核作为一个单独的实例运行,同时使用MPI命令进行通信。上面的代码模拟了5个独立的排序实例(用函数替换时间= 0.5)的运行,它将在5个内核上同时运行,然后进行通信以获得所有5个内核的平均值。 –
为什么不运行mpirun -np 2 mpiSort五次,如果这是您想要的,则取可执行文件的平均时间?请注意,整个MPI可执行文件将同时在您用'mpirun -np'指定的核心数量上运行,与openMP不同的是,您只需简单地在一个节中多线程。 –