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 /* since the topo component has initialised, let us now initialise
* the topo comm structure */ * 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_flags |= cart_or_graph;
new_comm->c_topo_comm->mtc_ndims_or_nnodes = ndims_or_nnodes; 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); 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) { 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; return OMPI_ERROR;
} }
memcpy (new_comm->c_topo_comm->mtc_dims_or_index, 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 = new_comm->c_topo_comm->mtc_periods_or_edges =
malloc (sizeof(int) * dims_or_index[ndims_or_nnodes - 1]); malloc (sizeof(int) * dims_or_index[ndims_or_nnodes - 1]);
if (NULL == new_comm->c_topo_comm->mtc_periods_or_edges) { 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; return OMPI_ERROR;
} }
memcpy (new_comm->c_topo_comm->mtc_periods_or_edges, 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); new_comm->c_topo_comm->mtc_coords = malloc (sizeof(int) * ndims_or_nnodes);
if (NULL == new_comm->c_topo_comm->mtc_coords) { 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; 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 = new_comm->c_topo_comm->mtc_periods_or_edges =
malloc (sizeof(int) * dims_or_index[ndims_or_nnodes-1]); malloc (sizeof(int) * dims_or_index[ndims_or_nnodes-1]);
if (NULL == new_comm->c_topo_comm->mtc_periods_or_edges) { 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; return OMPI_ERROR;
} }
memcpy (new_comm->c_topo_comm->mtc_periods_or_edges, 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 */ /* Determine context id. It is identical to f_2_c_handle */
ret = ompi_comm_nextcid ( new_comm, /* new communicator */ 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 */ -1 ); /* send first, doesn't matter */
if (OMPI_SUCCESS != ret) { if (OMPI_SUCCESS != ret) {
/* something wrong happened during setting the communicator */ /* something wrong happened during setting the communicator */
FREE_COMMUNICATOR(new_comm); ompi_comm_free (&new_comm);
*comm_topo = new_comm;
return ret; return ret;
} }
/* Now, the topology component has been selected and the group /* Now, the topology component has been selected and the group
* which has the topology information has been created. All we * which has the topology information has been created. All we
* need to do now is to fill the rest of the information into the * 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) { if (OMPI_SUCCESS != ret) {
/* something wrong happened during setting the communicator */ /* something wrong happened during setting the communicator */
FREE_COMMUNICATOR(new_comm); ompi_comm_free (&new_comm);
*comm_topo = new_comm;
return ret; return ret;
} }
@ -1171,17 +1156,25 @@ int ompi_topo_create (ompi_communicator_t *old_comm,
OMPI_COMM_CID_INTRA, /* mode */ OMPI_COMM_CID_INTRA, /* mode */
-1, /* send first, doesn't matter */ -1, /* send first, doesn't matter */
NULL ); /* coll component */ NULL ); /* coll component */
if (OMPI_SUCCESS != ret) { if (OMPI_SUCCESS != ret) {
/* something wrong happened during setting the communicator */ /* something wrong happened during setting the communicator */
FREE_COMMUNICATOR(new_comm); ompi_comm_free (&new_comm);
*comm_topo = new_comm;
return ret; return ret;
} }
#undef FREE_COMMUNICATOR
/* finally, set the communicator to comm_cart */ /* 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; return OMPI_SUCCESS;
} }