2017-08-14 67 views
0

我使用C和OpenMPI实现了MIMD遗传算法,其中每个进程都照顾独立的子群(岛模型)。因此,对于规模为200的人口,1个过程运行在整个人口中,而2个过程演变100个人口。MPI_Wtime与实际挂墙时间之间的区别

因此,通过使用MPI_Wtime来测量执行时间,我得到了预期的执行时间通过使用ubuntu运行在2核机器上。然而,它并不同意ubuntu的时间命令和感知:很明显,由于某种原因,运行2个进程需要更长的时间。

$time mpirun -n 1 genalg 
execution time: 0.570039 s (MPI_Wtime) 

real 0m0.618s 
user 0m0.584s 
sys  0m0.024s 


$time mpirun -n 2 genalg 
execution time: 0.309784 s (MPI_Wtime) 

real 0m1.352s 
user 0m0.604s 
sys  0m0.064s 

对于较大的人口(4000),我得到如下:

$time mpirun -n 1 genalg 
execution time: 11.645675 s (MPI_Wtime) 

real 0m11.751s 
user 0m11.292s 
sys  0m0.392s 


$time mpirun -n 2 genalg 
execution time: 5.872798 s (MPI_Wtime) 

real 0m8.047s 
user 0m11.472s 
sys  0m0.380s 

我得到了类似的结果是否有进程或不之间的通信,并且还试图MPI_Barrier。也得到了与gettimeofday相同的结果,并打开或关闭gcc优化没有太大的区别。

可能发生了什么?它应该运行2个进程更快,如MPI_Wtime暗示,但实际上它运行速度较慢,匹配实时

更新:我在另一台PC上运行它,并没有这个问题。

代码:

void runGA(int argc,char* argv[]) 
{ 
    (initializations) 

    if(MYRANK == 0) 
     t1 = MPI_Wtime(); 

    genalg(); 
    Individual* ind = best_found(); 
    MPI_Barrier(MPI_COMM_WORLD); 
    if(MYRANK != 0) 
     return; 

    t2 = MPI_Wtime(); 
    exptime = t2-t1; 

    printf("execution time: %f s\n",exptime); 
} 

回答

0

升级Ubuntu Mate 15.10到16.04之后,OpenMPI版本1.10.2(前一版本是1.6.5)出现了问题。

0

我的猜测(和her/his)是time给由所有内核使用时间的总和。这更像是一种成本:你在2个核心上有2个进程,所以成本时间是time1 + time2,因为第二个核心可以用于另一个进程,所以这次在这个第二个核心上“丢失”了。 MPI_Wtime()显示人类的实际花费时间。

这也许可以解释为什么在第二种情况下,实际时间低于用户时间。 real时间更接近MPI时间总和用户 ans sys。在第一种情况下,初始化时间花费很多时间,可能会导致结果错误。

+0

虽然运行2个进程明显较慢。 MPI_Wtime报告的执行时间远远小于实时匹配的感知执行时间。 – bwdm

+0

你在代码中集体操作吗?因为在忙碌的等待中我无法重现您的问题:https://pastebin.com/vzA8qUL7 – Taknok

+0

是的,但即使在删除集体后,我也遇到了问题。 – bwdm

相关问题