En un mundo ideal, puede usarlos para hacer lo que le pida. Por "mundo ideal" me refiero a uno en el que tiene la opción de implementación MPI elegida y puede administrarlo usted mismo (en lugar de convencer al propietario del clúster para que lo reconfigure). La configuración mínima para las excepciones incluirá: --con excepción, y posiblemente algunas más.
He usado LAM con más frecuencia y, de forma predeterminada, las excepciones están deshabilitadas. Creo que este es el valor predeterminado para otras implementaciones también.
Funcionan en la misma línea que las excepciones "vainas" de C++. Y funcionan dentro de código ejecutado en paralelo.
En algún momento de su código de inicio, usted quiere que les permitan:
MPI::COMM_WORLD.Set_errhandler (MPI::ERRORS_THROW_EXCEPTIONS);
(si la biblioteca no está configurado para permitir excepciones, esto es probablemente una mala idea - el comportamiento "indefinido" de acuerdo a LAM)
Y luego:
try { /* something that can fail */ }
catch (MPI::Exception e) {
cout << "Oops: " << e.Get_error_string() << e.Get_error_code();
MPI::COMM_WORLD.Abort (-1) ;
}
en cuanto a que sea buena o mala práctica, no puedo decir realmente. No he visto un uso extensivo de ellos en el código escrito por hackers MPI endurecidos, pero eso puede deberse a que el código es generalmente más C que C++ en mi experiencia.
Un punto medio entre los códigos de error y las excepciones puede ser el manejo de errores, en pocas palabras, puede asignar funciones que se invocarán cuando se produzca un error en particular (designado por el código). Esta podría ser una opción si no puede conseguir que su administrador participe con excepciones habilitadoras.