On Nov 21, 2010, at 1:46 PM, Riccardo Murri wrote: > I'm using code like this: > > MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status); > if(flag) { > int size; > MPI_Get_count(&status, MPI_BYTE, &size); > void* row = xmalloc(size); > /* ... */ > MPI_Recv(row, size, MPI_BYTE, > status.MPI_SOURCE, status.MPI_TAG, MPI_COMM_WORLD, > &status); > /* ... */ > } > > Question: is it possible that, in the time my program progresses from > MPI_Iprobe() to MPI_Recv(), another message has arrived, that matches > the MPI_Recv(), but is not the one originally matched from > MPI_Iprobe()? (e.g. a shorter one)
No. MPI guarantees matching order. Given that you're receiving on a very specific signature (i.e., the source and tag from the successful probe), messages will be received in order. As long as there's no other possible MPI_RECV on that signature between your MPI_IPROBE-that-returns-flag==true and the MPI_RECV shown above, then your MPI_RECV should be receiving the message that MPI_IPROBE returned flag==true for. > In particular, could it be that the size of the message actually > received by MPI_Recv() does not match `size` (the variable)? No. > In case a shorter message (different from the one initially matched) > was received, can I get the actual message size via a new call to > MPI_Get_count(&mpi_recv_status ...)? You certainly can, but you should not need to -- they should be the same size. -- Jeff Squyres jsquy...@cisco.com For corporate legal information go to: http://www.cisco.com/web/about/doing_business/legal/cri/