主题:困惑多日!MPI_Barrier(MPI_COMM_WORLD) failed!
nigel332
[专家分:40] 发布于 2013-01-23 11:39:00
程序运行的时候出现这个错误!希望大神指点!
Fatal error in PMPI_Barrier: Message truncated, error stack:
PMPI_Barrier(425)...................: MPI_Barrier(MPI_COMM_WORLD) failed
MPIR_Barrier_impl(306)..............:
MPIR_Bcast_impl(1321)...............:
MPIR_Bcast_intra(1155)..............:
MPIR_Bcast_binomial(145)............:
MPIC_Recv(101)......................:
MPIDI_CH3U_Request_unpack_uebuf(599): Message truncated; 8 bytes received but buffer size is 1
Fatal error in PMPI_Barrier: Message truncated, error stack:
PMPI_Barrier(425)...................: MPI_Barrier(MPI_COMM_WORLD) failed
MPIR_Barrier_impl(306)..............:
MPIR_Bcast_impl(1321)...............:
MPIR_Bcast_intra(1155)..............:
MPIR_Bcast_binomial(145)............:
MPIC_Recv(101)......................:
MPIDI_CH3U_Request_unpack_uebuf(599): Message truncated; 8 bytes received but buffer size is 1
MPI_Barrier(MPI_COMM_WORLD),只是进程同步而已,没有实质性操作,为什么会出错呢?!
回复列表 (共8个回复)
沙发
yeg001 [专家分:14390] 发布于 2013-01-23 13:09:00
会不会是有个别进程走其他分支而不需要经过你设置的阻塞, 导致不能所有进程都到达阻塞而报错?
板凳
nigel332 [专家分:40] 发布于 2013-01-24 07:38:00
但是我写了带MPI的测试代码,发现运行正常。就是做计算的时候出错!
3 楼
nigel332 [专家分:40] 发布于 2013-01-25 11:25:00
那应该怎样解决?
我在代码里写了些输出,来检测程序运行到哪里,我发现程序是在这里出错的:
if(i6dof.ne.-1.and.m6dof.ne.0) then
write (*,*) '4s,myid',myid
if(myid.eq.0) call start_ps
call MPI_BARRIER(MPI_COMM_WORLD,ierr) !程序就是在这里出错的!输出显示同步的
!时候,除主进程外都停滞了~~
write (*,*) '4b,myid',myid
end if
write (*,*) '4a,myid',myid
call get_chi_mp(1)
call MPI_BARRIER(MPI_COMM_WORLD,ierr)
这是程序的输出信息:
4s,myid 0
4s,myid 1
4s,myid 2
Fatal error in PMPI_Barrier: Message truncated, error stack:
PMPI_Barrier(425)...................: MPI_Barrier(MPI_COMM_WORLD) failed
MPIR_Barrier_impl(306)..............:
MPIR_Bcast_impl(1321)...............:
MPIR_Bcast_intra(1155)..............:
MPIR_Bcast_binomial(145)............:
MPIC_Recv(101)......................:
MPIDI_CH3U_Request_unpack_uebuf(599): Message truncated; 8 bytes received but buffer size is 1
4b,myid 0
4a,myid 0
Fatal error in PMPI_Barrier: Message truncated, error stack:
PMPI_Barrier(425)...................: MPI_Barrier(MPI_COMM_WORLD) failed
MPIR_Barrier_impl(306)..............:
MPIR_Bcast_impl(1321)...............:
MPIR_Bcast_intra(1155)..............:
MPIR_Bcast_binomial(145)............:
MPIC_Recv(101)......................:
MPIDI_CH3U_Request_unpack_uebuf(599): Message truncated; 8 bytes received but buffer size is 1
从输出来看的话,主进程调用完start_ps之后,还输出了 4b,4a。而其余进程却没有往下进行!
4 楼
yeg001 [专家分:14390] 发布于 2013-01-25 15:47:00
楼主, 你怎么保证每个进程都进入 if(i6dof.ne.-1.and.m6dof.ne.0) then 呢?
如果每个进程都必定进入它里面的代码, 那这个条件就是多余的了. 不知道我理解得对不对?
5 楼
nigel332 [专家分:40] 发布于 2013-01-28 00:22:00
您说的对,其实这个判断条件可以放在if (myid==0)之后
6 楼
nigel332 [专家分:40] 发布于 2013-01-28 00:29:00
您好!非常感谢您的回答!
1,您说的,有可能某些进程不走设置的阻塞应该怎么检测?写几句输出来看看可以的吧?
2,所谓设置的阻塞,具体含义是?
7 楼
yeg001 [专家分:14390] 发布于 2013-01-28 14:35:00
我的理解, 阻塞就是进程或者线程同步一下, 等所有进程或者线程都到达了这个预设的位置再一起往下走. 所以如果有进程或者线程无法到达阻塞位置程序就可能出问题. 以前主要是靠经验判断, 并行的调试比较麻烦, 现在有什么工具我还真不清楚. 写输出我觉得是挺好的办法, 看看那个进程漏掉了, 给你判断提供灵感. (偷偷说, MPI很久没摸了, 甚至OPENMP也很少用.)
8 楼
nigel332 [专家分:40] 发布于 2013-01-28 20:39:00
谢谢您的回复!
您看我3楼的信息。
我现在调用程序前几个进程执行到这里了,但是调用完程序B之后,再call MPI_BARRIER有两个进程就没能正常输出~~
我再研究研究MPI~~
(偷摸的)刚开始琢磨MPI~~~
我来回复