这确实是可能的,并且在动态流程管理部分的 mpi4py 文档中。Spawn
您需要的是不可用的所谓功能MSMPI
(如果您使用的是 Windows),另请参阅Spawn not 在 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}')
这里是带有并行代码的子文件:
孩子.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)