我有一些使用MPI的多代理系统。我用mpiexec -np 1 Admin.py : -np 4 Other.py
开始主要演员。每个“other.py”也会产生一个进程。为了提高计算效率,我真的希望将生成的进程放在与父进程相同的处理器(rank)上。我怎样才能做到这一点? (并且好奇心:1。默认情况下它们在哪里产生?2。有没有办法看到进程在哪里运行?)
我的Other.py代码包含以下内容(无MWE)
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
...
icomm = MPI.COMM_SELF.Spawn(sys.executable,args["front_process.py",str(rank)],\
maxprocs=1)
通过向Spawn提供和info参数,您通常可以控制生成进程的位置。
myinfo = MPI.Info.Create()
myinfo.Set("host","%s" % str(rank) )
icomm = MPI.COMM_SELF.Spawn(sys.executable,args=["front_process.py",str(rank)],\
maxprocs=1,info=myinfo)
但是,添加此“信息”时,MPI崩溃:All nodes which are allocated for this job are already filled.
答案 0 :(得分:0)
根据提供的主机列表中定义的槽(或者如果没有提供主机列表,则在本地主机上)和分配规则(通常作为mpiexec
的参数提供)生成新进程。如果您的MPI作业在资源管理器(RM)的监督下运行,例如SGE,LSF等,如果MPI库与RM紧密集成,则主机列表和可用的插槽由RM修复,host
对象中的MPI_Info
密钥用作过滤到RM指定的列表(对于Open MPI至少为true)。
如果不使用RM,您应该提供一个主机列表,其中为每个主机定义了足够的插槽。使用Open MPI 1.6.x,可以使用add-host
键将新主机添加到列表中。如果在RM下运行,您应该发出适当的请求(这是特定于站点的)。
要了解流程的运行位置,请使用MPI.Get_processor_name()
。在大多数集群系统上,它返回调用进程执行的节点的主机名。