据我了解,这用于将所有流程置于同一级别。
我需要找到 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
最佳答案
MPI 进程很容易在时间上变得不同步,特别是如果 MPI_stuff
中涉及的算法不是全局同步的。对于大多数集群 MPI 实现来说,由于启动时间不同以及 MPI_Init()
可能需要不同的时间,进程从一开始就完全不同步是非常典型的。另一个不同步的来源是操作系统噪音,即其他进程偶尔会与 MPI 作业中的某些进程共享 CPU 时间。
这就是为什么测量并行算法执行时间的正确方法是在测量 block 之前和之后放置一个障碍:
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
实现了几乎周期完美的同步。在集群上,障碍是通过消息传递实现的,因此障碍退出时间可能会有很大差异。
关于c++ - MPI_Barrier() 的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17579693/