【问题标题】:MPI_Barrier in different threads, behaviour? [duplicate]不同线程中的 MPI_Barrier,行为? [复制]
【发布时间】:2013-11-08 16:29:29
【问题描述】:

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

我有兴趣使用一些 IO 库 (adios)。
我在问我,如果我编写这样的代码会发生什么?:

  • 让我们说 2 个进程中的 IO 线程做一些 IO 并且他们使用 MPI_Barrier(MPI_COMM_WORLD) 在某个点 B 同步 IO!

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

--->我不知道究竟会发生什么,是否可能出现以下情况:

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

=> 并且进程 1 和 2 得到同步(因此进程 1 在 B 和进程 2 在 A 离开屏障(进程 2 也没有相同的点同步!)

如果发生这种情况,这难道不是程序员不希望出现的不良行为吗? (可以通过使用具有相同进程数的两个不同的通信器来避免这种情况 (MPI_Comm_dup(...)) 吗?

或者障碍真的依赖于代码行吗?但是,如果是这样,如何实现呢?

这令人困惑!

非常感谢!

【问题讨论】:

    标签: c++ multithreading synchronization mpi


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-08
      • 2013-03-01
      • 2011-11-24
      • 1970-01-01
      • 2015-07-14
      • 2011-02-15
      • 2020-06-23
      • 2011-05-20
      • 2011-06-21
      相关资源
      最近更新 更多