Могу ли я создать исключение внутри параллелизованного кода MPI? - PullRequest
11 голосов
/ 21 сентября 2010

Вот некоторые общие вопросы, с которыми я сталкиваюсь при разработке обработки ошибок для алгоритма, который должен работать параллельно с использованием MPI (в C ++):

  • Работают ли исключения внутри кода, который выполняетсяв параллели?Определено ли поведение?
  • Как они работают?Отличается ли это для разных реализаций?
  • Это хорошая практика - или я должен использовать коды возврата?

Ответы [ 3 ]

7 голосов
/ 27 сентября 2010

В идеальном мире вы можете использовать их, чтобы делать то, что вы просите. Под «идеальным миром» я подразумеваю тот, где у вас есть выбор реализации MPI и вы можете управлять им самостоятельно (вместо того, чтобы убедить владельца кластера перенастроить его для вас). Минимальная конфигурация для исключений будет включать: - с-исключениями флаг и, возможно, еще несколько.

Чаще всего я использовал LAM, и по умолчанию исключения отключены. Я считаю, что это по умолчанию и для других реализаций.

Они работают в том же духе, что и «ванильные» исключения C ++. И они работают внутри параллельно исполняемого кода.

В какой-то момент в вашем коде запуска вы хотите включить их:

MPI::COMM_WORLD.Set_errhandler ( MPI::ERRORS_THROW_EXCEPTIONS );

(если ваша библиотека не настроена на разрешение исключений, это, вероятно, плохая идея - поведение "неопределенное" согласно LAM)

А потом:

try { /* something that can fail */ } 
catch ( MPI::Exception e ) {

    cout << "Oops: " << e.Get_error_string() << e.Get_error_code();
    MPI::COMM_WORLD.Abort (-1) ;
}

Что касается хорошей или плохой практики, я не могу сказать точно. Я не видел их широкого применения в коде, написанном усиленными хакерами MPI, но это может быть потому, что в моем коде, как правило, больше C, чем C ++.

Срединной точкой между кодами ошибок и исключениями могут быть обработчики ошибок, в двух словах, вы можете назначать функции, которые будут вызываться при возникновении конкретной ошибки (обозначаемой кодом). Это может быть вариант, если вы не можете привлечь администратора к работе с включенными исключениями.

6 голосов
/ 28 сентября 2010

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

MPI_Barrier(comm);            /* Or any synchronous call */
if (!rank) throw Exception("early exit on rank=0");
MPI_Barrier(comm);            /* rank>0 deadlocks here because rank=0 exited early */

У всех методов обработки ошибок есть эта проблема, ее трудно исправить после ошибок, которые не происходят последовательно в коммуникаторе. В приведенном выше случае вы можете выполнить MPI_Allreduce, чтобы все ранги выбирали одну и ту же ветку.

Я предпочитаю вызывать обработчики ошибок и распространять их по стеку, поскольку это дает мне наиболее полезное / подробное сообщение об ошибке, и его легко поймать с точкой останова (или обработчик ошибок может присоединить отладчик к себе и отправить это на вашу рабочую станцию ​​в xterm).

0 голосов
/ 27 сентября 2010

Будут ли работать исключения во время параллельного выполнения, зависит от вашего компилятора и реализации библиотеки MPI. Если вы хотите переносимое поведение, я бы не стал генерировать исключения в этом контексте.

Если вам нужна более подробная информация об ошибках, чем просто числовой код возврата, вы, конечно, можете возвращать и / или передавать строки ошибок или другие объекты (в том же процессе или через MPI, конечно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...