微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么MPI不会优雅地完成?

每当我试图完成我的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“double free or corruption”错误。 每个进程都是单线程的,每个进程肯定调用MPI_Finalize()。 任何想法在这里可能会出错?

如何使一个线程在Linux等待另一个

交叉编译helloworld.c到ARM(Cortex-A5)

什么时候在Linux内核中使用内核线程vs工作队列

64位Linux上的Java线程堆栈大小

^ 不匹配sed中的点

我写了一个小测试程序,应该退出没有任何错误。 请尝试运行它。 如果它正常退出,那么问题出在你的代码上。

#include <mpi.h> #include <cstdio> int main(int argc,char *argv[]) { MPI_Init(&argc,&argv); int my_rank; MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); int finalize_retcode = MPI_Finalize(); if(0 == my_rank) fprintf(stderr,"Process,return_coden"); fprintf(stderr,"%i,%in",my_rank,finalize_retcode); return 0; }

我遇到了类似的问题。

MPI_Request* req = (MPI_Request*) malloc(sizeof(MPI_Request)*2*numThings*numItems); int count; for( item in items ) { count = 0; for( thing in things ) { MPI_Irecv(<sendBufF>,1,MPI_INT,<src>,<tag>,MPI_COMM_WORLD,&req[count++]); MPI_Isend(<recvBufF>,<dest>,&req[count++]); } } MPI_Status* stat = (MPI_Status*) malloc(sizeof(MPI_Status)*2*numThings*numItems); MPI_Waitall(count,req,stat);

MPI_Waitall(...)调用的count小于Isend和recv的执行次数; 这导致消息不被接收。 在for循环之外移动count=0解决了MPI_Finalize(...)错误

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