在mpi4py中产生进程的相互通信?

时间:2014-02-18 15:21:34

标签: python mpi mpi4py

鉴于主进程A生成一组工作进程B的情况,每个进程都生成自己唯一的工作进程C,如何在C到A之间打开一个通信器?

我正在尝试使用mpi4py在几段代码之间创建一个循环,这些代码彼此分开编写,同时最大限度地减少对代码的修改。因此,MPI代码的一般框架将是:

  1. Master A(一个进程)生成8个进程B,并将数组分散到它们。
  2. 每个B进程生成一个worker C,对该数组进行一些操作,并将其广播给自己的worker。
  3. 每个工作者C以自己的方式操纵数组,然后(理想情况下)master A从每个C的数组中收集一个数组。
  4. 我知道这将涉及在现有流程之间打开一个相互通信器,可能使用群组通信。什么是实现这一目标的最佳方式?

    谢谢。

1 个答案:

答案 0 :(得分:2)

有两种方法可以做到这一点。我不会说一个比另一个好或坏,尽管第一个可能更好地匹配你的用例。

  1. 使用名称发布系统(或其他方法)使用MPI_COMM_CONNECTMPI_COMM_ACCEPT打开连接,以便将A连接到需要与之通信的任何人。这可能导致A的一堆通信器取决于您创建的进程数量,因此这可能会导致一些不好的事情,但这可能是使这项工作最直接的方法。你只需要让A对MPI_COMM_ACCEPT进行一堆调用(不幸的是,这个调用没有非阻塞版本)。

  2. 使用MPI_COMM_SPAWN不断合并您正在创建的内部通信器,以创建一个包含所有进程的巨型通信器。然后你就可以像往常一样发送消息(或者用A和所有产品创建新的子交流者,这样你就可以在他们中间做集体)。