【发布时间】:2011-10-03 22:33:19
【问题描述】:
我想知道是否在您指定有线程支持的 MPI 程序中,所有线程都进行 MPI::Bcast 调用(确保在调用中,发送方进程仅拥有一个线程),是否收到由所有其他线程还是仅针对每个进程的一个线程(最快)?
【问题讨论】:
标签: c++ multithreading pthreads mpi openmpi
我想知道是否在您指定有线程支持的 MPI 程序中,所有线程都进行 MPI::Bcast 调用(确保在调用中,发送方进程仅拥有一个线程),是否收到由所有其他线程还是仅针对每个进程的一个线程(最快)?
【问题讨论】:
标签: c++ multithreading pthreads mpi openmpi
常见的 MPI 实现处理进程之间的通信。支持线程的实现只允许多个线程进行部分或全部 MPI 调用,而不仅仅是一个。在调用MPI_Bcast 的进程中的每一个T 线程意味着该进程已经调用了MPI_Bcast T 次,并且期望通信器上的所有其他等级都会这样做。
【讨论】:
MPI_Send 被允许阻塞直到匹配接收完成。如果它是对自己的,并且没有发布接收,那就是一个死锁。
根据 MPI 实现中的线程支持级别(请检查,MPI 中的线程支持非常粗略),每个进程只调用一次 MPI。
【讨论】:
补充Novelocrat给出的答案:
MPI 中的基本计算单位是“等级”。在 MPI 的大多数(全部?)有趣的实现中,等级是一个过程。一个进程中的所有线程共享相同的 Rank ID。
MPI 标准支持多级线程并行:MPI_THREAD_SINGLE、MPI_THREAD_FUNNELED、MPI_THREAD_SERIALIZED 和 MPI_THREAD_MULTIPLE。
其中,只有 MPI_THREAD_MULTILE 实际上有多个线程对 MPI 库进行重叠调用。其他三种情况是来自应用程序的断言,即 Rank 可以被视为“单线程”。有关更多信息,请参阅MPI Standard entry on MPI_INIT_THREAD。
【讨论】: