Альтернатива mpirun внутри скрипта Python - PullRequest
0 голосов
/ 01 июня 2018

Я сталкиваюсь с этой любопытной проблемой.Я не думаю, что ответ сложный, но я нигде не могу его найти, поэтому полагаюсь на ваши предложения.

Предположим, у меня есть параллельная функция python внутри файла 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.  

Я могу вызвать эту функцию из оболочки, просто набрав:

mpirun -np XX parallel_func.py -f input_file --parallel

Теперь, есть ли способ вызвать мой parallel_func как функцию внутри скрипта Python, которая не параллельна и работает в одноядерном процессоре?Моя текущая версия работает, но запускаю 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 правильно работает?

Заранее спасибо за ответ !!

1 Ответ

0 голосов
/ 02 июня 2018

Вы ищете для динамического управления процессами.Это означает, что вы порождаете некоторые процессы из одного процесса, и они образуют коммуникатор.Вы можете найти пример здесь .У этого подхода есть несколько недостатков:

  • Вам необходимо предоставить специальный сценарий или точку входа для запущенного процесса - вы не можете просто продолжить работу с точки вызова spawn
  • Порожденные процессы находятся в межкоммуникаторе, содержащем две отдельные группы (родительский и порожденные процессы).Они отличаются от обычного (интра-коммуникатор).
  • Некоторые системы / пакетные системы HPC не поддерживают порождение процессов MPI

Примите это во внимание при оценке того, как вы проектируетеваше заявление.

...