回 帖 发 新 帖 刷新版面

主题:MPI 错误

我在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个回复)

沙发

6个小时内就一次信息收发? mpi调试比较麻烦, 要不先降低运算的量吧.

板凳

[quote]6个小时内就一次信息收发? mpi调试比较麻烦, 要不先降低运算的量吧.[/quote]
不是的,每步都要调用收发好多次,一秒钟能计算3步左右。

3 楼

你先整明白是什么错误,这错误提示显示的是MPI_Send的其他错误。。。错误代号为69。。。
你可以先到官网下载最新版本试试,也可以去问问错误代号69是神马东东~~~~

4 楼

[quote][quote]6个小时内就一次信息收发? mpi调试比较麻烦, 要不先降低运算的量吧.[/quote]
不是的,每步都要调用收发好多次,一秒钟能计算3步左右。[/quote]
会不会缓冲塞满导致错误? 你使用的收发数据是带阻塞的吗? 要不在通信之后再barrier阻塞一下?

5 楼

[quote][quote][quote]6个小时内就一次信息收发? mpi调试比较麻烦, 要不先降低运算的量吧.[/quote]
不是的,每步都要调用收发好多次,一秒钟能计算3步左右。[/quote]
会不会缓冲塞满导致错误? 你使用的收发数据是带阻塞的吗? 要不在通信之后再barrier阻塞一下?[/quote]
我每步计算中都调用了BARRIER来同步。另外缓冲区有大小限制吗?

6 楼

我当时学的是一本mpif77的, 清华的一本旧书, 不记得缓冲区的大小是否自动调整还是有限制. 但既然每一步都同步了, 那缓冲的都应该传输出去了啊.
用非阻塞通信网络不稳定的时候信息有可能在缓冲区积压. 对于网络不稳定的问题,我也试过某个节点通信出问题最终导致整个程序崩溃的情况. 所以要不像3楼cgl_lgs说的先查查这个错误是什么意思?

7 楼

找到错误了。是对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 楼

恭喜楼主:)不仅解决了问题,也给后来人留下了一个很有价值的帖子啊:)

9 楼

楼主解决了问题还贴出解决办法, 很值得赞赏.
mpi通过网络同步的代价相对比较大, 所以mpi提供了很多 阻塞/非阻塞 的通信函数, 但用哪个和怎么用,  个人觉得最揪心.

我来回复

您尚未登录,请登录后再回复。点此登录或注册