Я выполняю вычисления на платформе Amazon EC3, используя несколько машин, подключенных через OpenMPI. Для снижения стоимости вычислений используются спотовые инстансы, которые автоматически отключаются, когда стоимость машины превышает установленную максимальную цену: : http://aws.amazon.com/ec2/spot-instances/ . Возникает странное поведение: когда машина выключается, другие процессы в коммуникаторе MPI продолжают работать. Я думаю, что сетевые интерфейсы замолкают до того, как процесс успеет указать другим процессам, что он получил сигнал уничтожения.
Я читал в нескольких сообщениях, что MPI не предоставляет много высокоуровневых ресурсов, касающихся отказоустойчивости. С другой стороны, структура моей программы очень проста: подчиненные процессы запрашивают у главного процесса разрешение на выполнение части кода. Главный процесс отслеживает только количество запросов, на которые он ответил, и приказывает подчиненному останавливаться при достижении верхнего предела. Между рабами нет связи.
Я хотел бы иметь возможность определить, когда процесс молча умер, как упоминалось ранее. В таком случае я бы приписал работу, которую он выполнял, еще живому рабу. Есть ли простой способ проверить, умер ли a? Я думал об использовании потоков и сокетов, чтобы сделать это независимо от остальной части уровня MPI, но это кажется громоздким. Я также хотел бы сохранить в главном процессе (который запускается не на месте) список времени последней связи с каждым процессом и указать тайм-аут, но это не гарантирует мне, что подчиненный процесс мертв. Также есть проблема, что функции "барьер" и "финализация" не увидят все процессы и потенциально зависнут.
Тогда мой вопрос будет заключаться в том, какое решение вы бы применили для обнаружения того, что процессы молча мертвы? И как бы вы изменили оставшуюся часть кода, чтобы она была совместима с уменьшенным числом процессов?