Снефтель прав. Жиль Гуаиллардет тоже ОЧЕНЬ прав. Я хочу добавить другую информацию.
Даже если вы отправляете сигнал в реальную программу, а не в «mpirun», вы, возможно, отправляете его ОДНОМУ только из ваших процессов, а не всем.
Да, сигналы не являются правильной вещью в программах MPI. Но даже если вы хотите их использовать, вы должны сначала отладить все процессы, которые их получают, и кто из них их получает.
Вставьте «printf» непосредственно в обработчик сигнала. Напечатайте что-то вроде «Процесс MPI с номером% d получил сигнал» и вставьте MPI_COMM_RANK в этот printf. (UPD 2018-04-27 7:31 MSK: извините, я не заметил, что у вас уже есть такой printf
в Ваш код.) (Примечание: я думаю, что "printf" в программах MPI допускается только в первом процессе, и использование "printf" в других процессах, вероятно, плохая идея, но для целей отладки пойдет. Также я думаю, что "printf" напрямую из Обработчик сигналов - плохая идея, но, опять же, для целей отладки.)
Вы определите, получают ли ваши процессы сигнал и какой из них.
Если вы не удовлетворены результатами, попробуйте другие программы вместо gtimeout. Например, «тайм-аут» из GNU Coreutils. (Ну, это Mac, я не уверен, GNU Coreutils доступен с Mac, но я все еще думаю, что вы можете найти НЕКОТОРЫЕ «тайм-ауты».)
Тогда: вы не описали свою установку в вопросе. Ваши MPI-программы работают на разных хостах или на одном? Реализуются ли MPI-программы как отдельные программы или как потоки? Какую реализацию MPI вы используете и какую версию? Если вы не знаете, как MPI запускает ваши процессы, по крайней мере, сообщите нам, как вы установили реализацию MPI и как вы ее настроили.
Или даже вы можете обойтись без "timeout" или "gtimeout" вообще. Просто введите это в одной консоли:
sh -c 'echo $$ > ~/pid-of-mpirun; exec ~/opt/usr/local/bin/mpirun -np 2 ./a.out'
Это запустит "mpirun" при сохранении его PID в ~ / pid-of-mpirun. И запустить параллельно в другом терминале (конечно, вам не нужно запускать эту команду в один и тот же момент):
sleep 15; kill -USR1 $(cat ~/pid-of-mpirun)
Это потребует 15 секунд и отправит USR1 для обработки того, какой PID находится в ~ / pid-of-mpirun.
Но все это, вероятно, отправит USR1 в "mpirun", а не в реальные процессы (я не уверен, проверьте это!). Как отправить на актуальные процессы? Что ж, вы можете прочитать страницу руководства по "kill" и попытаться понять, как отправить сигнал всей группе процессов, а не только одному процессу.
Кроме того, вы можете записать свой PID в какой-то файл непосредственно внутри вашей программы на C.
Пример:
#include <stdio.h>
#include <unistd.h> // Mac is one of UNIX systems, so we have unistd.h
// ...
FILE *fout = fopen("~/my-pid", "w"); fprintf(fout, "%d\n", getpid); fclose(fout);
Конечно, вы должны каким-то образом убедиться, что вы создаете разные файлы в разных процессах. Например, сгенерируйте имена файлов из MPI_COMM_RANK.