2015-01-18 2 views
2

Как можно обрабатывать сигналы в безопасном режиме и приложение MPI (например, SIGUSR1, который должен сообщить приложению, что его время выполнения истекло и должно завершиться в следующие 10 мин.) У меня есть несколько ограничения:Обработка сигналов в приложении MPI/Изящный выход

  • Завершить все параллельные/последовательные ввода-вывода сначала для выхода из приложения!
  • Во всех остальных случаях приложение может выйти без каких-либо проблем

Как может это быть достигнуто безопасно, нет тупиков при попытке выйти и правильно выходить из текущего контекста прыгает обратно в main() и призывающую MPI_FINALIZE()? Каким-то образом процессы должны взаимодействовать с выходом (я думаю, что это одно и то же в многопоточных приложениях), но как это делается эффективно, не имея большого общения? Кто-нибудь знает какой-то стандартный способ сделать это правильно?

Ниже приведены некоторые мысли, которые могут или не могут работать:

Идея 1:
Допустим, для каждого процесса мы ловим сигнал в обработчике сигнала и толкать его на «стек необработанное сигналов» (USS), и мы просто возвращаемся из процедуры обработчика сигнала. Затем у нас есть определенные терминальные точки в нашем приложении, особенно до и после операций ввода-вывода, которые затем обрабатывают все сигналы в USS. Если в USS есть SIGUSR1, каждый процесс затем выйдет в точке завершения.

  • Эта идея возникла проблема, что там еще может быть тупиков, процесс 1 только подхватить Befor с состоянием сигнала оконечной точки, в то время как процесс 2 прошел этот момент уже и в настоящее время начинает параллельный ввод-вывод. Процесс 1 бы выход, что приводит к тупиковой ситуации в процессе 2 (ожидание процесса 1 для ввода-вывода, которые возбужденный) ...

Идеи 2:
только главного процесс 0 ловит сигнал в сигнале обработчик, а затем отправляет широковещательное сообщение: «весь процесс выхода!» в определенной точке приложения. Все процессы получают широковещательную передачу, а также исключение, которое выловлено в main и вызывается MPI_FINALIZE.

  • Таким образом, выход происходит благополучно, но за счет того, чтобы получить непрерывно широковещательные сообщения, чтобы увидеть, если мы должны выйти или не

Спасибо большое!

ответ

1

Если ваша цель - остановить все процессы в одной и той же точке, тогда нет возможности всегда синхронизировать в возможных точках завершения. То есть требуется коллективный вызов в точках окончания.

Конечно, вы можете попытаться избежать дополнительной трансляции, используя синхронизацию другого коллективного вызова, чтобы обеспечить правильное завершение или копировать информацию о завершении в существующую трансляцию, но я не думаю, что это того стоит. В конце концов, вам нужно синхронизировать только до ввода-вывода и не реже одного раза в десять минут. На такой частоте даже широковещательная передача не является проблемой производительности.

0

Использование сигналов в приложении MPI в целом небезопасно.Некоторые реализации могут поддерживать его, а другие - нет.

Например, в MPICH SIGUSR1 используется диспетчером процессов для внутреннего уведомления об аномальных отказах.

http://lists.mpich.org/pipermail/discuss/2014-October/003242.html

Open MPI на другой имел перешлем SIGUSR1 и SIGUSR2 от mpiexec к другим процессам.

http://www.open-mpi.org/doc/v1.6/man1/mpirun.1.php#sect14

Другие реализации будут отличаться. Поэтому, прежде чем идти слишком далеко по этому маршруту, убедитесь, что реализация, которую вы используете, может справиться с этим.

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