Программа MPI Python с использованием mpi4py.futures.MPICommExecutor () не завершает выполнение - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь написать простую параллельную программу на основе mpi на python, используя mpi4py, которая асинхронно распределяет некоторое количество заданий среди некоторого пула рабочих процессов, а затем собирает ответы, когда все они сделаны. У меня есть следующая программа на Python:

from mpi4py import MPI
from mpi4py.futures import MPICommExecutor
import math

def primefact(n):
     facts = [1]
     if n < 1:
          return []
     while n % 2 == 0: 
          facts.append(2) 
          n = n / 2
     for i in range(3,int(math.sqrt(n))+1,2): 
          while n % i== 0: 
               facts.append(i) 
               n = n / i 
     if n > 2: 
          facts.append(n)
     return facts

def test_primefact(nums):
     with MPICommExecutor(MPI.COMM_WORLD, root=0) as executor:
          if executor is None: 
               return
          jobs = [executor.submit(primefact,qq) for qq in nums]
          facts = [job.result() for job in jobs]
          for rslt in zip(nums,facts):
               print('{}: '.format(rslt[0]) + ', '.join([str(qq) for qq in rslt[1]]))

if __name__ == "__main__":
     nums = [qq for qq in range(1,201)]
     test_primefact(nums)

Когда я запускаю программу с помощью команды mpiexec -n 4 ./mpitest.py, выполнение программы зависает на неопределенный период времени. Если я посылаю сигнал завершения, нажимая Ctrl-C, программа выводит на печать все выходные данные (так что в какой-то момент он выполнял вычисления; я не знаю, делал ли он их до или после того, как отправил сигнал завершения), но это не вернет мне командную строку. Если я снова отправлю сигнал завершения, я получу командную строку обратно, но процессы, созданные mpiexec, все еще будут работать в фоновом режиме, и мне придется их вручную убивать. Я пропускаю где-нибудь строку, которая позволяет MPICommExecutor знать, что все выполнено, поэтому он может выйти? Насколько я могу судить, я не делаю ничего существенно отличного от примеров здесь и здесь .

  • mpi4py 3.0.0
  • python 3.6
  • Библиотека Intel® MPI для Linux * OS, версия 2019, обновление 1, сборка 20181016
...