mpi4py-嵌套通信器如何工作

时间:2018-08-06 20:20:03

标签: python nested mpi spawn mpi4py

我编写了一个mpi4py应用程序,该应用程序调用另一个应用程序的“方法”,不是使用mpi.spawn而是使用getattr ..,但我不清楚它是如何工作的,因此我正在寻求帮助。目的是只调用另一个应用程序的“方法”(将参数传递给它,然后使用mpi执行),而不是整个可执行文件。

这是主人和工人的代码:

master.py

import importlib
from mpi4py import MPI

if __name__ == "__main__":
      size = MPI.COMM_WORLD.size
      rank = MPI.COMM_WORLD.rank

      module = importlib.import_module("worker")

      print "master rank: %d: comm: " % (rank, MPI.COMM_WORLD)
      out = getattr(module, "welcome")()

worker.py

def welcome():
   comm = MPI.COMM_WORLD
   rank = comm.Get_rank()
   size = comm.Get_size()

   print "worker rank = %d" % rank, ": comm: ", comm, ", with size = %d" % size

我使用以下命令给他们打电话:mpirun -n 2 python master.py

这是输出:

 master rank 0: comm: <mpi4py.MPI.Intracomm object at 0x2b58faf12870>
 worker rank 0: comm: <mpi4py.MPI.Intracomm object at 0x2b58faf12870>, size = 2
 master rank 1: comm: <mpi4py.MPI.Intracomm object at 0x2b111c6cb870>
 worker rank 1: comm: <mpi4py.MPI.Intracomm object at 0x2b111c6cb870>, size = 2

似乎工作正常,但我有几个问题:

1-似乎主服务器中的环境设置已传递给工作器中的mpi设置(通信器大小和等级),这是怎么发生的,并且getattr被两个“分开的”调用? mpi进程?

2-为什么等级0和等级1具有不同的通信对象引用? (分别为0x2b58faf12870和0x2b111c6cb870)

3-工人中的等级0和1如何获得与其主人相同的通信对象引用? (在工作程序中调用MPI.COMM_WORLD无效吗?)

非常感谢!

0 个答案:

没有答案