В идеальном мире вы можете использовать их, чтобы делать то, что вы просите. Под «идеальным миром» я подразумеваю тот, где у вас есть выбор реализации 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 ++.
Срединной точкой между кодами ошибок и исключениями могут быть обработчики ошибок, в двух словах, вы можете назначать функции, которые будут вызываться при возникновении конкретной ошибки (обозначаемой кодом). Это может быть вариант, если вы не можете привлечь администратора к работе с включенными исключениями.