0

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

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

  • 假设 2 个进程中的 IO 线程执行一些 IO,并且它们 MPI_Barrier(MPI_COMM_WORLD)在某个点B使用 来同步 IO!

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

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

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

=> 并且进程 1 和 2 同步(因此进程 1 在B处留下屏障,在A处留下进程 2 (进程 2 的同步点也不相同!)

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

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

这令人困惑!

非常感谢!

4

1 回答 1

4

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

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

于 2013-10-29T15:43:10.603 回答