mpi4py: проблемы с отправкой сообщений подчиненным через send/recv

avatar
Farzad Vertigo
8 апреля 2018 в 11:10
314
1
1

Я пытаюсь запустить следующий код в кластере slurm. Логика проста: главный узел отправляет элементы списка подчиненному узлу для печати. Наконец, он использует сообщение с тегом = 1, чтобы сообщить подчиненному устройству о завершении цикла.

from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
status = MPI.Status()


if rank == 0:
    data = ['string1', 'string2', 'string3']
    for k in data:
        comm.send(k, dest=1, tag=11)
    comm.send('', dest=1, tag=1)
elif rank == 1:
    while True:
        print('trying to get something')
        item = comm.recv(source=0,status=status)

        if status.tag == 1:
            print('terminating')
            break

        print(item)

Я получаю следующие выходные данные на своем локальном компьютере, который, как ожидается:

trying to get something
string1
trying to get something
string2
trying to get something
string3
trying to get something
terminating

Но в кластере он показывает мне следующий вывод, и кажется, что ведомое устройство блокируется во время первого comm.recv на неопределенный срок.

 trying to get something

Я признателен за любые идеи о недостатках в логике завершения подчиненного устройства или решения упомянутой проблемы.

Источник
Gilles Gouaillardet
11 апреля 2018 в 02:42
0

Вы пытались запустить как простую программу MPI, так и mpi4py helloworld?

Farzad Vertigo
11 апреля 2018 в 10:39
0

Я запускал их, и они работают нормально. Странно то, что когда я использую это, пока True, программа зависает в кластере, пока не достигнет времени стены. Действительно запутанное дело!

Gilles Gouaillardet
11 апреля 2018 в 11:50
0

делает ли ваша программа MPI helloworld какую-либо связь? если нет, вы можете попробовать простую кольцевую программу. что, если вы напечатаете тег сразу после MPI_Recv()?

Farzad Vertigo
11 апреля 2018 в 14:38
1

Программа никогда не достигает строки после item= ... .когда я добавляю туда строку печати ни разу. Такое поведение действительно сбивает с толку, и я собираюсь предположить, что может быть ошибка в версии библиотеки, используемой кластером slurm.

Ответы (1)

avatar
David Daverio
11 апреля 2018 в 02:26
-1

Единственная причина, по которой я вижу, заключается в том, что тег recv не соответствует ни одному тегу, а затем recv не возвращается. Но я думал, что тег по умолчанию действительно MPI.ANY_TAG, а может и нет. Попробуйте добавить: tag=MPI.ANY_TAG в ваш recv Если это не работает, попробуйте свой код без тегов. Затем попробуйте исправить версию тега.

Но вы можете быть удивлены результатами... Может быть, первое сообщение, которое принимает recv, это сообщение с тегом=1, поэтому время прерывается. Вероятно, это будет вовсе не безопасный код.

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

Farzad Vertigo
11 апреля 2018 в 10:37
1

В соответствии с this порядок отправляемых сообщений гарантированно сохраняется, а тег по умолчанию — MPI.ANY_TAG. Код отлично работает локально, но просто зависает в кластере.

David Daverio
13 апреля 2018 в 00:48
0

Если реализация соответствует стандарту :-(, не всегда так :-(. Я думаю, что значение по умолчанию равно -1, возможно, на кластере MPI_ANY_TAG не установлен в -1.