Я пытаюсь запустить следующий код в кластере 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
Я признателен за любые идеи о недостатках в логике завершения подчиненного устройства или решения упомянутой проблемы.
Вы пытались запустить как простую программу
MPI
, так иmpi4py
helloworld?Я запускал их, и они работают нормально. Странно то, что когда я использую это, пока True, программа зависает в кластере, пока не достигнет времени стены. Действительно запутанное дело!
делает ли ваша программа MPI helloworld какую-либо связь? если нет, вы можете попробовать простую кольцевую программу. что, если вы напечатаете тег сразу после
MPI_Recv()
?Программа никогда не достигает строки после item= ... .когда я добавляю туда строку печати ни разу. Такое поведение действительно сбивает с толку, и я собираюсь предположить, что может быть ошибка в версии библиотеки, используемой кластером slurm.