【问题标题】:What is the reliable way to return error code from an MPI program?从 MPI 程序返回错误代码的可靠方法是什么?
【发布时间】:2011-01-29 10:33:04
【问题描述】:

MPI standard(第 295 页)说:

给用户的建议。错误代码是从可执行文件返回还是从 MPI 进程启动机制(例如,mpiexec),是 MPI 质量的一个方面 图书馆,但不是强制性的。

确实,我没有成功运行以下代码:

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);
}

我无法将错误代码返回到 shell 中,以便对进一步的操作做出决定。两个错误消息都不会打印。我想我可能会将错误代码和消息写入专用文件。

有没有人遇到过类似的问题?您考虑过哪些选项可以进行可靠的错误报告?

编辑:
该问题不是由 MPI 引起的。真正错误的是我处理调度程序返回的错误代码的方式。我使用安装了 LoadLeveler 的系统。首先我做

$ llsubmit my_job_file.sh

然后在作业完成后,我会收到包含作业状态的电子邮件,并返回错误代码。在我的情况下,即使我的 MPI 程序已使用 MPI_Abort 函数退出,错误代码也始终为零。然后我意识到返回的错误代码是脚本 my_job_file.sh 本身的错误代码,而不是在脚本中运行的 MPI 程序。 my_job_file.sh 看起来像这样:

# @ different LoadLeveler options ...
poe ./my_mpi_program > my_mpi_program.output

然后我修改为

# @ different LoadLeveler options ...
poe ./my_mpi_program > my_mpi_program.output
exit $?

然后我终于得到了我想要的错误代码。

【问题讨论】:

  • exit 不起作用我并不感到惊讶,但MPI_Abort() 应该。您究竟是如何尝试使用 MPI_Abort() 的?
  • 您使用的是哪种 MPI 实现?

标签: mpi


【解决方案1】:

MPI_Abort 应该可以工作。

 int MPI_Abort( MPI_Comm comm, int errorcode )

【讨论】:

  • 一般来说 MPI_Abort 是一个合理的建议。但是,不应从信号处理程序中调用它。产生的行为是未定义的,并且在大多数情况下会挂起。
  • OP 询问是否返回错误代码(而不是更一般的“返回代码”),所以我觉得值得一提。
猜你喜欢
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 2019-03-24
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多