据我所知,这是用来使所有进程处于同一级别。我需要找出openMPI程序的总体处理时间(所有进程完成的时间),所以我认为将MPI_Barrier()放在最后,然后在最后打印MPI_Wtime()-t将打印所有进程完成的时间。
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的情况有很大的不同
发布于 2013-07-11 22:49:43
对于MPI过程来说,很容易在时间上变得不同步,特别是如果MPI_stuff中涉及的算法不是全局同步的。对于大多数集群MPI实现来说,由于不同的启动时间和MPI_Init()可能需要不同的时间,进程从一开始就完全不同步是非常典型的。另一个不同步的来源是操作系统噪声,即其他进程偶尔与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,使用特殊的中断网络实现全局障碍,在那里MPI_Barrier实现了几乎周期完美的同步。在集群上,障碍是通过消息传递实现的,因此障碍退出时间可能会有很大不同。
https://stackoverflow.com/questions/17579693
复制相似问题