Qual é a maneira confiável de retornar o código de erro de um programa MPI?

StackOverflow https://stackoverflow.com/questions/2477015

  •  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.

Foi útil?

Solução

Mpi_abort deve funcionar.

 int MPI_Abort( MPI_Comm comm, int errorcode )
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top