MPI - двухточечная связь Linnear Communication ` - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь написать 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

enter image description here

1 Ответ

1 голос
/ 26 апреля 2019

вставить некоторые операторы печати, если 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 (source = rank + 1)

...