MPI-点对点通信Linnear Communication`

时间:2019-04-26 08:21:24

标签: python jupyter-notebook mpi point-to-point

我正在尝试在Python上编写MPI程序以计算邻居值的平均值。

我的算法如下

  

与您拥有的邻居一起初始化价值。然后计算您的邻居的平均值,然后减去新值。

我编写了以下程序

from mpi4py import MPI
import sys



comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()
myvalue=2
sum=0
neighb=1
nvalue=0


if rank == 0 or rank == size-1:

myvalue=1
neighb=myvalue

if rank < size-1:
    msg = myvalue
    comm.send(msg, dest=rank+1)
    sys.stdout.write("rank send %d: %s" % (rank, myvalue))
    comm.recv(nvalue,source=rank+1)
    sum+=nvalue
    sys.stdout.write("rank RECV %d: %s" % (rank, nvalue))
if rank > 0:
    comm.recv(nvalue,rank-1)
    sum+=nvalue
    sys.stdout.write("rank RECV %d: %s" % (rank, nvalue))
    comm.send(myvalue,rank-1)
    sys.stdout.write("rank send %d: %s" % (rank, myvalue))

avg =sum/neighb
myvalue-=avg

但是该程序无法正常工作,它被卡住,当我尝试使用以下命令在控制台上运行该程序时,会出现以下窗口,

mpiexec -n 4 python p2p_linnear.py -m mpi4py

enter image description here

1 个答案:

答案 0 :(得分:1)

插入一些打印语句,以确定MPI是否已正确初始化。例如大小和等级

您是从Microsoft安装MPI吗?

mpi4py要求在主机系统上安装Microsoft MPI 6。那是系统范围内的安装,目前无法通过conda获得。为了成功使用mpi4py,必须安装Microsoft MPI,然后将MPI安装的bin目录附加到PATH环境变量中。要安装Microsoft MPI,请参见https://www.microsoft.com/en-us/download/details.aspx?id=47259

并且您正在使用阻塞式通信(发送和接收),但是您想要将数据发送到所有其他级别,因此您需要非阻塞式通信(isend,irecv)。

另外:recv方法不将要接收的变量作为参数:

nvalue = comm.recv(source = rank + 1)