2014-12-16 2 views
1

Я пишу код python, используя mpi4py, из которого я импортирую MPI. Затем я установил глобальный коммуникатор MPI.COMM_WORLD и сохранил в переменной comm.Какие операции в mpi4py являются операциями «синхронизации»

Я запускаю этот код с n> 1 потоками, и в какой-то момент все они входят в цикл for (все ядра имеют одинаковое количество итераций для прохождения).

Внутри цикла for у меня есть вызов «comm.reduce (...)». Кажется, что это работает для небольшого количества ядер, но по мере увеличения размера проблемы (с 64 ядрами, скажем), я испытываю, что моя программа «зависает».

Так что мне интересно, связано ли это с вызовом reduce (...). Я знаю, что для этого вызова нужны все потоки (т. Е. Мы запускаем всего 2 потока. Если один поток входит в цикл, а другой не по какой-либо причине, программа зависает, потому что вызов reduce (...) ждет для обоих потоков).

Мой вопрос: ли уменьшить называют «синхронизации» задачи, то есть, он работает как «comm.Barrier()» называют? И, если это возможно, в более общем плане, какие задачи синхронизации (если есть, кроме Барьера)?

ответ

2

Да, стандартный запрет MPI блокирует (все потоки должны связываться с корнем до того, как любой поток может продолжить). Другие блокирующие вызовы: Allgather, Allreduce, AlltoAll, Barrier, Bsend, Gather, Recv, Reduce, Scatter и т. Д.

Многие из них имеют неблокирующие эквиваленты, которые вы найдете, которым предшествует I (Isend eg) но они не реализованы по всем направлениям в mpi4py.

См. mpi: blocking vs non-blocking для получения дополнительной информации.

Не уверен, что вы повесите трубку. Может быть, проблема переполнения процессора - запуск 64-потокового задания на четырехъядерном рабочем столе может стать громким.

+0

Спасибо. Я попробую искать ошибку где-то в другом месте :) – denvar

 Смежные вопросы

  • Нет связанных вопросов^_^