Qual é a maneira confiável de retornar o código de erro de um programa MPI?
-
21-09-2019 - |
Pergunta
o MPI Standard (página 295) diz:
Conselhos para os usuários. Se o código de erro é retornado do executável ou do mecanismo de inicialização do processo MPI (por exemplo, MPIEXEC), é um aspecto da qualidade da biblioteca MPI, mas não obrigatório.
Na verdade, eu não tive sucesso em executar o seguinte código:
if(0 == my_rank)
{
FILE* parameters = fopen("parameters.txt", "r");
if(NULL == parameters)
{
fprintf(stderr, "Could not open parameters.txt file.\n");
printf("Could not open parameters.txt file.\n");
exit(EXIT_FAILURE); //Tried MPI_Abort() as well
}
fscanf(parameters, "%i %f %f %f", N, X_DIMENSION_Dp, Y_DIMENSION_Dp, HEIGHT_DIMENSION_Dp);
fclose(parameters);
}
Não consigo colocar o código de erro de volta ao shell para tomar uma decisão sobre ações adicionais. Nenhuma das duas mensagens de erro é impressa. Acho que posso escrever os códigos de erro e mensagens em um arquivo dedicado.
Alguém já teve um problema semelhante e quais foram as opções que você considerou fazer um relatório de erro confiável?
EDITAR:
O problema não foi causado pelo MPI. O que realmente estava errado é a maneira como eu tratei os códigos de erro que o agendador retornou. Eu uso o sistema com o carregamento de carregamento instalado. Primeiro eu faço
$ llsubmit my_job_file.sh
Então, após a conclusão do trabalho, recebo o email com o status do trabalho e o código de erro de retorno. No meu caso, o código de erro sempre foi zero, mesmo que minha programação MPI tenha saído usando a função MPI_ABORT. Então percebi que o código de erro retornado era o do próprio script my_job_file.sh, mas não o programa MPI que é executado dentro do script. my_job_file.sh parecia assim:
# @ different LoadLeveler options ...
poe ./my_mpi_program > my_mpi_program.output
Então eu modifiquei para ser
# @ different LoadLeveler options ...
poe ./my_mpi_program > my_mpi_program.output
exit $?
E então eu finalmente obtive o código de erro que eu queria.
Solução
Mpi_abort deve funcionar.
int MPI_Abort( MPI_Comm comm, int errorcode )