пользовательский обработчик прерываний для mpirun

По-видимому,mpirun использует обработчик SIGINT, который "вперед" сигнал SIGINT для каждого из процессов, которые он породил.

Это означает, что вы можете написать обработчик прерывания для вашего кода с поддержкой mpi, выполнитьmpirun -np 3 my-mpi-enabled-executable и тогда SIGINT будет поднят для каждого из трех процессов. Вскоре после этого mpirun выходит. Это прекрасно работает, когда у вас есть небольшой пользовательский обработчик, который только печатает сообщение об ошибке, а затем завершает работу.тем не мениекогда ваш пользовательский обработчик прерываний выполняет нетривиальную работу (например, выполняет серьезные вычисления или сохраняет данные), обработчик не запускается до конца. Я'Я предполагаю, что это потому, что mpirun решил выйти слишком рано.

Вот's stderr при нажатииctrl-c (то есть вызывая SIGINT) после выполненияmy-mpi-enabled-executable, Это желаемое ожидаемое поведение:

interrupted by signal 2.
running viterbi... done.
persisting parameters... done.
the master process will now exit.

Вот's stderr при нажатииctrl-c после выполненияmpirun -np 1 my-mpi-enabled-executable, Это проблемное поведение:

interrupted by signal 2.
running viterbi... mpirun: killing job...

--------------------------------------------------------------------------
mpirun noticed that process rank 0 with PID 8970 on node pharaoh exited on signal 0 (Unknown signal 0).
--------------------------------------------------------------------------
mpirun: clean termination accomplished

Отвечая на любой из следующих вопросов решит мою проблему:

Как переопределить обработчик mpirun SIGINT (если это вообще возможно)?Как избежать завершения процессов mpirun, порожденных сразу после завершения mpirun?Есть ли другой сигнал, который mpirun может посылать дочерним процессам до того, как mpirun завершит работу?Есть ли способзахватить" так называемый "сигнал 0 (неизвестный сигнал 0) (см. второй stderr выше)

m работает под управлением openmpi-1.6.3 на Linux.

Ответы на вопрос(2)

Ваш ответ на вопрос