在 python 脚本中替代 mpirun
Alternative to mpirun inside python script
我正面临这个奇怪的问题。我认为答案并不难,但我无法在任何地方找到它,所以我依赖你的建议。
假设我在文件 parallel_func.py
:
中有一个并行 python 函数
def parallel_func():
parser=OptionParser()
parser.add_option("-f", "--file", dest="filename",
help="Input FILE", metavar="FILE")
parser.add_option("--parallel", action="store_true",
help="Specify if we need to initialize MPI",
dest="with_MPI", default=False)
(options, args)=parser.parse_args()
if options.with_MPI == True:
from mpi4py import MPI
comm = MPI.COMM_WORLD
myid = comm.Get_rank()
numberPart = comm.Get_size()
have_MPI = True
else:
comm = 0
myid = 0
numberPart = 1
have_MPI = False
etc. etc.
我可以从 shell 中调用此函数,只需键入:
mpirun -np XX parallel_func.py -f input_file --parallel
现在,有没有办法在非并行的 python 脚本和单核 运行 脚本中调用我的 parallel_func 作为函数?我当前的版本有效,但在单核中只能 运行 parallel_func:
from parallel_func.py import parallel_func
# -------------------------------------------------------------------
# Main
# -------------------------------------------------------------------
def main():
parser=OptionParser()
parser.add_option("-f", "--file", dest="filename",
help="Input FILE", metavar="FILE")
parser.add_option("-n", "--partitions", dest="partitions",
default=1,
help="number of PARTITIONS",
metavar="PARTITIONS")
(options, args)=parser.parse_args()
options.partitions = int( options.partitions )
if options.partitions > 1:
options.with_MPI = True
else:
options.with_MPI = False
parallel_func(options)
长话短说,有没有一种方法可以让我在 python 函数中传达 main
MPI.COMM_WORLD
所需的所有信息,以使 parallel_func
正常工作?
在此先感谢您的回答!!
您正在寻找动态流程管理。这意味着您从单个进程中 spawn 一些进程,它们形成一个通信器。你可以找到一个example here。这种方法有几个缺点:
- 您需要为启动的进程提供一个特殊的脚本或入口点 - 您不能只在调用 spawn 时恢复
- 派生进程位于包含两个独立组(父进程和派生进程)的内部通信器中。它们的使用方式与您的正常(内部通信器)不同。
- 一些 HPC 系统/批处理系统不支持 MPI 进程生成
在评估您如何设计应用程序时考虑到这一点。
我正面临这个奇怪的问题。我认为答案并不难,但我无法在任何地方找到它,所以我依赖你的建议。
假设我在文件 parallel_func.py
:
def parallel_func():
parser=OptionParser()
parser.add_option("-f", "--file", dest="filename",
help="Input FILE", metavar="FILE")
parser.add_option("--parallel", action="store_true",
help="Specify if we need to initialize MPI",
dest="with_MPI", default=False)
(options, args)=parser.parse_args()
if options.with_MPI == True:
from mpi4py import MPI
comm = MPI.COMM_WORLD
myid = comm.Get_rank()
numberPart = comm.Get_size()
have_MPI = True
else:
comm = 0
myid = 0
numberPart = 1
have_MPI = False
etc. etc.
我可以从 shell 中调用此函数,只需键入:
mpirun -np XX parallel_func.py -f input_file --parallel
现在,有没有办法在非并行的 python 脚本和单核 运行 脚本中调用我的 parallel_func 作为函数?我当前的版本有效,但在单核中只能 运行 parallel_func:
from parallel_func.py import parallel_func
# -------------------------------------------------------------------
# Main
# -------------------------------------------------------------------
def main():
parser=OptionParser()
parser.add_option("-f", "--file", dest="filename",
help="Input FILE", metavar="FILE")
parser.add_option("-n", "--partitions", dest="partitions",
default=1,
help="number of PARTITIONS",
metavar="PARTITIONS")
(options, args)=parser.parse_args()
options.partitions = int( options.partitions )
if options.partitions > 1:
options.with_MPI = True
else:
options.with_MPI = False
parallel_func(options)
长话短说,有没有一种方法可以让我在 python 函数中传达 main
MPI.COMM_WORLD
所需的所有信息,以使 parallel_func
正常工作?
在此先感谢您的回答!!
您正在寻找动态流程管理。这意味着您从单个进程中 spawn 一些进程,它们形成一个通信器。你可以找到一个example here。这种方法有几个缺点:
- 您需要为启动的进程提供一个特殊的脚本或入口点 - 您不能只在调用 spawn 时恢复
- 派生进程位于包含两个独立组(父进程和派生进程)的内部通信器中。它们的使用方式与您的正常(内部通信器)不同。
- 一些 HPC 系统/批处理系统不支持 MPI 进程生成
在评估您如何设计应用程序时考虑到这一点。