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/