如何找到MPI(4PY)可用的核心数?

时间:2017-11-13 10:29:56

标签: python multiprocessing mpi mpi4py

如何找到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调度程序在集群上运行我的代码。

1 个答案:

答案 0 :(得分:1)

世界通讯器的属性可能会提供预期的流程总数: MPI_UNIVERSE_SIZE 。请参阅MPI标准http://mpi-forum.org/docs/mpi-3.1/mpi31-report/node253.htm#Node253

  

MPI在MPI_COMM_WORLDMPI_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