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

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

fra*_*cis 3

世界通信器的一个属性可以提供预期的进程总数:MPI_UNIVERSE_SIZE。请参阅 MPI 标准,http://mpi-forum.org/docs/mpi-3.1/mpi31-report/node253.htm#Node253

MPI_COMM_WORLDMPI 在、上提供了一个属性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)