MPI_Wtime与实际挂墙时间之间的区别
问题描述:
我使用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);
}
答
升级Ubuntu Mate 15.10到16.04之后,OpenMPI版本1.10.2(前一版本是1.6.5)出现了问题。
答
我的猜测(和her/his)是time
给由所有内核使用时间的总和。这更像是一种成本:你在2个核心上有2个进程,所以成本时间是time1 + time2,因为第二个核心可以用于另一个进程,所以这次在这个第二个核心上“丢失”了。 MPI_Wtime()
显示人类的实际花费时间。
这也许可以解释为什么在第二种情况下,实际时间低于用户时间。 real时间更接近MPI时间总和用户 ans sys。在第一种情况下,初始化时间花费很多时间,可能会导致结果错误。
虽然运行2个进程明显较慢。 MPI_Wtime报告的执行时间远远小于实时匹配的感知执行时间。 – bwdm
你在代码中集体操作吗?因为在忙碌的等待中我无法重现您的问题:https://pastebin.com/vzA8qUL7 – Taknok
是的,但即使在删除集体后,我也遇到了问题。 – bwdm