MPR_BARRIER在一个循环中运行速度比Fortran中预期的要快

时间:2017-07-28 21:02:47

标签: fortran mpi

这不是帮助我解决问题的问题,更与MPI实现有关,以及它如何与Fortran中的MPI_BARRIER一起使用。

我有一个do循环,它基本上将我的变量打印到输出文件。 do循环看起来像:

do j = 1, Jmax
  Call MPI_GATHERV(u_old(1,j),Imax,MPI_REAL8,u_oldGlobal(1,j),ImaxRecv,&
                   Displacement,MPI_REAL8,0,MPI_COMM_WORLD,ierr)
  Call MPI_GATHERV(v_old(1,j),Imax,MPI_REAL8,v_oldGlobal(1,j),ImaxRecv,&
                   Displacement,MPI_REAL8,0,MPI_COMM_WORLD,ierr)
  Call MPI_GATHERV(r_old(1,j),Imax,MPI_REAL8,r_oldGlobal(1,j),ImaxRecv,&
                   Displacement,MPI_REAL8,0,MPI_COMM_WORLD,ierr)
  Call MPI_GATHERV(T_old(1,j),Imax,MPI_REAL8,T_oldGlobal(1,j),ImaxRecv,&
                   Displacement,MPI_REAL8,0,MPI_COMM_WORLD,ierr)
end do

这个循环工作得很好,但对于大矩阵,MPI只是挂起。大我的意思是8001x8001和更大。

我想尝试在do循环结束时添加MPI_BARRIER,我希望花更多的时间,但事实证明情况正好相反。这是新版本。

do j = 1, Jmax
  Call MPI_GATHERV(u_old(1,j),Imax,MPI_REAL8,u_oldGlobal(1,j),ImaxRecv,&
                   Displacement,MPI_REAL8,0,MPI_COMM_WORLD,ierr)
  Call MPI_GATHERV(v_old(1,j),Imax,MPI_REAL8,v_oldGlobal(1,j),ImaxRecv,&
                   Displacement,MPI_REAL8,0,MPI_COMM_WORLD,ierr)
  Call MPI_GATHERV(r_old(1,j),Imax,MPI_REAL8,r_oldGlobal(1,j),ImaxRecv,&
                   Displacement,MPI_REAL8,0,MPI_COMM_WORLD,ierr)
  Call MPI_GATHERV(T_old(1,j),Imax,MPI_REAL8,T_oldGlobal(1,j),ImaxRecv,&
                   Displacement,MPI_REAL8,0,MPI_COMM_WORLD,ierr)
  Call MPI_BARRIER(MPI_COMM_WORLD,ierr)
end do

但就像我说的那样,这个过程比原来要快得多,现在MPI没有任何错误就结束了任务(在我遇到错误134之前)。

以下是问题。为什么这个表现?由于我们一直认为Barrier在涉及集体通信时有时会增加不必要的同步。这个案子......

我期待着您的意见。

0 个答案:

没有答案