[Mpi-forum] Question about the semantics of MPI_Comm_disconnect

Jeff Squyres (jsquyres) jsquyres at cisco.com
Fri Nov 15 08:47:11 CST 2013

On Nov 13, 2013, at 4:25 PM, George Bosilca <bosilca at icl.utk.edu> wrote:

> Disconnect doesn’t work at the physical connection level, it is supposed to mark two previously connected world as disconnected in the MPI sense.

Mmm... not quite.  It disconnects two *communicators* -- but the *processes* may still be connected (in the MPI sense).  See the example in my previous mail -- you have to call COMM_DISCONNECT twice and FILE_CLOSE to actually disconnect.  

This is supported by MPI-3 10.5.4 (p399:45-47).

> In MPI there is this transitive notion of connected processes, which can only be reversed by the usage of disconnect. Basically MPI_Finalize is collective over all connected processes, which is a burden in some cases. Disconnect is here to allow the disruption of the connected notion.

Yeah, I know what disconnect is for.  :-)

> Thus, Disconnect only has a special meaning when called on a communicator returned by SPAWN, ACCEPT/CONNECT and JOIN. Any other usage is similar to MPI_Comm_Free. This in well explained in 10.5.4 once at the beginning of the section and then again in the first advice to users.

I'm not debating what COMM_DISCONNECT actually does -- I'm just saying that it's actually a poor name choice: per 10.5.4, it *doesn't* always disconnect you.  Per the example in my previous mail, the processes involved are connected via 3 things:

1. the communicator created by COMM_SPAWN
2. the communicator created by INTERCOMM_MERGE
3. the communicator created by FILE_OPEN

You have to COMM_DISCONNECT the first 2, and FILE_CLOSE then 3rd, and *then* you're actually disconnected.

Hence, all I'm saying is that "COMM_DISCONNECT" is actually a bit of a misnomer -- the action it's really performing is something more like MPI_COMM_FREE_WAIT (i.e., do a COMM_FREE, but actually wait for all communication to complete on that communicator before returning).

For reference, this was my example:

>> -----
>> MPI_Comm_spawn(..., &child);
>> MPI_Intercomm_merge(child, 0, &child_intra);
>> MPI_File_open(child_intra, ..., &file);
>> MPI_Comm_disconnect(&child_intra);
>> MPI_Comm_disconnect(&child);
>> -----

After giving that example, I mused:

>> I wonder if this is worth an AtoU...

Jeff Squyres
jsquyres at cisco.com
For corporate legal information go to: http://www.cisco.com/web/about/doing_business/legal/cri/

More information about the mpi-forum mailing list