我试图在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
插入一些打印语句是否已正确初始化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)