如何找到MPI(4PY)可用的核心数?
动机
我的Python程序按层次结构生成MPI实例。
第一个spawn总是发生并创建4个实例。由于我的计算结构,增加这个数字没有意义,所以我硬编码了。
根据主程序的命令行选项,4个实例中的每个实例都会调用几乎线性扩展的外部Python软件。
我使用
调用此外部软件N=3
child=MPI.COMM_SELF.Spawn(sys.executable,args=[`external.py`],maxprocs=N)
目前,我使用N=3
,以便第一个产生的4个实例每个产生3个外部程序实例,总共产生12个实例,与我工作站上的核心数相匹配。 / p>
但是,为了便携性,我想做
N_avail = <MPI.N_CORES> #on my workstation: N_avail=12
N = N_avail/MPI.COMM_WORLD.Get_size() #on my workstation: N=12/4=3
这样就不需要对可用内核的数量进行硬编码。
这可能吗,它有意义吗?
备注
我原本希望不指定maxprocs可以完成这项工作,就像mpirun
没有-np
生成与可用核心一样多的实例。但是,Spawn
则默认为maxprocs=1
。
外部库的调用是阻塞的,这就是为什么我不会(不会)从N_avail
中减去第一个产生的4个实例。
我不能只使用multiprocessing.cpu_count()
,因为这只会给我当前节点上的核心(在群集设置中)。我打算使用SLURM调度程序在集群上运行我的代码。
答案 0 :(得分:1)
世界通讯器的属性可能会提供预期的流程总数: MPI_UNIVERSE_SIZE
。请参阅MPI标准http://mpi-forum.org/docs/mpi-3.1/mpi31-report/node253.htm#Node253
MPI在
MPI_COMM_WORLD
,MPI_UNIVERSE_SIZE
上提供了一个属性,允许应用程序以可移植的方式获取此信息。此属性指示预期的进程总数。 ...应用程序通常会从MPI_COMM_WORLD
中减去MPI_UNIVERSE_SIZE
的大小,以确定它应该生成多少个进程。 ...
在mpi4py中,它可以打印为:
from mpi4py import MPI
version= MPI.Get_version()
print "mpi version is ",version
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
print "size is ",size
universe_size=comm.Get_attr(MPI.UNIVERSE_SIZE)
print "universe size is ",universe_size
关注OpenMPI mpirun universe size,可以尝试以下功能测试此功能:
mpirun -np 1 -H localhost,localhost,localhost python main.py
如果您的MPI版本高于或等于3,则MPI_Info MPI_INFO_ENV
可以为您提供帮助。它包含两个可能提供一些信息的键:
maxprocs
要启动的最大MPI进程数。
soft
允许的处理器数量值。
要在mpi4py中使用它,您可以尝试:
soft=MPI.INFO_ENV.get("soft")
print soft
maxprocs=MPI.INFO_ENV.get("maxprocs")
print maxprocs