MPI_Wtime与实际挂布时间之间的差异

时间:2017-08-14 14:39:59

标签: c time openmpi

我使用C和OpenMPI实现了MIMD遗传算法,其中每个过程处理独立的子群(岛模型)。因此,对于200人口的群体,1个流程运行对整个群体进行,而2个流程则进化为100个群体。

因此,通过使用MPI_Wtime测量执行时间,我通过在带有ubuntu的双核计算机上运行来获得预期的执行时间。但是,它不同意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优化并没有太大的区别。

可能发生什么事?它应该运行得更快,有两个进程,如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);
}

2 个答案:

答案 0 :(得分:0)

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

这可能是第二种情况下真实时间低于用户时间的原因。 实时时间比用户 sys 的总和更接近 MPI 时间。在第一种情况下,初始化时间花费很多时间并且可能是假结果。

答案 1 :(得分:0)

将Ubuntu Mate 15.10升级到16.04后,问题解决了,OpenMPI版本为1.10.2(前一个版本为1.6.5)。