2013-07-10 32 views
1

据我所知,这是用来使所有的进程在同一水平。 我需要找到一个openMPI程序的总体处理时间(所有处理完成的时间),所以我认为最后放置一个MPI_Barrier(),然后在最后打印MPI_Wtime()-t将打印所有处理的时间完成。MPI_Barrier()的行为?

 MPI_stuff;//whatever i want my program to do 
     MPI_Barrier(MPI_COMM_WORLD); 
     cout << "final time ::: :: " << MPI_Wtime()-t << rank << endl; 
     MPI_Finalize(); 

但时间时,我使用MPI_Barrier()比个别处理的情况下非常不同MPI_Wtime()-t

+0

时代有多少?你能向我们展示你正在讨论的其他版本的代码吗? –

回答

3

这是很容易为MPI进程在时间变得desynchronised,特别是如果涉及的算法MPI_stuff不是全局同步的。对于大多数集群MPI实施来说,非常典型的情况是,由于启动时间不同以及事实上可能需要不同的时间,所以从一开始就进程非常不同步。另一个去同步的来源是OS噪声,即偶尔与MPI作业中的某些进程共享CPU时间的其他进程。

这就是为什么来衡量并行算法的执行时间,正确的做法是把一个屏障以前后测量块:

MPI_Barrier(MPI_COMM_WORLD); // Bring all processes in sync 
t = -MPI_Wtime(); 
MPI_stuff; 
MPI_Barrier(MPI_COMM_WORLD); // Wait for all processes to finish processing 
t += MPI_Wtime(); 

如果第一MPI_Barrier缺失和MPI_stuff做不同步不同的流程,可能会发生这样的情况:其中一些很早就到达下一个屏障,而另一些则很晚才到达,然后早期的屏障必须等待后者。

另请注意,MPI_Barrier不保证所有进程都同时退出屏障。它只能保证当所有进程中的执行流程都在MPI_Barrier调用内时有一个时间点。其他一切都依赖于实现。在一些平台上,特别是IBM Blue Gene,使用特殊中断网络实现全球障碍,并实现几乎完美的同步。在集群上,障碍通过消息传递来实现,因此障​​碍退出时间可能会有很大差异。

+0

http://stackoverflow.com/questions/17820445/openmpi-hello-world-on-cluster –

+0

嘿,关于MPI_Barrier,你有任何想法为什么它的行为如此http://stackoverflow.com/questions/ 29757817 /阻挡-MPI垒时 - 无规 - 从-LXC的容器 – AlexandruC