如何从串行python脚本中使用mpi4py应用程序

时间:2014-09-01 08:30:25

标签: python parallel-processing mpi4py

我尝试创建一个基于mpi4py的库,但我想在串口python代码中使用它。

$ python serial_source.py

serial_source.py 内部存在一些名为 parallel_bar 的函数

from foo import parallel_bar
# Can I to make this with mpi4py like a common python source code?
result = parallel_bar(num_proc = 5)

这个问题的动机是找到正确的方法来使用mpi4py来优化python中的程序,这些程序不一定是完全并行运行的。

2 个答案:

答案 0 :(得分:4)

这确实是可能的,并且在Dynamic Process Management部分的mpi4py文档中。您需要的是所谓的Spawn功能,MSMPI无法使用(如果您使用的是Windows),另请参阅Spawn not implemented in MSMPI

实施例

第一个文件为你的函数提供了一种隐藏所有MPI东西的包装器,我想这是你的意图。在内部,它在4个新生成的进程中调用包含并行代码的“实际”脚本。

最后,你可以打开一个python终端并调用:

from my_prog import parallel_fun

parallel_fun()
# Hi from 0/4
# Hi from 3/4
# Hi from 1/4
# Hi from 2/4
# We got the magic number 6

my_prog.py

import sys
import numpy as np
from mpi4py import MPI

    def parallel_fun():
        comm = MPI.COMM_SELF.Spawn(
            sys.executable,
            args = ['child.py'],
            maxprocs=4)

        N = np.array(0, dtype='i')

        comm.Reduce(None, [N, MPI.INT], op=MPI.SUM, root=MPI.ROOT)

        print(f'We got the magic number {N}')

此处包含并行代码的子文件:

child.py

from mpi4py import MPI
import numpy as np


comm = MPI.Comm.Get_parent()

print(f'Hi from {comm.Get_rank()}/{comm.Get_size()}')
N = np.array(comm.Get_rank(), dtype='i')

comm.Reduce([N, MPI.INT], None, op=MPI.SUM, root=0)

答案 1 :(得分:0)

不幸的是,我不认为这是可能的,因为你必须专门用mpirun运行MPI代码。

您可以做的最好的事情是编写通用代码块的相反方法,这些代码块可以通过MPI进程或普通的python进程调用。

唯一的另一个解决方案是将代码的整个MPI部分包装到外部调用中,并在非MPI代码中使用子进程调用它,但是这将与您的系统配置相关,并且实际上不是那么便携

子线程在这个线程Using python with subprocess Popen中有详细说明,值得一看,这里的复杂性是在第一时间进行正确的调用,即

command = "/your/instance/of/mpirun /your/instance/of/python your_script.py -arguments"

然后将结果返回到您的单线程代码中,这取决于大小,有很多方法,但是如果你必须传回大数据数据,那么像并行hdf5这样的东西将是一个好看的地方。

抱歉,我无法为您提供简单的解决方案。