据我了解,这用于将所有进程置于同一级别。
我需要找到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
的情况大不相同
答案 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
实现了几乎完全循环的同步。在群集上,障碍是通过消息传递实现的,因此障碍退出时间可能会有很大差异。