【问题标题】:MPI ranks forking a processMPI 对进程进行排序
【发布时间】:2018-02-28 21:29:19
【问题描述】:

我正在实现一个工作流,该工作流的一部分是调用一个 python 脚本,并在该 python 脚本中让每个等级运行一个可执行文件或 python 程序。

所以为了测试我写了一个简单的程序,但它不能正常工作。代码描述如下:

helloworld.py

from mpi4py import MPI
import sys
import subprocess

mpi_warn_on_fork = 0

size = MPI.COMM_WORLD.Get_size()
rank = MPI.COMM_WORLD.Get_rank()
name = MPI.Get_processor_name()

for i in range(size):
  if rank == i:
    command = "python hello.py %d %d %s" % (rank, size, name)
    subprocess.call("command", shell = True)

你好.py

import sys
print "Hello from rank = %s of %s on host %s" %(sys.argv[1], sys.argv[2], sys.argv[3])

我使用以下方法调用程序: mpirun -np 16 python helloworld.py

但是这个实现不起作用,因为在 16 个进程中只有一个分叉一个进程,mpirun 运行时会生成有关程序中使用分叉的警告消息。

有人可以推荐一些东西,这样我就可以让每个 MPI 等级都能正确执行 shell 命令。

编辑: 在 C/C++ 中实现这个想法的建议也将起作用。

【问题讨论】:

  • 不要使用shell = True;写subprocess.check_call(["python","hello.py",str(rank),str(size),name]).
  • 如果你在运行命令之前真的不需要对通信器进行操作,你甚至可以使用没有 MPI 库甚至 shell 脚本的 Python 来执行 MPI 程序。

标签: python mpi mpi4py


【解决方案1】:

你不能在helloworld.py的最后一行引用"command"(它是一个变量,而不是一个字符串)。

command = "python hello.py %d %d %s" % (rank, size, name)
subprocess.call(command, shell = True)

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 2011-11-18
    • 1970-01-01
    • 2011-06-28
    • 2019-05-09
    • 2015-01-30
    • 2013-05-07
    • 2021-02-11
    • 1970-01-01
    相关资源
    最近更新 更多