回 帖 发 新 帖 刷新版面

主题:困惑多日!MPI_Barrier(MPI_COMM_WORLD) failed!

程序运行的时候出现这个错误!希望大神指点!

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

沙发

会不会是有个别进程走其他分支而不需要经过你设置的阻塞, 导致不能所有进程都到达阻塞而报错?

板凳

但是我写了带MPI的测试代码,发现运行正常。就是做计算的时候出错!

3 楼

那应该怎样解决?

我在代码里写了些输出,来检测程序运行到哪里,我发现程序是在这里出错的:
      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 楼

楼主, 你怎么保证每个进程都进入 if(i6dof.ne.-1.and.m6dof.ne.0) then 呢?
如果每个进程都必定进入它里面的代码, 那这个条件就是多余的了. 不知道我理解得对不对?

5 楼

您说的对,其实这个判断条件可以放在if (myid==0)之后

6 楼

您好!非常感谢您的回答!
1,您说的,有可能某些进程不走设置的阻塞应该怎么检测?写几句输出来看看可以的吧?
2,所谓设置的阻塞,具体含义是?

7 楼

我的理解, 阻塞就是进程或者线程同步一下, 等所有进程或者线程都到达了这个预设的位置再一起往下走. 所以如果有进程或者线程无法到达阻塞位置程序就可能出问题. 以前主要是靠经验判断, 并行的调试比较麻烦, 现在有什么工具我还真不清楚. 写输出我觉得是挺好的办法, 看看那个进程漏掉了, 给你判断提供灵感. (偷偷说, MPI很久没摸了, 甚至OPENMP也很少用.)

8 楼


谢谢您的回复!
您看我3楼的信息。
我现在调用程序前几个进程执行到这里了,但是调用完程序B之后,再call MPI_BARRIER有两个进程就没能正常输出~~
我再研究研究MPI~~

(偷摸的)刚开始琢磨MPI~~~

我来回复

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