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

Difference between MPI_Wtime and actual wall time

我使用 C 和 OpenMPI 实现了 MIMD 遗传算法,其中每个进程负责一个独立的子种群(孤岛模型)。因此,对于大小为 200 的种群,1 个过程 运行 对整个种群进行操作,而 2 个过程演化出大小为 100 的种群。

因此,通过使用 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 建议的那样,但实际上它 运行ning 更慢,匹配 实时 .

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

代码:

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);
}

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

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

将UbuntuMate 15.10升级到16.04后问题解决,附带OpenMPI 1.10.2版本(之前是1.6.5)