Fatal error in MPI_Gather: Other MPI error,的一个解决方法

Fatal error in MPI_Gather: Other MPI error, error stack:
MPI_Gather(761)...................: MPI_Gather(sbuf=0x7fffe81491f0, scount=8192, MPI_DOUBLE, rbuf=0x2ba3422b1010, rcount=8192, MPI_DOUBLE, root=0, MPI_COMM_WORLD) failed
MPIR_Gather(276)..................: 
MPIC_Send(41).....................: 
MPIC_Wait(513)....................: 
MPIDI_CH3I_Progress(150)..........: 
MPID_nem_mpich2_blocking_recv(948): 
MPID_nem_tcp_connpoll(1720).......: 
state_commrdy_handler(1556).......: 
MPID_nem_tcp_recv_handler(1446)...: socket closed

网上一搜,很多这个错误。而且每个都是在大规模和大数据的情况下出现的。我也遇到了,经过一个礼拜的艰苦搏斗,得出了结论。

在linux下对程序运行的堆栈大小都有限制。而且,貌似机群下 ulimit并不准确(centos)。通过在我的程序里调整数据存放位置,可以得出结论:

MPI_Comm类函数都是会在栈中申请一块内存(malloc),将数据复制到这块内存中,进行后续操作。这样可以保证数据安全,不用上锁。但当整个数据很大 的情况下,会出现内存申请不到的情况,这时intel的mpi会出现上述errlog。

解决的办法有二:1、使用bsend,手动申请内存;2、将堆中数据转移一部分到栈中。

 

后来发现,当申请使用的socket超过系统限制的时候也会出这个错。解决就只能是改算法了。ps.bcast 几m东西在infiniband下根本不是事。

你可能感兴趣的:(做并行)