有些核心永远不会使用MPI返回值

时间:2017-01-05 01:23:18

标签: mpi dynamic-programming hpc

我正在使用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

0 个答案:

没有答案