0

我正在尝试在 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

在此处输入图像描述

4

1 回答 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 方法不将要接收的变量作为参数:

nvalue=comm.recv(来源=rank+1)

于 2019-04-26T08:51:20.330 回答