Ban*_*ach 6 python mpi multiprocessing mpi4py
如何找到 MPI(4PY) 可用的内核数?
动机
我的 Python 程序按层次生成 MPI 实例。
第一次生成总是发生并创建 4 个实例。由于我的计算结构,增加这个数字没有意义,所以我对其进行了硬编码。
根据主程序的命令行选项,4 个实例中的每一个都会调用几乎线性扩展的外部 Python 软件。
我调用这个外部软件使用
N=3
child=MPI.COMM_SELF.Spawn(sys.executable,args=[`external.py`],maxprocs=N)
Run Code Online (Sandbox Code Playgroud)
目前,我使用N=3
使第一个生成的 4 个实例每个生成外部程序的 3 个实例,总共产生 12 个实例,与我工作站上的内核数相匹配。
但是,为了便携性,我想做
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
Run Code Online (Sandbox Code Playgroud)
这样可用内核的数量就不需要硬编码了。
这可能吗,是否有意义?
笔记
我曾希望不指定会的MaxProcs做的工作,就像mpirun
用了-np
产卵的多个实例可用内核。但是,Spawn
则默认为maxprocs=1
。
外部库的调用是阻塞的,这就是为什么我不(不会)从N_avail
.
我不能只使用multiprocessing.cpu_count()
,因为这只会给我当前节点上的核心(在集群设置中)。我计划使用 SLURM 调度程序在集群上运行我的代码。
世界通信器的一个属性可以提供预期的进程总数:MPI_UNIVERSE_SIZE
。请参阅 MPI 标准,http://mpi-forum.org/docs/mpi-3.1/mpi31-report/node253.htm#Node253
MPI_COMM_WORLD
MPI 在、上提供了一个属性MPI_UNIVERSE_SIZE
,允许应用程序以可移植的方式获取此信息。该属性指示预期的进程总数。MPI_COMM_WORLD
...应用程序通常减去from的大小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
Run Code Online (Sandbox Code Playgroud)
按照OpenMPI mpirun Universe size,可以通过尝试以下方式测试此功能:
mpirun -np 1 -H localhost,localhost,localhost python main.py
Run Code Online (Sandbox Code Playgroud)
如果您的 MPI 版本高于或等于 3,MPI_InfoMPI_INFO_ENV
可以帮助您。它有两个按键,可以提供一些信息:
maxprocs
要启动的 MPI 进程的最大数量。
soft
处理器数量的允许值。
要在 mpi4py 中使用它,您可以尝试:
soft=MPI.INFO_ENV.get("soft")
print soft
maxprocs=MPI.INFO_ENV.get("maxprocs")
print maxprocs
Run Code Online (Sandbox Code Playgroud)