MPI - 点对点通信Linnear通信`

问题描述 投票:0回答:1

我试图在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

python jupyter-notebook mpi point-to-point
1个回答
1
投票

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

你从微软安装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方法不接受变量作为参数接收:

n值= comm.recv(源=秩+ 1)

© www.soinside.com 2019 - 2024. All rights reserved.