我使用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);
}
虽然运行2个进程明显较慢。 MPI_Wtime报告的执行时间远远小于实时匹配的感知执行时间。 – bwdm
你在代码中集体操作吗?因为在忙碌的等待中我无法重现您的问题:https://pastebin.com/vzA8qUL7 – Taknok
是的,但即使在删除集体后,我也遇到了问题。 – bwdm