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下根本不是事。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值