【问题标题】:MPI with thread support and Bcast calls具有线程支持和 Bcast 调用的 MPI
【发布时间】:2011-10-03 22:33:19
【问题描述】:

我想知道是否在您指定有线程支持的 MPI 程序中,所有线程都进行 MPI::Bcast 调用(确保在调用中,发送方进程仅拥有一个线程),是否收到由所有其他线程还是仅针对每个进程的一个线程(最快)?

【问题讨论】:

    标签: c++ multithreading pthreads mpi openmpi


    【解决方案1】:

    常见的 MPI 实现处理进程之间的通信。支持线程的实现只允许多个线程进行部分或全部 MPI 调用,而不仅仅是一个。在调用MPI_Bcast 的进程中的每一个T 线程意味着该进程已经调用了MPI_Bcast T 次,并且期望通信器上的所有其他等级都会这样做。

    【讨论】:

    • Novelocrat,这是有道理的。因此,让来自不同进程的所有线程调用 Bcast 是一场重大灾难。感谢您的回答。
    • Novelocrat,我还有一个问题,想象一下启用多线程支持后,同一进程中有两个线程,它们是否可以使用 MPI_Send 和 MPI_Recv 在它们之间进行通信,或者会导致死锁?
    • 一个进程可能会使用 Isend/Irecv 与自己通信,但这有点愚蠢。请记住,您进程中的所有线程仍然属于同一 MPI 等级。此外,MPI_Send 被允许阻塞直到匹配接收完成。如果它是对自己的,并且没有发布接收,那就是一个死锁。
    • 在更高的层次上,如果您在一个进程中明确地运行多个线程,为什么要使用 MPI 在它们之间进行通信?你得到了进程间通信的所有开销,以及线程编程的所有痛苦。
    【解决方案2】:

    根据 MPI 实现中的线程支持级别(请检查,MPI 中的线程支持非常粗略),每个进程只调用一次 MPI。

    【讨论】:

      【解决方案3】:

      补充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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-13
        • 2013-04-28
        • 1970-01-01
        • 2013-05-20
        • 2020-07-11
        • 1970-01-01
        • 2011-11-02
        • 2015-09-08
        相关资源
        最近更新 更多