主题:MPI 错误
bshine1225
[专家分:720] 发布于 2011-09-03 14:33:00
我在linux上进行MPI计算时,每计算大概6个小时左右,程序就会报错:
Fatal error in MPI_Send: other MPI error
forrtl: error (69)
stack trace terminated abnormally
把终端关掉重新打开一个终端继续算又可以接着算大概6小时左右,又会报以上错误。
我在这个博客中看到有人说要先启动MPI_RECV,再启动MPI_SEND。但是我的每次通讯都已经完成了,不然就阻塞了,不会出现计算结果。既然通讯完成了这么会出现这种错误呢?求高手解答。
http://hi.baidu.com/melodywhan/blog/item/72471df60c1dfb2f720eeca6.html
回复列表 (共9个回复)
沙发
yeg001 [专家分:14390] 发布于 2011-09-04 00:35:00
6个小时内就一次信息收发? mpi调试比较麻烦, 要不先降低运算的量吧.
板凳
bshine1225 [专家分:720] 发布于 2011-09-04 17:46:00
[quote]6个小时内就一次信息收发? mpi调试比较麻烦, 要不先降低运算的量吧.[/quote]
不是的,每步都要调用收发好多次,一秒钟能计算3步左右。
3 楼
cgl_lgs [专家分:21040] 发布于 2011-09-04 23:44:00
你先整明白是什么错误,这错误提示显示的是MPI_Send的其他错误。。。错误代号为69。。。
你可以先到官网下载最新版本试试,也可以去问问错误代号69是神马东东~~~~
4 楼
yeg001 [专家分:14390] 发布于 2011-09-05 22:55:00
[quote][quote]6个小时内就一次信息收发? mpi调试比较麻烦, 要不先降低运算的量吧.[/quote]
不是的,每步都要调用收发好多次,一秒钟能计算3步左右。[/quote]
会不会缓冲塞满导致错误? 你使用的收发数据是带阻塞的吗? 要不在通信之后再barrier阻塞一下?
5 楼
bshine1225 [专家分:720] 发布于 2011-09-06 16:23:00
[quote][quote][quote]6个小时内就一次信息收发? mpi调试比较麻烦, 要不先降低运算的量吧.[/quote]
不是的,每步都要调用收发好多次,一秒钟能计算3步左右。[/quote]
会不会缓冲塞满导致错误? 你使用的收发数据是带阻塞的吗? 要不在通信之后再barrier阻塞一下?[/quote]
我每步计算中都调用了BARRIER来同步。另外缓冲区有大小限制吗?
6 楼
yeg001 [专家分:14390] 发布于 2011-09-06 16:55:00
我当时学的是一本mpif77的, 清华的一本旧书, 不记得缓冲区的大小是否自动调整还是有限制. 但既然每一步都同步了, 那缓冲的都应该传输出去了啊.
用非阻塞通信网络不稳定的时候信息有可能在缓冲区积压. 对于网络不稳定的问题,我也试过某个节点通信出问题最终导致整个程序崩溃的情况. 所以要不像3楼cgl_lgs说的先查查这个错误是什么意思?
7 楼
bshine1225 [专家分:720] 发布于 2011-09-14 16:01:00
找到错误了。是对MPI理解不透造成的。
我用了这样的结构
MPI_IRECV(..., Request,IERR )
MPI_IRECV(..., Request,IERR )
MPI_SEND( ..., STATUS,IERR)
MPI_SEND( ..., STATUS,IERR)
MPI_WAIT( Request, STATUS,IERR)
即调用了两次MPI_IRECV,却只用了一次MPI_WAIT。第一次调用生成的Request只被第二次覆盖了,第一次的数据接收实际上没有完成,造成了第一次的MPI_SEND的长时间等待,最后报错。
改成MPI_WATIALL(Request, STATUS,IERR)或者 采用MPI_SENDRECV就没有问题了。
8 楼
cgl_lgs [专家分:21040] 发布于 2011-09-14 16:49:00
恭喜楼主:)不仅解决了问题,也给后来人留下了一个很有价值的帖子啊:)
9 楼
yeg001 [专家分:14390] 发布于 2011-09-16 13:00:00
楼主解决了问题还贴出解决办法, 很值得赞赏.
mpi通过网络同步的代价相对比较大, 所以mpi提供了很多 阻塞/非阻塞 的通信函数, 但用哪个和怎么用, 个人觉得最揪心.
我来回复