Perl: Как добавить обработчик прерываний, чтобы можно было управлять кодом, выполняемым mpirun через system ()? - PullRequest
0 голосов
/ 06 сентября 2010

Мы используем кластер с Perceus (warewulf) для выполнения некоторых вычислений. В этом программном пакете имеется программа wwmpirun (Perl-скрипт) для подготовки файла хоста и выполнения mpirun:

# ...
system("$mpirun -hostfile $tmp_hostfile -np $mpirun_np @ARGV");
# ...

Мы используем этот скрипт для запуска математической программы (CODE) на нескольких узлах, и обычно предполагается, что CODE останавливается с помощью Ctrl + C, давая короткое меню с параметрами: status, stop и halt. Однако при работе с MPI нажатие Ctrl + C сильно убивает CODE с потерей данных.

Разработчики CODE предлагают обходной путь - программу можно остановить, создав файл с именем stop%s, где %s - имя файла задачи, выполняемого CODE. Это позволяет остановиться, но мы не можем получить статус расчета. Иногда это занимает очень много времени, и возвращение этой функции было бы очень полезно.

Как вы думаете - проблема в КОДЕ или mpirun?

Можно ли найти способ связи с КОДОМ, выполняемым mpirun?

Update1

В одиночном цикле можно получить статус расчета, нажав Ctrl + C и выбрав опцию status в предоставленном меню, введя s. CODE печатает информацию о состоянии в STDOUT и продолжает выполнять вычисления.

1 Ответ

1 голос
/ 07 сентября 2010
  1. «мы не можем получить статус расчета» - что это значит?Вы ожидаете получить статус как-нибудь, но не получите?или программное обеспечение не предназначено для предоставления вам статуса?

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

    Кроме того, вы не обрабатываете код возврата, оценивая возвращаемое значение вызова system - это может бытьДругой способ взаимодействия программыобработчик.Решением может быть добавление обработчика прерываний к mpirun - см. Рецепт Perl Cookbook 16.18 для $SIG{INT} или http://www.wellho.net/resources/ex.php4?item=p216/sigint;вы можете захотеть, чтобы Perl-оболочка перехватила Ctrl+C и отправила сигнал INT на запущенный код.

...