Here is the code

    if( (is_receiver == 1) && (is_sender != 1) )
    {
        printf("\nP%d >> Receiver only ...!!", myid);
        printf("\n");
        MPI_Recv(&recv_packet, 1, loadDatatype, MPI_ANY_SOURCE, MPI_TAG_LOAD, 
comm, &status);
        printf("\nP%d >> Received from P%d", myid, status.MPI_SOURCE);
        printf("\n");
    }
    else if( (is_sender == 1) && (is_receiver != 1) )
    {    
        load_packet.rank = *id;
        load_packet.ld = load;
        printf("\nP%d >> Sender only ...!! P%d", myid, rec_rank);
        printf("\n");
        MPI_Ssend(&load_packet, 1, loadDatatype, rec_rank, MPI_TAG_LOAD, comm);
    }
    else if( (is_receiver == 1) && (is_sender == 1) )
    {
        load_packet.rank = *id;
        load_packet.ld = load;
        printf("\nP%d >> Both ...!! P%d", myid, rec_rank);
        printf("\n");
        MPI_Sendrecv(&load_packet, 1, loadDatatype, rec_rank, MPI_TAG_LOAD, 
             &recv_packet, 1, loadDatatype, MPI_ANY_SOURCE, MPI_TAG_LOAD, comm, 
&status);
        printf("\nP%d >> Received from P%d", myid, status.MPI_SOURCE);
        printf("\n");
    }

A process can be a message sender, or receiver or both. There are 16 ranks. 
"rec_rank" contains the rank of the receiver. It is displayed before the 
message is sent. 
Every sender displays this "rec_rank" and it should correctly. But on the 
receiver sides, status.MPI_SOURCE is displayed (after receiving message), but 
the value 
is not matching with the expected sender's rank. 

I did not understand about kernel that you were talking about. 

See the code is very clear and it sends the message to "rec_rank" that was 
displayed before sending the message. But on the receiver side the MPI_SOURCE 
comes to be wrong.
This shows to me that messages on the receiving sides are captured on the basis 
of MPI_ANY_SOURCE, that seems like it does not see the destination of message 
while capturing it from message queue of the MPI system.

regards,
Mudassar



________________________________
From: Terry Dontje <terry.don...@oracle.com>
To: Mudassar Majeed <mudassar...@yahoo.com>
Cc: "us...@open-mpi.org" <us...@open-mpi.org>
Sent: Friday, July 15, 2011 7:10 PM
Subject: Re: [OMPI users] Urgent Question regarding, MPI_ANY_SOURCE.




On 7/15/2011 12:49 PM, Mudassar Majeed wrote: 

>Yes, processes receive messages that were not sent to them. I am
        receiving the message with the following call
>
>MPI_Recv(&recv_packet, 1, loadDatatype, MPI_ANY_SOURCE,
        MPI_TAG_LOAD, comm, &status);
>
>and that was sent using the following call,
>
>MPI_Ssend(&load_packet, 1, loadDatatype, rec_rank,
        MPI_TAG_LOAD, comm);
>
>What problem it can have ?. All the parameters are correct, I
        have seen them by printf.  What I am thinking is that, the
        receive is done with MPI_ANY_SOURCE, so the process is getting
        any message (from any source). What should be done so that only
        that message is captured that had the destination as this
        process. 
>
>
By virtue of MPI the MPI_Recv call should only return messages destined for 
that rank.  What makes you think that is not happening?  Can you make some sort 
of kernel of code that proves your theory that your MPI_Recv is receiving 
another rank's message?  If you can and then post that code maybe we'll be able 
to figure out what the issue is.

Right now, it seems we are at a deadlock of you claiming something
    is happening that really cannot be happening.  So unless we have
    more than a broad description of the problem it is going to be
    nearly impossible for us to tell you what is wrong.

--td

regards,
>Mudassar
>
>Date: Fri, 15 Jul 2011 07:04:34 -0400
>From: Terry Dontje <terry.don...@oracle.com>
>Subject: Re: [OMPI users] Urgent Question regarding,
        MPI_ANY_SOURCE.
>To: us...@open-mpi.org
>Message-ID: <4e201ec2....@oracle.com>
>Content-Type: text/plain; charset="iso-8859-1"; Format="flowed"
>
>Well MPI_Recv does give you the message that was sent
        specifically to 
>the rank calling it by any of the processes in the
        communicator.  If you 
>think the message you received should have gone to another rank
        then 
>there is a bug somewhere.  I would start by either adding
        debugging 
>printf's to your code to trace the messages.  Or narrowing down
        the 
>code to a small kernel such that you can prove to yourself that
        MPI is 
>working the way it should and if not you can show us where it is
        going 
>wrong.
>
>--td
>
>On 7/15/2011 6:51 AM, Mudassar Majeed wrote:
>> I get the sender's rank in status.MPI_SOURCE, but it is
        different than 
>> expected. I need to receive that message which was sent to
        me, not any 
>> message.
>>
>> regards,
>>
>> Date: Fri, 15 Jul 2011 06:33:41 -0400
>> From: Terry Dontje <terry.don...@oracle.com 
>> <mailto:terry.don...@oracle.com>>
>> Subject: Re: [OMPI users] Urgent Question regarding,
        MPI_ANY_SOURCE.
>> To: us...@open-mpi.org <mailto:us...@open-mpi.org>
>> Message-ID: <4e201785.6010...@oracle.com 
>> <mailto:4e201785.6010...@oracle.com>>
>> Content-Type: text/plain; charset="iso-8859-1";
        Format="flowed"
