这不是帮助我解决问题的问题,更与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在涉及集体通信时有时会增加不必要的同步。这个案子......
我期待着您的意见。