我想从两个不同版本的python中的python脚本(以及交互式测试,而不是ipython)中启动并行进程,并且已经开始使用mpi4py。这两个版本(分别为2和8个核心):
Python 2.7.2 | EPD 7.2-2(64位)| (默认,2011年9月7日,16:31:15) [dclwin上的[GCC 4.0.1(Apple Inc. build 5493)]
和
Python 2.6.5(r265:79063,2010年4月16日,13:57:41) linux2上的[GCC 4.4.3]
在第一个(学习绳索),交互式地得到:
from mpi4py import MPI
import sys
size = MPI.COMM_WORLD.Get_size()
print size
1
rank = MPI.COMM_WORLD.Get_rank()
print rank
0
这不是我想要的(并且做mpirun / mpiexec python似乎挂起/什么都不做)。但如果我这样做:
mpiexec -n 5 python helloworld.py
在
#!/usr/bin/env python
from mpi4py import MPI
import sys
size = MPI.COMM_WORLD.Get_size()
rank = MPI.COMM_WORLD.Get_rank()
name = MPI.Get_processor_name()
sys.stdout.write(
"Hello, World! I am process %d of %d on %s.\n"
% (rank, size, name))
我得到了
你好,世界!我是localhost上的第0个过程。
你好,世界!我是localhost上的第1个过程。
你好,世界!我是本地主机的第2步,共5步。
你好,世界!我是localhost上的第3步(共5步)。
你好,世界!我是localhost上的第4个过程。
我如何获得尺寸>交互式启动python时为0?
顺便说一句,执行./helloworld.py而不是python helloworld.py不起作用:
无法找到或执行以下可执行文件:
主持人:localhost 可执行文件:./ helloworld.py
任何想法为什么?谢谢!
答案 0 :(得分:6)
如果未从mpirun
/ mpiexec
启动,则MPI可执行文件形成singletons,这就是MPI_COMM_WORLD
始终为1的原因。
至于mpiexec
未能找到可执行文件,后者必须设置其“可执行”位,例如通过
$ chmod +x helloworld.py
交互式运行MPI作业非常棘手。大多数MPI实现为所有进程执行输出重定向,这就是您可以看到组合输出的原因,但对于输入重定向则不然。只有等级0才能接收交互式输入。但是你可以做几件事:
以交互方式运行排名0,让其他排名执行脚本。这将允许您探索与其他等级的通信:
$ mpiexec -np 1 python : -np 4 python script.py
这将以交互模式启动一个解释器副本作为等级0然后四个副本script.py
的排名为1到4。
在其自己的图形终端仿真器中以每个等级交互运行,例如: xterm
:
$ mpiexec -np 5 xterm -e python
这将在所有这些内容中启动5个xterms和一个单独的Python解释器副本。这种方法要求每个xterm
能够与您的X11显示服务器通信,这意味着您可能必须明确传递DISPLAY
环境变量的值,例如:使用-x DISPLAY
用于Open MPI或-genv DISPLAY
用于MPICH派生的实现。