MPI_Barrier在不同的线程,行为?

时间:2013-10-29 13:28:23

标签: c++ multithreading synchronization mpi

假设我有2个进程,每个进程有两个线程( 1 IO线程,1个计算线程)

我很乐意使用一些IO库(adios) 如果我要编写类似的代码,我会问我会发生什么?:

  • 假设两个进程中的IO线程执行一些IO并且他们使用 MPI_Barrier(MPI_COMM_WORLD)在某些时候 B 来同步 IO!

  • 两个进程中的计算线程也使用MPI_Barrier(MPI_COMM_WORLD)某点 A 来同步计算(当IO线程正在工作时)。

    < / LI>

---&GT;我不确切知道会发生什么,可能是下列情况:

  • 进程1,IO线程等待 B
  • 过程2,计算线程等待 A

=&GT;并且过程1和过程2同步(因此过程1在 B 处留下障碍,过程2在 A 处(同时过程2与同步的点不同!)

如果可能发生这种情况,这不是程序员不想要的不需要的行为。 (可以通过使用具有相同进程数的两个不同的通信器(MPI_Comm_dup(...))来避免这种情况吗?

或障碍是否依赖于代码行?但如果这样的话,这又是如何实现的呢?

这令人困惑!

非常感谢!

1 个答案:

答案 0 :(得分:4)

第一种情况很可能发生(来自不同线程的屏障调用相互匹配)。从MPI的角度来看,无论来自哪个线程的屏障调用以及调用的代码行,都必须通过通信器内的所有 rank 输入屏障。 MPI仍然没有线程标识的概念,并且所有线程一起被视为单个实体 - 排名。唯一特殊的处理方法是,当提供MPI_THREAD_MULTIPLE线程支持级别时,库应该实现正确的锁定,以便可以在任何时间从任何线程进行MPI调用。

这就是为什么并行库作者应该始终复制世界通信器并将副本用于内部通信需求是非常明智的。这样,库代码不会干扰用户代码(有一些特殊的例外可能会导致死锁)。