The explanation is simple: there is no rule about ordering of stdout. So even though your rank0 may receive its MPI message last, its stdout may well be printed before one generated on a remote node. Reason is that rank 0 may well be local to mpirun, and thus the stdout can be handled immediately. However, your rank6 may well be on a remote node, and that daemon has to forward the stdout to mpirun for printing.
Like I said - no guarantee about ordering of stdout. On Mar 15, 2014, at 2:43 PM, christophe petit <christophe.peti...@gmail.com> wrote: > 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 > > > _______________________________________________ > users mailing list > us...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/users