Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 与mpi4py中生成的进程的相互通信?_Python_Mpi_Mpi4py - Fatal编程技术网

Python 与mpi4py中生成的进程的相互通信?

Python 与mpi4py中生成的进程的相互通信?,python,mpi,mpi4py,Python,Mpi,Mpi4py,假设主进程a生成一组工作进程B,每个工作进程B生成自己唯一的工作进程C,我如何打开C到a之间的通信器 我正在尝试使用mpi4py在几段代码之间创建一个循环,这些代码彼此独立编写,同时尽量减少对代码的修改。因此,MPI代码的总体框架将是: 主进程A(一个进程)生成辅助进程B的8个进程,并向它们散布一个数组 每个B进程产生一个工作进程C,对数组进行一些操作,并将其广播给自己的工作进程 每个辅助C以自己的方式操纵数组,然后(理想情况下)主A从每个C的数组中收集一个数组 我知道这将涉及在现有流程之间打开

假设主进程a生成一组工作进程B,每个工作进程B生成自己唯一的工作进程C,我如何打开C到a之间的通信器

我正在尝试使用mpi4py在几段代码之间创建一个循环,这些代码彼此独立编写,同时尽量减少对代码的修改。因此,MPI代码的总体框架将是:

  • 主进程A(一个进程)生成辅助进程B的8个进程,并向它们散布一个数组
  • 每个B进程产生一个工作进程C,对数组进行一些操作,并将其广播给自己的工作进程
  • 每个辅助C以自己的方式操纵数组,然后(理想情况下)主A从每个C的数组中收集一个数组
  • 我知道这将涉及在现有流程之间打开一个intercommunicator,可能使用组通信。实现这一目标的最佳方式是什么


    谢谢。

    有两种方法可以让你在我的脑海里完成这件事。我不会说一个比另一个好或坏,尽管第一个可能更符合您的用例

  • 使用名称发布系统(或其他方法)打开连接,使用
    MPI\u COMM\u CONNECT
    MPI\u COMM\u ACCEPT
    将a连接到需要与其通信的人。这可能会导致一系列的通讯器,具体取决于您创建的进程数量,因此这可能会导致一些不好的事情,但这可能是最直接的方法。您只需对
    MPI\u COMM\u ACCEPT
    进行一系列调用即可(遗憾的是,此调用没有非阻塞版本)

  • 不断地将您正在创建的内部通讯器与
    MPI\u COMM\u SPAWN
    合并,创建一个包含所有进程的巨型通讯器。然后,您可以像往常一样发送消息(或者创建一个新的子通讯器,其中包含一个和所有的派生对象,这样您就可以在它们之间进行集体活动)


  • 谢谢,韦斯利!选项1更符合我的目标。在mpi4py中使用MPI_COMM_CONNECT和ACCEPT的语法是什么?它是否简单到让每个工作进程调用MPI.MPI\u COMM\u CONNECT(),然后主进程就有了与工作进程一样多的“COMM\u n=MPI.MPI\u COMM\u ACCEPT”行?我不知道语法。我从不使用MPI4PY。不过我肯定有一些文档。