mpi4py: isend ведет себя странно, если взаимодействующие процессы выполняются на разных машинах - PullRequest
0 голосов
/ 24 сентября 2018

Я тестирую неблокирующую связь, поддерживаемую mpi4py, и столкнулся с неожиданным (по крайней мере для меня) поведением isend: по какой-то причине сообщение, отправленное с isend, не доставляется до тех пор, пока процесс отправки не будетЗакончен или wait метод экземпляра запроса, возвращенный isend, вызывается, что сводит на нет полезность isend.

Такое поведение наблюдается только в том случае, если процессы выполняются на разных машинах.

Код:

from mpi4py import MPI
import socket
from time import sleep,time


comm = MPI.COMM_WORLD
rank = comm.Get_rank()
node=socket.gethostname()


print 'rank {} on {}'.format(rank,node)
if rank == 1:
    message=1
    req_send=comm.isend(message, dest=0, tag=11)
    #req_send.wait() #no issue if uncommented
    sleep(10)
    print 'sending process finished'

elif rank == 0:
    t=time()
    data=comm.recv(source=1, tag=11)
    print 'message recieved: {}, waiting time: {}'.format( data,time()-t)

Результаты / выводы:

1 . Разные машины, #req_send.wait() строка закомментирована ( неправильная настройка ; сообщение принимается только после завершения процесса отправки, что добавляет 10 секундна время ожидания):

rank 0 on node1
rank 1 on node2
sending process finished
message recieved: 1, waiting time: 10.0342979431

2 . Разные машины, req_send.wait() строка без комментариев:

rank 0 on node1
rank 1 on node2
message recieved: 1, waiting time: 0.000602006912231
sending process finished

3 .Такая машина, с или без req_send.wait() строки:

rank 1 on node1
rank 0 on node1
message recieved: 1, waiting time: 2.09808349609e-05
sending process finished

Я попробовал несколько сборок mpi4py для ancaconda2, и поведение аналогичное.Но использование anaconda mpi4py и неправильная настройка приводит к дополнительной ошибке , появляющейся в выходных данных:

rank 0 on node1
rank 1 on node2
sending process finished
message recieved: 1, waiting time: 10.0120418072
Assertion failed in file ch3u_handle_connection.c at line 332: vc->state == MPIDI_VC_STATE_LOCAL_CLOSE || vc->state == MPIDI_VC_STATE_CLOSE_ACKED
internal ABORT - process 1

Что может вызвать эту проблему?Как это можно решить / приблизиться?

...