我编写了一个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无效吗?)
非常感谢!