2015-03-19 3 views
2

Моя цель - создать скрипт python для запуска другого скрипта python для разных процессов, то есть я хочу разложить скрипт поверх n процессов. Чтобы попытаться добиться этого, я пытаюсь запустить пример икру mpi4py, указанный в документации (см. http://mpi4py.scipy.org/docs/usrman/tutorial.html). Но этот пример терпит неудачу с сообщением:mpi4py spwn связь между процессами не работает в Windows 7

По меньшей мере одна пара процессов MPI не может достигать друг друга для MPI-связи. Это означает, что ... Эта ошибка иногда может быть результатом забывания указать «сам» BTL. ... Ваша работа MPI теперь собирается прервать.

моя установка находится на машине с Windows 7 с openMPI 1.6.1 и последней установкой mpi4py.

Код, в моем случае: master.py:

#!/usr/bin/env python 
from mpi4py import MPI 
import numpy 
import sys 

comm = MPI.COMM_SELF.Spawn(sys.executable, 
          args=['worker.py'], 
          maxprocs=5) 

N = numpy.array(100, 'i') 
comm.Bcast([N, MPI.INT], root=MPI.ROOT) 
PI = numpy.array(0.0, 'd') 
comm.Reduce(None, [PI, MPI.DOUBLE], 
      op=MPI.SUM, root=MPI.ROOT) 
print(PI) 

comm.Disconnect() 

worker.py:

#!/usr/bin/env python 
from mpi4py import MPI 
import numpy 

comm = MPI.Comm.Get_parent() 
size = comm.Get_size() 
rank = comm.Get_rank() 

N = numpy.array(0, dtype='i') 
comm.Bcast([N, MPI.INT], root=0) 
h = 1.0/N; s = 0.0 
for i in range(rank, N, size): 
    x = h * (i + 0.5) 
    s += 4.0/(1.0 + x**2) 
PI = numpy.array(s * h, dtype='d') 
comm.Reduce([PI, MPI.DOUBLE], None, 
      op=MPI.SUM, root=0) 

comm.Disconnect() 

линия производит ошибку является:

comm = MPI.COMM_SELF.Spawn(sys.executable, 
          args=['worker.py'], 
          maxprocs=5) 

команда для запуска скрипта находится в командной строке:

mpirun -n 1 python.exe master.py 

ответ

-2

Вы создаете «sys.executable», который является основной программой. Необходимо указать имя рабочей программы.

+1

Спасибо, но не могли бы вы быть более чувствительны к тому, как это сделать. Я думал, что поставить аргумент: 'args = ['worker.py']' будет именно тем, что вы упоминаете? – Yvus

+0

Мне также интересно об этом – kilojoules

+0

Итак, вы меня опустили, потому что вы не понимаете моего ответа? Аргумент args - это аргументы командной строки, которые вы передаете исполняемому файлу, который вы запускаете. И исполняемый файл, который вы запускаете, по-прежнему «sys.executable». Таким образом, вы выдаете команду: master.py worker.py См.? Вы вызываете главную программу с именем рабочего в качестве аргумента. –

Смежные вопросы