我使用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);
}
答案 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)。