操作系统chdir()不适用于mpi4py生成

2024-05-28 19:23:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个小的测试代码,作为一个任务场。其思想是,任务列表将被发送到由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()

以及从.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/

任何关于为什么会发生这种行为的想法都将不胜感激!你知道吗


Tags: toimport目录sourcenewdatagetos
1条回答
网友
1楼 · 发布于 2024-05-28 19:23:58

MPI_COMM_SPAWNMPI.Comm.Spawn所构建的MPI操作采用一个MPI_INFO对象,该对象可用于提供其他特定于实现的信息。参数也可以在mpi4py中作为命名的info参数提供。你知道吗

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

对于许多现有的MPI实现,用于设置子进程的工作目录的info键是wdir。你知道吗

相关问题 更多 >

    热门问题