mpi4py 返回排名差异
Posted
技术标签:
【中文标题】mpi4py 返回排名差异【英文标题】:mpi4py returning rank differences 【发布时间】:2013-03-20 07:24:49 【问题描述】:我想跨两个不同版本的 python 从 python 脚本(并且,为了测试,以交互方式,但不是从 ipython)启动并行进程,并从 mpi4py
开始。这两个版本是(分别适用于 2 核和 8 核):
Python 2.7.2 |EPD 7.2-2 (64-bit)| (default, Sep 7 2011, 16:31:15)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
和
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
[GCC 4.4.3] on linux2
在第一个(学习绳索)上,我以交互方式得到:
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))
我明白了
Hello, World! I am process 0 of 5 on localhost.
Hello, World! I am process 1 of 5 on localhost.
Hello, World! I am process 2 of 5 on localhost.
Hello, World! I am process 3 of 5 on localhost.
Hello, World! I am process 4 of 5 on localhost.
交互式启动python时如何获取size
> 0?
顺便说一句,使用./helloworld.py
而不是python helloworld.py
是行不通的:
localhost:demo jtlz2$ mpiexec -n 5 ./helloworld.py
--------------------------------------------------------------------------
Failed to find or execute the following executable:
Host: localhost
Executable: ./helloworld.py
Cannot continue.
--------------------------------------------------------------------------
任何想法为什么?谢谢!
【问题讨论】:
【参考方案1】:如果不是从 mpirun
/mpiexec
启动,MPI 可执行文件会形成 singletons,这就是为什么 MPI_COMM_WORLD
的大小始终为 1。
至于mpiexec
找不到可执行文件,后者必须设置其“可执行”位,例如通过
$ chmod +x helloworld.py
交互式运行 MPI 作业很棘手。大多数 MPI 实现对所有进程执行输出重定向,这就是您可以看到组合输出的原因,但输入重定向并非如此。只有等级 0 能够接收交互式输入。不过,您可以做几件事:
以交互方式运行 rank 0 并让其他 rank 执行脚本。这将允许您探索与其他等级的通信:$ 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 派生的实现。
【讨论】:
以上是关于mpi4py 返回排名差异的主要内容,如果未能解决你的问题,请参考以下文章
ROW_NUMBER 和 PARTITION 查询返回所有排名为 1 的行
尚大HQL-1_查询订单明细表(order_detail)中销量(下单件数)排名第二的商品id,如果不存在返回null,如果存在多个排名第二的商品则需要全部返回。