2016-11-04 100 views
0

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

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

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

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

回答

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其中在每个进程的排序时间。

+0

是的,它在开头有MPI_init。我认为你的代码要么通过不同的单核进行5次排序,要么通过5次核心进行排序?但是我想用5个核心完成排序时间。 – lucahuy

+0

对不起,我不确定我是否理解,你可以发布一个简单的代码来清楚说明吗?他们平行排列吗?使用MPI,每个内核作为一个单独的实例运行,同时使用MPI命令进行通信。上面的代码模拟了5个独立的排序实例(用函数替换时间= 0.5)的运行,它将在5个内核上同时运行,然后进行通信以获得所有5个内核的平均值。 –

+0

为什么不运行mpirun -np 2 mpiSort五次,如果这是您想要的,则取可执行文件的平均时间?请注意,整个MPI可执行文件将同时在您用'mpirun -np'指定的核心数量上运行,与openMP不同的是,您只需简单地在一个节中多线程。 –

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(); 
相关问题