主题:MPI 错误
			 bshine1225
				 [专家分:720]  发布于 2011-09-03 14:33:00
 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
yeg001 [专家分:14390]  发布于 2011-09-04 00:35:00				
				6个小时内就一次信息收发? mpi调试比较麻烦, 要不先降低运算的量吧.
							 
						
				板凳
				
					 bshine1225 [专家分:720]  发布于 2011-09-04 17:46:00
bshine1225 [专家分:720]  发布于 2011-09-04 17:46:00				
				[quote]6个小时内就一次信息收发? mpi调试比较麻烦, 要不先降低运算的量吧.[/quote]
不是的,每步都要调用收发好多次,一秒钟能计算3步左右。
							 
						
				3 楼
				
					 cgl_lgs [专家分:21040]  发布于 2011-09-04 23:44:00
cgl_lgs [专家分:21040]  发布于 2011-09-04 23:44:00				
				你先整明白是什么错误,这错误提示显示的是MPI_Send的其他错误。。。错误代号为69。。。
你可以先到官网下载最新版本试试,也可以去问问错误代号69是神马东东~~~~
							 
						
				4 楼
				
					 yeg001 [专家分:14390]  发布于 2011-09-05 22:55:00
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
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
yeg001 [专家分:14390]  发布于 2011-09-06 16:55:00				
				我当时学的是一本mpif77的, 清华的一本旧书, 不记得缓冲区的大小是否自动调整还是有限制. 但既然每一步都同步了, 那缓冲的都应该传输出去了啊.
用非阻塞通信网络不稳定的时候信息有可能在缓冲区积压. 对于网络不稳定的问题,我也试过某个节点通信出问题最终导致整个程序崩溃的情况. 所以要不像3楼cgl_lgs说的先查查这个错误是什么意思?
							 
						
				7 楼
				
					 bshine1225 [专家分:720]  发布于 2011-09-14 16:01:00
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
cgl_lgs [专家分:21040]  发布于 2011-09-14 16:49:00				
				恭喜楼主:)不仅解决了问题,也给后来人留下了一个很有价值的帖子啊:)
							 
						
				9 楼
				
					 yeg001 [专家分:14390]  发布于 2011-09-16 13:00:00
yeg001 [专家分:14390]  发布于 2011-09-16 13:00:00				
				楼主解决了问题还贴出解决办法, 很值得赞赏.
mpi通过网络同步的代价相对比较大, 所以mpi提供了很多 阻塞/非阻塞 的通信函数, 但用哪个和怎么用,  个人觉得最揪心.
							 
									
			
我来回复