Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Open MPI User's mailing list

Subject: Re: [OMPI users] Newbie needs help! MPI_Wait/MPI_Start/MPI_Issend
From: Hartzman, Leslie D (MS) (Les.Hartzman_at_[hidden])
Date: 2009-01-26 16:04:33


>> In the original process 'A' code, prior to sending out a command,
>> 'A' will issue an MPI_Wait to make sure that the command request
>> instance is free.
>>
> I'm not quite sure I understand that statement. Can't you just
> compare the request to MPI_REQUEST_NULL? From your description, it
> sounds like if you get to this point and the request is not
> REQUEST_NULL, there's something else wrong. However, this may simply
> be a side-effect from the short description of complex code...?
What I'm trying to say here is that the infrastructure that already
exists issues an MPI_Wait
before it sends out anything more to ensure that the previous request
completed.
Maybe this pseudo code will make a little more sense:
        Process 'A'
---------------------------------------------
Initialize requests to MPI_REQUEST_NULL

for i=0; i < n; i++
{
        if (rank == 0)
        {
                initialize 'command' structure
                        (set cmd = 'step 1')
                set destination to Process 'B'
                mpi_issend(command, sizeof(struct command), dest, ...);
        }

        send data to be processed by Process 'B'
                mpi_issend(data, numWords, MPI_FLOAT, ...);

        if (rank == 0)
        {
                mpi_wait(command request for 'step 1' command);
                sending new command, set cmd = 'step 2', mpi_issend(...)
        }

        send data to be processed by Process 'B'
                mpi_issend(data, ...);

        mpi_wait(command request for 'step n');
}

        Process 'B'
------------------------------------------------
issue mpi_recv_init calls to handle commands and data
coming in from Process 'A'-type processes

while(1)
{
        mpi_wait(command...);

        switch(command->cmd)
        {
                case 'step 1':
                        mpi_waitall(data_requests,...);
                        process data
                        mpi_startall(data_requests, ...);
                        break;

                case 'step 2':
                        mpi_waitall(data_requests, ...);
                        process data
                        mpi_startall(data_requests, ...);
                        break;

                default:
                        break;
        }
        mpi_start(command_request, ...);
}
Process 'B' is not another instance of Process 'A'. They are 2 different
pieces of code
involved in a point-to-point persistent communication.
> One clarifying question: why are you using synchronous sends?
That is what the existing infrastructure used. I'm just trying to fit
new code into it. Since the code was working, it didn't make sense to
change anything.
Les