On Mar 15, 2014, at 6:21 PM, christophe petit <christophe.peti...@gmail.com> 
wrote:

> Ok, so from what you say, on a "execution system" point view, the ring 
> communication is well achieved (i.e respecting the good order with, in last 
> position, rank0 which receives from rank 6) but the stdout doesn't reflect 
> what really happened, does it ?

Well, it reflects what you printed, but not the order in which things happened.

> 
> Is there a way to make stdout respect the expected order ?

In your program, have each rank!=0 proc recv the message from the previous 
rank, print the message, sleep(1), and then send.

> 
> Thanks
> 
> 
> 2014-03-16 0:42 GMT+01:00 Ralph Castain <r...@open-mpi.org>:
> 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
> 
> 
> _______________________________________________
> users mailing list
> us...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/users
> 
> _______________________________________________
> users mailing list
> us...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/users

Reply via email to