MPI - двухточечная связь Linnear Communication `
Я пытаюсь написать MPI-программу на Python для расчета среднего значения соседей.
Мой алгоритм выглядит следующим образом
Инициализируйте значение с вашими соседями. Затем вычислите среднее значение ваших соседей и вычтите новое значение.
Я написал следующую программу
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
1 ответ
Вставьте несколько операторов печати, правильно ли инициализирован MPI. например, размер и ранг
Вы установили MPI от Microsoft?
mpi4py требует, чтобы Microsoft MPI 6 был установлен на хост-системе. Это общесистемная установка, которая в настоящее время недоступна через conda. Чтобы успешно использовать mpi4py, вы должны установить Microsoft MPI, а затем добавить каталог bin установки MPI в переменную среды PATH. Для установки Microsoft MPI см. https://www.microsoft.com/en-us/download/details.aspx?id=47259
и вы используете блокирующую связь (send и recv), но вам нужна отправка данных во все другие ряды, и поэтому вам нужна неблокирующая связь (isend, irecv).
Также: метод recv не принимает переменную, которая будет получена в качестве аргумента:
nvalue= comm.recv (источник = ранг +1)