On Mar 8, 2013, at 10:20 AM, George Bosilca <bosi...@icl.utk.edu> wrote:

>> If the app REQUEST_FREE'd a nonblocking send/receive, don't we block in 
>> ompi_mpi_finalize() before the call to pml_base_close(), such that the PMLs 
>> will be drained before we get to destroying the PMLs?
> 
> We don't, as we have no way of knowing there are pending requests in the 
> pipeline. There is a separation between who create the requests and who 
> release them. They are created by the selected PML, and are destroyed by the 
> base, after the selected PML has been turned off.


Here's an interesting case -- do you think that this is a valid MPI 
application?  And if it is, what is the expected behavior?

-----
#include <stdio.h>
#include <mpi.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define SIZE 33554432

int main(int argc, char *argv[])
{
    int i, rank;
    char *buf;
    MPI_Request req;

    MPI_Init(NULL, NULL);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    buf = malloc(SIZE);
    assert(buf);
    memset(buf, rank, SIZE);
    if (0 == rank) {
        MPI_Isend(buf, SIZE, MPI_CHAR, 1, 123, MPI_COMM_WORLD, &req);
        MPI_Request_free(&req);
    } else if (1 == rank) {
        MPI_Irecv(buf, SIZE, MPI_CHAR, 0, 123, MPI_COMM_WORLD, &req);
        MPI_Request_free(&req);
    }

    MPI_Finalize();

    if (1 == rank) {
        for (i = 0; i < SIZE; ++i) {
            assert(1 == buf[i]);
        }
    }

    return 0;
}
-----

On the SVN trunk, this application will fail the assert(1 == buf[i]).

MPI-3 p360 shows a *similar* case, but it's not exactly the same (example 8.7 
shows Request_free one *one* side, not *both* sides).

-- 
Jeff Squyres
jsquy...@cisco.com
For corporate legal information go to: 
http://www.cisco.com/web/about/doing_business/legal/cri/


Reply via email to