On Jan 10, 2014, at 10:04 AM, George Bosilca <[email protected]> wrote:
>> MPI Comm comm;
>> // comm is setup as an hcoll-enabled communicator
>> if (rank == x) {
>> MPI_Send(..., y, tag, MPI_COMM_WORLD);
>> MPI_Comm_free(comm);
>> } else if (rank == y) {
>> MPI_Comm_free(comm);
>> MPI_Recv(..., x, tag, MPI_COMM_WORLD);
>> }
>
> Based on today’s MPI standard this code is incorrect as the MPI_Comm_free is
> collective, and you can’t have matching blocking communications crossing a
> collective line.
I don't know exactly what you mean by "crossing a collective line", but
communicating in different communicators while a different collective is
occurring is certainly valid. I.e., this is valid (and won't deadlock):
-----
MPI Comm comm;
// comm is setup as an hcoll-enabled communicator
MPI_Barrier(comm);
if (rank == x) {
MPI_Send(..., y, tag, MPI_COMM_WORLD);
MPI_Comm_free(comm);
} else if (rank == y) {
MPI_Recv(..., x, tag, MPI_COMM_WORLD);
MPI_Comm_free(comm);
} else {
MPI_Comm_free(comm);
}
-----
My point (which I guess I didn't make well) is that COMM_FREE is collective,
which we all know does not necessarily mean synchronizing. If hcoll teardown
is going to add synchronization, there could be situations that might be
dangerous (if OMPI doesn't already synchronize during COMM_FREE, which is why I
asked the question).
Sorry if I just muddled the conversation... :-\
--
Jeff Squyres
[email protected]
For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/