MPI_Barrier()的行为?

时间:2013-07-10 19:50:55

标签: c++ ipc mpi clock openmpi

据我了解,这用于将所有进程置于同一级别。 我需要找到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的情况大不相同

1 个答案:

答案 0 :(得分:3)

MPI进程很容易在时间上失去同步,特别是如果MPI_stuff中涉及的算法不是全局同步的话。大多数集群MPI实现非常典型,由于启动时间不同以及MPI_Init()可能需要不同的时间,因此从一开始就会使进程完全失去同步。另一个去同步的来源是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,全局障碍是使用特殊的中断网络实现的,并且MPI_Barrier实现了几乎完全循环的同步。在群集上,障碍是通过消息传递实现的,因此障碍退出时间可能会有很大差异。