- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello everyone,
I hope this is the appropriate forum for this question. I have recently started learning MPI, and can't seem to figure out why the following codes generating deadlock which occurs is subroutine try_comm. I compiled and ran as follows
mpiifort global.f90 try.f90 new.f90 -o new.out
mpirun -n 2 ./new.out
my output:
hello from rank 0 2 entering 0 0 waiting for receive from rank 1 1 entering 1 0 after send finished 1 0
module global implicit none integer :: size,rank integer,allocatable :: p2n(:),n2p(:) end module global
module try use mpi use global implicit none contains subroutine try_comm(loop,n0) implicit none integer :: n0,loop integer :: ierr,msgtag integer :: n0temp integer :: status(MPI_STATUS_SIZE) call mpi_barrier(MPI_COMM_WORLD,ierr) print*,'entering',rank,loop if(rank.ne.0)then call mpi_send(n0,1,mpi_int,0,msgtag,MPI_COMM_WORLD,ierr) print*,'after send' endif if(rank.eq.0)then do loop = 1,size-1 print*,'waiting for receive from rank',loop,size-1 call mpi_recv(n0temp,1,mpi_int,loop,msgtag,MPI_COMM_WORLD,status,ierr) n0 = n0temp print*,'received 0:',n0 enddo endif print*,'finished',rank,loop call mpi_barrier(MPI_COMM_WORLD,ierr) end subroutine try_comm end module try
program new use mpi use global use try implicit none integer :: n0 integer :: ierr,msgtag integer :: loop integer :: n0temp integer :: status(MPI_STATUS_SIZE) call mpi_init(ierr) call mpi_comm_size(MPI_COMM_WORLD,size,ierr) call mpi_comm_rank(MPI_COMM_WORLD,rank,ierr) if(rank.eq.0)then print*,'hello from rank',rank,size allocate(p2n(0:size-1),n2p(0:size-1)) endif n0 = rank*10 do loop = 1,20 call try_comm(loop,n0) enddo call mpi_finalize(ierr) stop end program new
However, if I change new.f90 to the following where now the subroutine try_comm is included in the do loop as follows, I do not get deadlock.
program new use mpi use global use try implicit none integer :: n0 integer :: ierr,msgtag integer :: loop,loopa integer :: n0temp integer :: status(MPI_STATUS_SIZE) call mpi_init(ierr) call mpi_comm_size(MPI_COMM_WORLD,size,ierr) call mpi_comm_rank(MPI_COMM_WORLD,rank,ierr) if(rank.eq.0)then print*,'hello from rank',rank,size allocate(p2n(0:size-1),n2p(0:size-1)) endif n0 = rank*10 do loopa = 1,20 !call try_comm(loop,n0) call mpi_barrier(MPI_COMM_WORLD,ierr) print*,'entering',rank,loopa if(rank.ne.0)then call mpi_send(n0,1,mpi_int,0,msgtag,MPI_COMM_WORLD,ierr) print*,'after send' endif if(rank.eq.0)then do loop = 1,size-1 print*,'waiting for receive from rank',loop,size-1 call mpi_recv(n0temp,1,mpi_int,loop,msgtag,MPI_COMM_WORLD,status,ierr) n0 = n0temp print*,'received 0:',n0 enddo endif print*,'finished',rank,loopa call mpi_barrier(MPI_COMM_WORLD,ierr) enddo call mpi_finalize(ierr) stop end program new
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I see that you use an uninitialized value for msgtag . It is input for MPI_SEND and MPI_SEND.
Thus the actual value for msgtag is random, and might be different for the 2 code-variants. What happens if it is a NaN ?
So make sure that you do not use uninitialized values.
By the way, I would not use an variable named size , because size is also an intrinsic fct in Fortran.
Greetings Michael R.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
dear Conor,
I suggest to use only two CPU, one to send and one to receive. It is easier to catch the error.
Cheers,
Diego
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
thanks guys! that first response actually answered the question for me. For some reason my understanding after reading a couple MPI examples was that MPI handled msgtag behind the scenes, but evidently that is very,very wrong. thanks again.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page