Как можно обрабатывать сигналы в безопасном и MPI-приложении (например, SIGUSR1, который должен сообщить приложению, что время его выполнения истекло и должно завершиться в течение следующих 10 минут)
У меня есть несколько ограничений:
Как это может быть достигнуто безопасно, без тупиков при попытке выйти и правильно оставить текущий контекст, возвращаясь к main()
и звонит MPI_FINALIZE()
?
Каким-то образом процессы должны согласовываться при выходе (я думаю, что это то же самое в многопоточных приложениях), но как это сделать эффективно, не связываясь со многими? Кто-нибудь знает какой-то стандартный способ сделать это правильно?
Ниже приведены некоторые мысли, которые могут или не могут работать:
Идея 1:
Допустим, для каждого процесса мы ловим сигнал в обработчике сигналов и помещаем его в «стек необработанных сигналов» (USS), и мы просто возвращаемся из процедуры обработчика сигналов. Затем в нашем приложении есть определенные точки завершения, особенно до и после операций ввода-вывода, которые затем обрабатывают все сигналы в USS.
Например, если в USS есть SIGUSR1, то каждый процесс завершается в точке завершения.
Идея 2:
Только главный процесс 0 улавливает сигнал в обработчике сигналов и затем отправляет широковещательное сообщение: «весь процесс завершен!» в конкретный момент в приложении. Все процессы получают широковещательную рассылку и бросок и исключение, которое отлавливается main
а также MPI_FINALIZE
называется.
Большое спасибо!
Если ваша цель состоит в том, чтобы остановить все процессы в одной и той же точке, то нет никакой возможности постоянно синхронизировать в возможных точках завершения. То есть требуется коллективный вызов в точках завершения.
Конечно, вы можете попытаться избежать дополнительной трансляции, используя синхронизацию другого коллективного вызова, чтобы обеспечить надлежащее завершение, или скопировать информацию о завершении в существующей трансляции, но я не думаю, что это того стоит. В конце концов, вам нужно только синхронизировать данные перед вводом / выводом и хотя бы раз в десять минут. На такой частоте даже трансляция не является проблемой производительности.
Использование сигналов в вашем приложении 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
Другие реализации будут отличаться. Поэтому, прежде чем идти слишком далеко по этому пути, убедитесь, что используемая реализация справится с ним.