В спецификации MPI для MPI_COMM_FREE
указано, что "... объект фактически освобождается, только если на него нет других активных ссылок." Вы можете отключить процессы, вызвав MPI_COMM_DISCONNECT
на обоих концах всех интеркоммуникаторов, которые связывают их. Эквивалентный вызов mpi4py, вероятно, icomm.Disconnect()
.
Тем не менее ошибка, которую вы видите, вероятно, исходит от orterun
(обозначается как mpirun
и mpiexec
), а не от уровня мастера. orterun
— это тот, кто запускает все процессы MPI (первоначальные и порожденные позже), а затем перенаправляет их стандартный вывод на свой собственный стандартный вывод, чтобы вы могли видеть вывод каждого ранга. Когда процессы запускаются на локальном хосте, orterun
использует простой механизм fork()
/exec()
как часть структуры odls
для порождения новых рангов и использует каналы для обнаружения успешного запуска и переадресации ввода-вывода. Каналы обнаружения запуска открыты только в течение очень короткого периода времени, но каналы пересылки ввода-вывода остаются открытыми, пока работает ранг. Если у вас одновременно запущено много рангов, многие каналы останутся открытыми и, следовательно, появится сообщение об ошибке.
Сообщение об ошибке немного вводит в заблуждение, поскольку существует два случая «слишком большого количества дескрипторов», и Open MPI не различает их. В первом случае достигается жесткий предел ядра, но обычно это очень большое значение. Второй случай — когда достигнут предел количества файловых дескрипторов для каждого процесса. Последним можно управлять с помощью команды ulimit
. Вы должны проверить значение в вашем случае с помощью ulimit -n
и в конечном итоге увеличить его. Например:
user@host$ ulimit -n 123456
user@host$ mpiexec -n 1 ... ./spawning_code.py arg1 arg2 ...
Здесь 123456
— желаемое ограничение на количество дескрипторов, и оно не может превышать жесткого ограничения, которое можно получить с помощью ulimit -nH
. Если вы запускаете свою программу из сценария (либо для удобства, либо потому, что вы отправляете задания в какую-либо систему пакетной очереди), вы должны поместить строку ulimit -n
в сценарий перед вызовом mpirun
/mpiexec
.
Также в приведенном выше тексте слова ранг и процесс используются для обозначения одного и того же.
person
Hristo Iliev
schedule
20.12.2013
icomm.Disconnect()
. mpi4py.scipy.org - person francis   schedule 20.12.2013