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)
我使用 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)