【发布时间】:2012-01-15 03:57:39
【问题描述】:
每当我尝试完成我的 mpi 程序时,都会收到类似于以下内容的错误。
[mpiexec] HYDT_dmxu_poll_wait_for_event (./tools/demux/demux_poll.c:70): assert (!(pollfds[i].revents & ~POLLIN & ~POLLOUT & ~POLLHUP)) failed
[mpiexec] main (./pm/pmiserv/pmip.c:221): demux engine error waiting for event
[mpiexec] HYDT_bscu_wait_for_completion (./tools/bootstrap/utils/bscu_wait.c:99): one of the processes terminated badly; aborting
[mpiexec] HYDT_bsci_wait_for_completion (./tools/bootstrap/src/bsci_wait.c:18): bootstrap device returned error waiting for completion
[mpiexec] HYD_pmci_wait_for_completion (./pm/pmiserv/pmiserv_pmci.c:352): bootstrap server returned error waiting for completion
[mpiexec] main (./ui/mpich/mpiexec.c:294): process manager error waiting for completion
有时,它会得到 glibc “双重释放或损坏”错误。每个进程都是单线程的,并且每个进程肯定会调用 MPI_Finalize()。知道这里可能出了什么问题吗?
【问题讨论】:
-
您确定每个进程都在调用 MPI_Finalize 吗?你能转储 MPI_Finalize 函数的返回码吗?就像 int ret_code = MPI_Finalize(); if(0 == my_rank) fprintf(stderr, "Process, return_code"); fprintf(stderr, "%i, %i", my_rank, ) 然后 1) 计算行数——应该等于 MPI 进程数,否则有些进程实际上并没有调用 MPI_Finalize; 2) 检查所有错误代码是否相似。
-
是的,我确定。问题是最后一个进程何时调用它。我转储错误代码并打印它们。所有进程都返回 0,除了等级为 0 的进程不返回任何内容。它只是在 finalize 时崩溃并显示此错误消息。我什至可以让第 0 个进程休眠 5 秒,然后看到其他进程也保持在 finalize 状态,但是一旦进程 0 调用 finalize,就会崩溃。
-
现在,我不确定发生了什么,因为当我试图找出错误(主要是通过在 finalize 周围添加一堆打印语句)时,它停止了它。现在我不能再复制错误了。