Обработка сигналов в приложении MPI / Изящный выход

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

  • Завершите все параллельные / последовательные операции ввода-вывода, прежде чем выйти из приложения!
  • При любых других обстоятельствах приложение может выйти без проблем.

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

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

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

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

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

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

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

2

Решение

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

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

1

Другие решения

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

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

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

Открытый MPI с другой стороны будет вперед SIGUSR1 а также SIGUSR2 от mpiexec к другим процессам.

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

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

1

По вопросам рекламы [email protected]