[mpich-commits] [mpich] MPICH primary repository branch, master, updated. v3.2a1-44-g051449e
Service Account
noreply at mpich.org
Fri Oct 3 16:59:55 CDT 2014
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 051449e7b5421b006556ba4e8c6f3300b6efed06 (commit)
from 818b6a61a2f4653dc12da9c14c46ab866ba2a02b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/051449e7b5421b006556ba4e8c6f3300b6efed06
commit 051449e7b5421b006556ba4e8c6f3300b6efed06
Author: Igor Ivanov <Igor.Ivanov at itseez.com>
Date: Fri Sep 5 18:18:49 2014 +0300
mpi/comm: Fix MPI_Intercomm_merge
Previous code is based on a trick to get true context id using
invalid communicator. There is a call of MPIR_Get_contextid()
for new communicator that is not completelly built (no comm_commit
and comm_hook calls).
netmod/mxm uses comm_hook and can not work with this trick.
This changes allow to avoid call of invalid communicator using
temporary (intermediate) communicator.
Signed-off-by: Igor Ivanov <Igor.Ivanov at itseez.com>
Signed-off-by: Pavan Balaji <balaji at anl.gov>
diff --git a/src/mpi/comm/intercomm_merge.c b/src/mpi/comm/intercomm_merge.c
index 90b7c15..e12d991 100644
--- a/src/mpi/comm/intercomm_merge.c
+++ b/src/mpi/comm/intercomm_merge.c
@@ -20,6 +20,62 @@ int MPI_Intercomm_merge(MPI_Comm intercomm, int high, MPI_Comm *newintracomm) __
#endif
/* -- End Profiling Symbol Block */
+/* These functions help implement the merge procedure */
+static int MPIR_Intercomm_merge_create_and_map_vcrt(MPID_Comm *comm_ptr, int local_high, MPID_Comm *new_intracomm_ptr);
+
+
+/* This function creates VCRT for new communicator
+ * basing on VCRT of existing communicator.
+ */
+
+#undef FUNCNAME
+#define FUNCNAME MPIR_Intercomm_merge_create_and_map_vcrt
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+static int MPIR_Intercomm_merge_create_and_map_vcrt(MPID_Comm *comm_ptr, int local_high, MPID_Comm *new_intracomm_ptr)
+{
+ int mpi_errno = MPI_SUCCESS;
+ int i, j;
+
+ /* Now we know which group comes first. Build the new vcr
+ from the existing vcrs */
+ mpi_errno = MPID_VCRT_Create( comm_ptr->local_size + comm_ptr->remote_size, &new_intracomm_ptr->vcrt );
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+
+ mpi_errno = MPID_VCRT_Get_ptr( new_intracomm_ptr->vcrt, &new_intracomm_ptr->vcr );
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+
+ if (local_high) {
+ /* remote group first */
+ j = 0;
+ for (i = 0; i < comm_ptr->remote_size; i++) {
+ mpi_errno = MPID_VCR_Dup( comm_ptr->vcr[i], &new_intracomm_ptr->vcr[j++] );
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+ }
+ for (i = 0; i < comm_ptr->local_size; i++) {
+ if (i == comm_ptr->rank) new_intracomm_ptr->rank = j;
+ mpi_errno = MPID_VCR_Dup( comm_ptr->local_vcr[i], &new_intracomm_ptr->vcr[j++] );
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+ }
+ }
+ else {
+ /* local group first */
+ j = 0;
+ for (i = 0; i < comm_ptr->local_size; i++) {
+ if (i == comm_ptr->rank) new_intracomm_ptr->rank = j;
+ mpi_errno = MPID_VCR_Dup( comm_ptr->local_vcr[i], &new_intracomm_ptr->vcr[j++] );
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+ }
+ for (i = 0; i < comm_ptr->remote_size; i++) {
+ mpi_errno = MPID_VCR_Dup( comm_ptr->vcr[i], &new_intracomm_ptr->vcr[j++] );
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+ }
+ }
+
+fn_fail:
+ return mpi_errno;
+}
+
/* Define MPICH_MPI_FROM_PMPI if weak symbols are not supported to build
the MPI routines */
#ifndef MPICH_MPI_FROM_PMPI
@@ -33,7 +89,7 @@ int MPI_Intercomm_merge(MPI_Comm intercomm, int high, MPI_Comm *newintracomm) __
int MPIR_Intercomm_merge_impl(MPID_Comm *comm_ptr, int high, MPID_Comm **new_intracomm_ptr)
{
int mpi_errno = MPI_SUCCESS;
- int local_high, remote_high, i, j, new_size;
+ int local_high, remote_high, new_size;
MPIR_Context_id_t new_context_id;
int errflag = FALSE;
MPID_MPI_STATE_DECL(MPID_STATE_MPIR_INTERCOMM_MERGE_IMPL);
@@ -118,44 +174,17 @@ int MPIR_Intercomm_merge_impl(MPID_Comm *comm_ptr, int high, MPID_Comm **new_int
/* Now we know which group comes first. Build the new vcr
from the existing vcrs */
- mpi_errno = MPID_VCRT_Create( new_size, &(*new_intracomm_ptr)->vcrt );
- if (mpi_errno) MPIU_ERR_POP(mpi_errno);
-
- mpi_errno = MPID_VCRT_Get_ptr( (*new_intracomm_ptr)->vcrt, &(*new_intracomm_ptr)->vcr );
+ mpi_errno = MPIR_Intercomm_merge_create_and_map_vcrt(comm_ptr, local_high, (*new_intracomm_ptr));
if (mpi_errno) MPIU_ERR_POP(mpi_errno);
-
- if (local_high) {
- /* remote group first */
- j = 0;
- for (i = 0; i < comm_ptr->remote_size; i++) {
- mpi_errno = MPID_VCR_Dup( comm_ptr->vcr[i], &(*new_intracomm_ptr)->vcr[j++] );
- if (mpi_errno) MPIU_ERR_POP(mpi_errno);
- }
- for (i = 0; i < comm_ptr->local_size; i++) {
- if (i == comm_ptr->rank) (*new_intracomm_ptr)->rank = j;
- mpi_errno = MPID_VCR_Dup( comm_ptr->local_vcr[i], &(*new_intracomm_ptr)->vcr[j++] );
- if (mpi_errno) MPIU_ERR_POP(mpi_errno);
- }
- }
- else {
- /* local group first */
- j = 0;
- for (i = 0; i < comm_ptr->local_size; i++) {
- if (i == comm_ptr->rank) (*new_intracomm_ptr)->rank = j;
- mpi_errno = MPID_VCR_Dup( comm_ptr->local_vcr[i], &(*new_intracomm_ptr)->vcr[j++] );
- if (mpi_errno) MPIU_ERR_POP(mpi_errno);
- }
- for (i = 0; i < comm_ptr->remote_size; i++) {
- mpi_errno = MPID_VCR_Dup( comm_ptr->vcr[i], &(*new_intracomm_ptr)->vcr[j++] );
- if (mpi_errno) MPIU_ERR_POP(mpi_errno);
- }
- }
/* We've setup a temporary context id, based on the context id
used by the intercomm. This allows us to perform the allreduce
operations within the context id algorithm, since we already
have a valid (almost - see comm_create_hook) communicator.
*/
+ mpi_errno = MPIR_Comm_commit((*new_intracomm_ptr));
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+
/* printf( "About to get context id \n" ); fflush( stdout ); */
/* In the multi-threaded case, MPIR_Get_contextid assumes that the
calling routine already holds the single criticial section */
@@ -164,9 +193,24 @@ int MPIR_Intercomm_merge_impl(MPID_Comm *comm_ptr, int high, MPID_Comm **new_int
if (mpi_errno) MPIU_ERR_POP(mpi_errno);
MPIU_Assert(new_context_id != 0);
+ /* We release this communicator that was involved just to
+ * get valid context id and create true one
+ */
+ mpi_errno = MPIR_Comm_release( (*new_intracomm_ptr),0);
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+
+ mpi_errno = MPIR_Comm_create( new_intracomm_ptr );
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+
+ (*new_intracomm_ptr)->remote_size = (*new_intracomm_ptr)->local_size = new_size;
+ (*new_intracomm_ptr)->rank = -1;
+ (*new_intracomm_ptr)->comm_kind = MPID_INTRACOMM;
(*new_intracomm_ptr)->context_id = new_context_id;
(*new_intracomm_ptr)->recvcontext_id = new_context_id;
+ mpi_errno = MPIR_Intercomm_merge_create_and_map_vcrt(comm_ptr, local_high, (*new_intracomm_ptr));
+ if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+
mpi_errno = MPIR_Comm_commit((*new_intracomm_ptr));
if (mpi_errno) MPIU_ERR_POP(mpi_errno);
-----------------------------------------------------------------------
Summary of changes:
src/mpi/comm/intercomm_merge.c | 108 ++++++++++++++++++++++++++++------------
1 files changed, 76 insertions(+), 32 deletions(-)
hooks/post-receive
--
MPICH primary repository
More information about the commits
mailing list