Hello,

I followed a simple MPI example to do a ring communication.

Here's the figure that illustrates this example with 7 processes :

http://i.imgur.com/Wrd6acv.png

Here the code :

--------------------------------------------------------------------------------------------------------------------------
 program ring

 implicit none
 include 'mpif.h'

 integer, dimension( MPI_STATUS_SIZE ) :: status
 integer, parameter                    :: tag=100
 integer :: nb_procs, rank, value, &
            num_proc_previous,num_proc_next,code

 call MPI_INIT (code)
 call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code)
 call MPI_COMM_RANK ( MPI_COMM_WORLD ,rank,code)

 num_proc_next=mod(rank+1,nb_procs)
 num_proc_previous=mod(nb_procs+rank-1,nb_procs)

 if (rank == 0) then
    call MPI_SEND (1000,1, MPI_INTEGER ,num_proc_next,tag, &
                   MPI_COMM_WORLD ,code)
    call MPI_RECV (value,1, MPI_INTEGER ,num_proc_previous,tag, &
                   MPI_COMM_WORLD ,status,code)
 else
    call MPI_RECV (value,1, MPI_INTEGER ,num_proc_previous,tag, &
                   MPI_COMM_WORLD ,status,code)
    call MPI_SEND (rank+1000,1, MPI_INTEGER ,num_proc_next,tag, &
                   MPI_COMM_WORLD ,code)
 end if
 print *,'Me, process ',rank,', I have received ',value,' from process
',num_proc_previous

 call MPI_FINALIZE (code)
end program ring

--------------------------------------------------------------------------------------------------------------------------

At the execution, I expect to always have :

Me, process            1 , I have received         1000  from
process            0
 Me, process            2 , I have received         1001  from
process            1
 Me, process            3 , I have received         1002  from
process            2
 Me, process            4 , I have received         1003  from
process            3
 Me, process            5 , I have received         1004  from
process            4
 Me, process            6 , I have received         1005  from
process            5
 Me, process            0 , I have received         1006  from
process            6

But sometimes, I have the reception of process 0 from process 6 which is
not the last reception, like this :

 Me, process            1 , I have received         1000  from
process            0
 Me, process            2 , I have received         1001  from
process            1
 Me, process            3 , I have received         1002  from
process            2
 Me, process            4 , I have received         1003  from
process            3
 Me, process            5 , I have received         1004  from
process            4
 Me, process            0 , I have received         1006  from
process            6
 Me, process            6 , I have received         1005  from
process            5

where reception of process 0 from process 6 happens before the reception of
process 6 from process 5

or like on this result :

 Me, process            1 , I have received         1000  from
process            0
 Me, process            2 , I have received         1001  from
process            1
 Me, process            3 , I have received         1002  from
process            2
 Me, process            4 , I have received         1003  from
process            3
 Me, process            0 , I have received         1006  from
process            6
 Me, process            5 , I have received         1004  from
process            4
 Me, process            6 , I have received         1005  from
process            5

where process 0 receives between the reception of process 4 and 5.

How can we explain this strange result ? I thought that standard use of
MPI_SEND and MPI_RECV were blocking by default and,
with this result, it seems to be not blocking.

I tested this example on Debian 7.0 with open-mpi package.

Thanks for your help

Reply via email to