On Aug 3, 2012, at 7:36 AM, Grzegorz Maj wrote: > I would like my MPI processes to exchange some structural data. That > data is represented by plain structures containing basic datatypes. I > would like to use MPI derived datatypes, because of its portability > and good performance. > > I would like to be able to send/receive any of my structures in the > same part of code. In the low-level network programming it is usually > done by having each struct of this pattern: > struct S1 { > int structType; > ... > } > And then you first read structType and know what bytes to expect next. > > Is there a good way to do it using MPI derived datatypes?
No. MPI is about atomic messages -- not streams. So if you're going to send a struct, you send the whole struct. You could choose to send the first int/enum and then do a second send with the rest of the struct, but that's a different pattern. Alternatively, you might want to explore using that first int/enum as the tag in your MPI_SEND/MPI_RECV. I.e., you can use the tag to indicate the type of data to receive. > I was thinking of having separate MPI_Request for each of my > structures and calling multiple MPI_Irecv + MPI_Waitany. Yes, that would probably work fine (i.e., one MPI_Irecv for each tag/struct type). > But then, how > to do this for MPI_Bcast? You can't currently do this with MPI_Bcast -- OMPI currently only has blocking versions of the collectives. MPI-3.0 defines non-blocking collectives (e.g., MPI_Ibcast and friends), but they still have no tags (for very complicated reasons :-) ). You might need a different communicators to be able to post a non-blocking, receiving MPI_Ibcast for different struct types. These non-blocking collectives will be included in the upcoming Open MPI v1.7 -- probably in a few months. > My second question is about having arbitrary size structures, i.e. the > ones having 'char buf[0]' as the last field, where you allocate memory > of size 'sizeof(S) + bufLen'. Is there a way to convert such a struct > into MPI derived datatype? Not really. MPI datatypes represent fixed sizes. That being said, if your last data member is "large enough", you could just send that as a blob in a 2nd send, and latency difference wouldn't matter (i.e., the blob is large enough such that the overhead of a 2nd send is dwarfed by the transmission / receipt time). Alternatively, if you're looking to send blobs of unknown sizes without associated meta data, you might want to look at MPI_MPROBE. MPROBE was specifically introduced in MPI-3.0 for, among other reasons, receiving messages of unknown size. See http://blogs.cisco.com/performance/mpi-forum-roundup/ for an explanation of MPROBE. MPROBE, too, will be included in the upcoming OMPI v1.7 release. -- Jeff Squyres jsquy...@cisco.com For corporate legal information go to: http://www.cisco.com/web/about/doing_business/legal/cri/