Какие операции в mpi4py являются операциями синхронизации

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

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

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

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

У меня вопрос: Является ли вызов reduce задачей "синхронизации", т. е. работает ли он как вызов "comm.Barrier ()"? И, если возможно, в целом, каковы задачи синхронизации (кроме Barrier)?


person denvar    schedule 16.12.2014    source источник


Ответы (1)


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

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

Дополнительную информацию см. В разделе mpi: blocking vs non-blocking.

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

person Malcolm White    schedule 16.12.2014
comment
Спасибо. Тогда я попробую поискать ошибку где-нибудь в другом месте :) - person denvar; 16.12.2014