2010-09-21 13 views
11

Estas son algunas preguntas generales que estoy enfrentando al diseñar el manejo de un algoritmo de error que se supone que debe funcionar en paralelo usando MPI (en C++):¿Puedo arrojar una excepción dentro del código paralelizado MPI?

  • No Excepciones el trabajo dentro de código que se ejecuta en paralelo? ¿El comportamiento está definido?
  • ¿Cómo funcionan? ¿Eso difiere para diferentes implementaciones?
  • ¿Es una buena práctica, o debería usar códigos de retorno?

Respuesta

6

Las excepciones funcionan igual en un código MPI que con un código de serie, pero debe tener mucho cuidado si es posible porque la excepción no se produce en todos los procesos en un comunicador o puede terminar fácilmente en un punto muerto.

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 */ 

Todos los métodos de tratamiento de errores tienen este problema, es difícil recuperarse de errores que no se producen constantemente a través de un comunicador. En el caso anterior, puede realizar un MPI_Allreduce para que todos los rangos elijan la misma rama.

Mi preferencia es llamar a los manejadores de errores y propagarlos desde la pila, ya que esto me da el mensaje de error más útil/detallado y es fácil de atrapar con un punto de interrupción (o el manejador de errores puede adjuntar un depurador y enviarlo a su estación de trabajo en un xterm).

0

El hecho de que las excepciones funcionen o no durante la ejecución en paralelo depende del compilador y de la implementación de la biblioteca MPI. Si quieres un comportamiento portátil, evitaría lanzar excepciones en ese contexto.

Si desea obtener información más detallada acerca de los errores que un código de retorno numérico, puede devolver y/o pasar cadenas de error u otros objetos (dentro del mismo proceso o a través de MPI, por supuesto).

7

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.

Cuestiones relacionadas