Я пытаюсь написать простую параллельную программу на основе 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