1
1

Making changes to clean up creation of a cart which is smaller than its parent proc

This commit was SVN r2938.
Этот коммит содержится в:
Prabhanjan Kambadur 2004-10-05 21:17:14 +00:00
родитель 52a9776ab1
Коммит 02958a5a4e

Просмотреть файл

@ -1005,19 +1005,6 @@ int ompi_topo_create (ompi_communicator_t *old_comm,
/* since the topo component has initialised, let us now initialise
* the topo comm structure */
#define FREE_COMMUNICATOR(new_comm) \
if (NULL != new_comm->c_topo_comm->mtc_dims_or_index) { \
free(new_comm->c_topo_comm->mtc_dims_or_index); \
} \
if (NULL != new_comm->c_topo_comm->mtc_periods_or_edges) { \
free(new_comm->c_topo_comm->mtc_periods_or_edges); \
} \
if (NULL != new_comm->c_topo_comm->mtc_coords) { \
free(new_comm->c_topo_comm->mtc_coords); \
} \
free(new_comm->c_topo_comm); \
OBJ_RELEASE (new_comm);
new_comm->c_flags |= cart_or_graph;
new_comm->c_topo_comm->mtc_ndims_or_nnodes = ndims_or_nnodes;
@ -1030,7 +1017,8 @@ int ompi_topo_create (ompi_communicator_t *old_comm,
new_comm->c_topo_comm->mtc_dims_or_index = malloc (sizeof(int) * ndims_or_nnodes);
if (NULL == new_comm->c_topo_comm->mtc_dims_or_index) {
FREE_COMMUNICATOR(new_comm);
ompi_comm_free (&new_comm);
*comm_topo = new_comm;
return OMPI_ERROR;
}
memcpy (new_comm->c_topo_comm->mtc_dims_or_index,
@ -1064,7 +1052,8 @@ int ompi_topo_create (ompi_communicator_t *old_comm,
new_comm->c_topo_comm->mtc_periods_or_edges =
malloc (sizeof(int) * dims_or_index[ndims_or_nnodes - 1]);
if (NULL == new_comm->c_topo_comm->mtc_periods_or_edges) {
FREE_COMMUNICATOR(new_comm);
ompi_comm_free (&new_comm);
*comm_topo = new_comm;
return OMPI_ERROR;
}
memcpy (new_comm->c_topo_comm->mtc_periods_or_edges,
@ -1073,7 +1062,8 @@ int ompi_topo_create (ompi_communicator_t *old_comm,
new_comm->c_topo_comm->mtc_coords = malloc (sizeof(int) * ndims_or_nnodes);
if (NULL == new_comm->c_topo_comm->mtc_coords) {
FREE_COMMUNICATOR(new_comm);
ompi_comm_free (&new_comm);
*comm_topo = new_comm;
return OMPI_ERROR;
}
@ -1101,7 +1091,8 @@ int ompi_topo_create (ompi_communicator_t *old_comm,
new_comm->c_topo_comm->mtc_periods_or_edges =
malloc (sizeof(int) * dims_or_index[ndims_or_nnodes-1]);
if (NULL == new_comm->c_topo_comm->mtc_periods_or_edges) {
FREE_COMMUNICATOR(new_comm);
ompi_comm_free (&new_comm);
*comm_topo = new_comm;
return OMPI_ERROR;
}
memcpy (new_comm->c_topo_comm->mtc_periods_or_edges,
@ -1121,15 +1112,6 @@ int ompi_topo_create (ompi_communicator_t *old_comm,
}
/* if the returned rank is -1, then this process is not in the
* new topology, so free everything we have allocated and return */
if (MPI_UNDEFINED == new_rank) {
FREE_COMMUNICATOR(new_comm);
return OMPI_SUCCESS;
}
/* Determine context id. It is identical to f_2_c_handle */
ret = ompi_comm_nextcid ( new_comm, /* new communicator */
@ -1141,10 +1123,12 @@ int ompi_topo_create (ompi_communicator_t *old_comm,
-1 ); /* send first, doesn't matter */
if (OMPI_SUCCESS != ret) {
/* something wrong happened during setting the communicator */
FREE_COMMUNICATOR(new_comm);
ompi_comm_free (&new_comm);
*comm_topo = new_comm;
return ret;
}
/* Now, the topology component has been selected and the group
* which has the topology information has been created. All we
* need to do now is to fill the rest of the information into the
@ -1159,7 +1143,8 @@ int ompi_topo_create (ompi_communicator_t *old_comm,
if (OMPI_SUCCESS != ret) {
/* something wrong happened during setting the communicator */
FREE_COMMUNICATOR(new_comm);
ompi_comm_free (&new_comm);
*comm_topo = new_comm;
return ret;
}
@ -1171,17 +1156,25 @@ int ompi_topo_create (ompi_communicator_t *old_comm,
OMPI_COMM_CID_INTRA, /* mode */
-1, /* send first, doesn't matter */
NULL ); /* coll component */
if (OMPI_SUCCESS != ret) {
/* something wrong happened during setting the communicator */
FREE_COMMUNICATOR(new_comm);
ompi_comm_free (&new_comm);
*comm_topo = new_comm;
return ret;
}
#undef FREE_COMMUNICATOR
/* finally, set the communicator to comm_cart */
*comm_topo = new_comm;
/* if the returned rank is -1, then this process is not in the
* new topology, so free everything we have allocated and return */
if (MPI_UNDEFINED == new_rank) {
ompi_comm_free (&new_comm);
*comm_topo = new_comm;
} else {
*comm_topo = new_comm;
}
return OMPI_SUCCESS;
}