У меня есть небольшой тестовый код, который действует как ферма задач. Идея состоит в том, что список задач будет отправлен группе процессов, порожденных 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/
Любые идеи относительно того, почему такое поведение происходит, будут оценены!