在 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 进程生成

在评估您如何设计应用程序时考虑到这一点。