【问题标题】:behavior of MPI_Barrier()?MPI_Barrier() 的行为?
【发布时间】:2013-07-08 22:00:42
【问题描述】:

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

【问题讨论】:

  • 时代有多大不同?你能告诉我们你正在讨论的其他版本的代码吗?

标签: c++ ipc mpi clock openmpi


【解决方案1】:

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

这就是为什么衡量并行算法执行时间的正确方法是在beforeafter测量块:

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 实现了几乎循环完美的同步。在集群上,障碍是通过消息传递实现的,因此障碍退出时间可能会有很大差异。

【讨论】:

猜你喜欢
  • 2013-11-08
  • 2014-01-17
  • 2011-06-21
  • 2011-01-04
  • 2011-07-08
  • 1970-01-01
  • 2015-07-14
  • 2016-09-20
  • 2012-01-04
相关资源
最近更新 更多