os.chdir() не работает с порождением mpi4py

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

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

Мастер-код выполняется в /top/level/folder/

и содержит список задач, например: [0,1,2,3,4,5,6,7,8,9,10]. Каждое подчиненное устройство получает задачу и переходит в каталог с тем же именем перед выполнением исполняемого файла mpi, а затем возвращается обратно.

Мастер-код:

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


comm = MPI.COMM_WORLD
rank = MPI.COMM_WORLD.Get_rank()

processes=4

tasks=([StopIteration] * (processes))+[0,1,2,3,4,5,6,7,8,9,10]

new_comm=comm.Spawn("/path/to/slave/slave.py",
                  args=[],maxprocs=processes)

status=MPI.Status()

while tasks:
    new_comm.recv(source=MPI.ANY_SOURCE, status=status)
    data=tasks.pop()
    print("on master received source: ",status.Get_source())
    print("On master sending: ",data," to:",status.Get_source())
    new_comm.send(obj=data,dest=status.Get_source())
    print("On master sent: ",data," to:",status.Get_source())


print("Finished All",rank)
new_comm.Barrier()
print("after barrier",rank)
print("rank", rank,"task",tasks)
new_comm.Disconnect()

и код slave.py:

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

comm = MPI.Comm.Get_parent()
rank = comm.Get_rank()
cwd=os.getcwd()

print("slave", rank," entering loop")
for task in iter(lambda: comm.sendrecv(dest=0), StopIteration):
    print("slave ", rank," recvd data", task)
    print("slave ", rank," going to sleep")
    directory=os.path.join(cwd,str(task))
    os.chdir(directory)
    new_comm=MPI.COMM_SELF.Spawn("/path/to/some/mpi-executable",
                  args=[],maxprocs=4)
    os.chdir(cwd)
    new_comm.Barrier()
    new_comm.Free()


comm.Barrier()
comm.Disconnect()

Но каждый экземпляр исполняемого файла mpi пытается запуститься в /top/level/folder/

Любые идеи относительно того, почему такое поведение происходит, будут оценены!


person abinitio    schedule 10.11.2016    source источник
comment
Обратитесь к документации базовой реализации MPI, если она поддерживает параметр, переданный в MPI_Spawn для управления каталогом выполнения, и если оболочка python позволяет передать его. Или просто отправьте рабочий каталог после вызова spawn и позвольте процессу внести изменения для себя - это даже не зависит от реализации.   -  person Georg Bisseling    schedule 10.11.2016
comment
Привет, Георг - спасибо за вклад. Насколько я вижу, нет способа передать каталог с помощью вызова вызова mpi4py. Я меняю рабочий каталог после первого появления — как вы можете видеть в файле slave.py. Это изменение не происходит. Точнее, когда я печатаю cwd, похоже, что он изменил папку, но похоже, что нерест снова происходит выше в папке верхнего уровня, где был запущен исходный скрипт. Исполняемый файл mpi, который я вызываю в сценарии slave.py, — это fortran90, и я не хочу начинать добавлять что-то, пытаясь изменить там папку. Спасибо!   -  person abinitio    schedule 11.11.2016


Ответы (1)


MPI_COMM_SPAWN, операция MPI, на которой построена MPI.Comm.Spawn, принимает объект MPI_INFO, который можно использовать для предоставления дополнительной информации, специфичной для реализации. Аргумент также может быть указан в mpi4py как именованный аргумент info.

info = MPI.Info.Create()
info.Set('key', 'value')
MPI.Comm.Spawn(..., info=info, ...)

Во многих существующих реализациях MPI информационный ключ для установки рабочего каталога дочерних процессов — wdir.

person Hristo Iliev    schedule 11.11.2016
comment
Это то, что я только смутно вспомнил! - person Georg Bisseling; 12.11.2016
comment
Да, спасибо, ребята, прекрасный материал. Lisandro Dalcin из группы mpi4py google указал мне на то же самое. - person abinitio; 14.11.2016