我正在使用MPI开展学校项目。我使用MPICH2并在Fortran中编写代码。我在学校的服务器上运行我的代码,有多个计算插槽。每个插槽由几个计算核心组成。我尝试使用并行计算来加速我的代码。我将子作业分配给每个核心并使用MPI_Gather收集值。有些核心永远不会返回值,似乎它们被困在一些无限循环中。有些内核从不调用第一个MPI_Barrier。 但是子作业中没有无限循环。我也做系列代码,效果很好。我把我的代码放在附件中。
call MPI_COMM_RANK(MP_LIBRARY_WORLD, rank, ierr)
call MPI_COMM_SIZE(MP_LIBRARY_WORLD, numtasks, ierr)
loop_min=int(rank*ceiling(float(point_num)/float(numtasks)))+1
loop_max=int((rank+1)*ceiling(float(point_num)/float(numtasks)))
do ind=loop_min,loop_max,1
if (ind>point_num) then
exit
end if
current_wealth_dist=total_grid(:,ind)
if (current_wealth_dist(1)==0.) then
call X_init_aiyagarizero(sendbuf(2:))
else
call X_init_aiyagari(sendbuf(2:))
end if
sendbuf(1)=ind
call MPI_GATHER(sendbuf,number_plc_function+1,MPI_REAL,recvbuf,number_plc_function+1,MPI_REAL,0,MP_LIBRARY_WORLD,ierr)
!print *, "Point", ind, "Finished"
end do
print *,rank, "work finished"
call MPI_BARRIER(MP_LIBRARY_WORLD,ierr)
print *, "After the First Barrier"
call MPI_Bcast(recvbuf,(number_plc_function+1)*point_num,MPI_REAL,0,MP_LIBRARY_WORLD,ierr)
print *, rank, "Finish Broadcast"
call MPI_BARRIER(MP_LIBRARY_WORLD,ierr)
do iter=1,point_num
do jter=1,4
init_policy_functions(int(recvbuf(1,iter)),:,jter)=recvbuf(2:,iter)
end do
end do