12.5. 应用输出因异常终止丢失
当应用程序异常终止时,可能导致输出丢失的原因有很多。Open MPI团队强烈建议尽可能使用调试工具(如调试器)。
然而,其中一个原因可能来自Open MPI内部。如果您的应用程序因内存损坏而失败,Open MPI可能随后无法在终止前输出错误消息。Open MPI尝试聚合来自多个进程的错误消息,旨在仅显示唯一的错误消息一次(而不是为每个MPI进程显示一次——这在运行大型MPI作业时尤其显得笨拙)。
然而,这种聚合过程在显示错误消息时需要MPI进程分配内存。如果进程的内存已经损坏,Open MPI尝试分配内存可能会失败,进程将直接终止(可能无任何提示)。当Open MPI不尝试聚合错误消息时,大部分初始化工作会在MPI库初始化阶段完成,且在"打印错误"例程中不会分配内存。因此几乎总能实时成功输出错误消息——但代价是您可能会在每个遇到该错误的MPI进程上看到相同的错误信息。
因此,错误消息聚合通常是件好事,但有时也可能掩盖真正的错误。您可以通过opal_base_help_aggregate MCA参数禁用Open MPI的错误消息聚合功能。例如:
shell$ mpirun --mca opal_base_help_aggregate 0 ...