2016-09-21 5 views
0

У меня есть кусок кода, который использует mpi4py для создания нескольких экземпляров mpi exectuable. Я хочу, чтобы код был остановлен, пока эти процессы завершены, а затем вызывает вторую группу одного и того же исполняемого файла.Барьер после порожденного процесса mpi4py

Проблема в том, что все вызовы исполняемого файла mpi немедленно генерируются.

Похоже, что нет возможности использовать барьер для предотвращения этого. Кто-нибудь знает, правильно ли это, и если у кого-то есть яркая идея получить результат, который мне нужен.

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

rank = MPI.COMM_WORLD.Get_rank() 
new_comm = MPI.COMM_WORLD.Split(color=rank, key=rank) 
print(new_comm.Get_rank()) 

cwd=os.getcwd() 
directory=os.path.join(cwd,str(rank)) 
print(rank,directory) 
os.chdir(directory) 


new_comm.Spawn("SOME_F90_MPI_EXECUTABLE", 
        args=None, 
          maxprocs=4) 

'''I want to pause here until the spawned processes finish running...''' 
new_comm.Barrier() 
MPI.COMM_WORLD.Barrier() 

print(new_comm.Get_rank()) 

cwd=os.getcwd() 
directory=os.path.join(cwd,str(rank)) 
print(rank,directory) 
os.chdir(directory+"_2") 


new_comm.Spawn("SOME_F90_MPI_EXECUTABLE", 
        args=["> output"], 
          maxprocs=4) 

new_comm.Disconnect() 

print("All finished here.....") 

Спасибо!

ответ

1

Вы должны использовать интеркоммуникатор возвращенное Spawn:

child_comm = MPI.COMM_WORLD.Spawn("./spawnchild.py", args=None, maxprocs=2) 
child_comm.Barrier() 

Для ребенка, получить родительские интеркоммуникатор (аналогично в Fortran):

parent = MPI.COMM_WORLD.Get_parent() 
assert(parent != MPI.COMM_NULL) 
parent.Barrier(); 

Обратите внимание, что интеркоммуникатора, который состоит из процессов из двух групп, ведет себя отличным от традиционного intercommunicator. Например. для Барьера применяются следующие семантики:

Если comm является intercommunicator, MPI_BARRIER включает в себя две группы. Вызов возвращается в процессах в одной группе (группа A) межкоммуникатора только после того, как все члены другой группы (группа B) вошли в вызов (и наоборот). Процесс может вернуться из вызова, прежде чем все процессы в его собственной группе войдут в вызов.

(MPI 3.1 Standard, 5,3)

+0

Великий - благодаря Zulan. Если я зациклился на процессе появления, мне нужно отключить/освободить интеркоммуникатор, возвращенный икру, прежде чем входить в цикл во второй раз? – abinitio

+0

Я считаю, что вам следует отключить межкоммуникатор, но я не совсем уверен, соответствует ли стандарт этому. – Zulan

+0

Я не уверен, почему, но исполняемый файл f90, кажется, виснет после того, как его породили, несмотря на то, что он был, казалось бы, закончен, т. Е. Весь выход был выполнен. Когда я запускаю исполняемый файл f90, не вызывая его из скрипта python, он должен занимать долю секунды, но когда он запускается, будучи порожденным, он висит около нескольких минут. Это то, что вы заметили раньше? – abinitio