>>
>> Mudassar,
>>
>> You can do what you are asking.  The receiver uses
        MPI_ANY_SOURCE for
>> the source rank value and when you receive a message the
>> status.MPI_SOURCE will contain the rank of the actual
        sender not the
>> receiver's rank.  If you are not seeing that then there is
        a bug 
>> somewhere.
>>
>> --td
>>
>> On 7/14/2011 9:54 PM, Mudassar Majeed wrote:
>> > Friend,
>> >              I can not specify the rank of the sender.
        Because only
>> > the sender knows to which receiver the message is to
        be sent. The
>> > receiver does not know from which sender the message
        will come. I am
>> > trying to do a research work on load balancing in MPI
        application
>> > where load is redistributed, so in that I require a
        receiver to
>> > receive a load value from a sender that it does not
        know. On the other
>> > hand, the sender actually calculates, to which
        receiver this load
>> > value should be sent. So for this, I want sender to
        send a message
>> > containing the load to a receiver, but receiver does
        not know from
>> > which sender the message will come. See, it is like
        send receiver in
>> > DATAGRAM sockets. The receiver, receives the message
        on the IP and
>> > port, the message which was directed for it. I want to
        have same
>> > behavior. But it seems that it is not possible in MPI.
        Isn't it?
>> >
>> > regards,
>> > Mudassar
>> >
>> >
        ------------------------------------------------------------------------
>> > *From:* Jeff Squyres <jsquy...@cisco.com <mailto:jsquy...@cisco.com>>
>> > *To:* Mudassar Majeed <mudassar...@yahoo.com 
>> <mailto:mudassar...@yahoo.com>>
>> > *Cc:* Open MPI Users <us...@open-mpi.org <mailto:us...@open-mpi.org>>
>> > *Sent:* Friday, July 15, 2011 3:30 AM
>> > *Subject:* Re: [OMPI users] Urgent Question regarding,
        MPI_ANY_SOURCE.
>> >
>> > Right.  I thought you were asking about receiving
        *another* message
>> > from whomever you just received from via ANY_SOURCE.
>> >
>> > If you want to receive from a specific sender, you
        just specify the
>> > rank you want to receive from -- not ANY_SOURCE.
>> >
>> > You will always only receive messages that were sent
        to *you*.
>> > There's no MPI_SEND_TO_ANYONE_WHO_IS_LISTENING
        functionality, for
>> > example.  So your last statement: "But when it
        captures with ..
>> > MPI_ANY_SOURCE and MPI_ANY_TAG, the receiver will
        capture any message
>> > (even not targetted for it)" is incorrect.
>> >
>> > I guess I still don't understand your question...?
>> >
>> >
>> > On Jul 14, 2011, at 9:17 PM, Mudassar Majeed wrote:
>> >
>> > >
>> > > I know this, but when I compare status.MPI_SOURCE
        with myid, they
>> > are different. I guess you need to reconsider my
        question. The
>> > MPI_Recv function seems to capture message from the
        queue with some
>> > search parameters like source, tag etc. So in case the
        receiver does
>> > not know the sender and wants to receive only that
        message which was
>> > sent for this receiver. But when it captures with
        source as
>> > MPI_ANY_SOURCE and MPI_ANY_TAG, the receiver will
        capture any message
>> > (even not targetted for it).
>> > >
>> > > regards,
>> > > Mudassar
>> > >
>> > >
>> > > From: Jeff Squyres <jsquy...@cisco.com <mailto:jsquy...@cisco.com> 
>> <mailto:jsquy...@cisco.com <mailto:jsquy...@cisco.com>>>
>> > > To: Mudassar Majeed <mudassar...@yahoo.com 
>> <mailto:mudassar...@yahoo.com>
>> > <mailto:mudassar...@yahoo.com <mailto:mudassar...@yahoo.com>>>; Open 
>> MPI Users <us...@open-mpi.org <mailto:us...@open-mpi.org>
>> > <mailto:us...@open-mpi.org <mailto:us...@open-mpi.org>>>
>> > > Sent: Friday, July 15, 2011 1:58 AM
>> > > Subject: Re: [OMPI users] Urgent Question
        regarding, MPI_ANY_SOURCE.
>> > >
>> > > When you use MPI_ANY_SOURCE in a receive, the
        rank of the actual
>> > sender is passed back to you in the status.MPI_SOURCE.
>> > >
>> > > On Jul 14, 2011, at 7:55 PM, Mudassar Majeed
        wrote:
>> > >
>> > > > Hello people,
>> > > >                        I am trapped in the
        following problem plz
>> > help me. Suppose a process A sends a message to
        process B. The process
>> > B will receive the message with MPI_Recv with
        MPI_ANY_SOURCE in the
>> > source argument. Let say process B does not know that
        A is the sender.
>> > But I want B to receive message from process A (the
        one who actually
>> > sends the message to process B). But if I use
        MPI_ANY_SOURCE, then any
>> > message from any source is captured by process B (let
        say there are
>> > other processes sending messages). Instead of
        MPI_ANY_SOURCE I cannot
>> > use A in the source argument as B does not know about
        the sender. What
>> > should I do in this situation ?
>> > > >
>> > > > regards,
>> > > > Mudassar Majeed

-- 

 

Terry D. Dontje | Principal Software Engineer

Developer Tools Engineering | +1.781.442.2631
 Oracle - Performance Technologies
95 Network Drive, Burlington, MA 01803
Email terry.don...@oracle.com

Reply via email to