Я тестирую неблокирующую связь, поддерживаемую 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
Что может вызвать эту проблему?Как это можно решить / приблизиться?