4ab17f019b
This commit was SVN r6269.
85 строки
2.6 KiB
C
85 строки
2.6 KiB
C
/*
|
|
* Copyright (c) 2004-2005 The Trustees of Indiana University.
|
|
* All rights reserved.
|
|
* Copyright (c) 2004-2005 The Trustees of the University of Tennessee.
|
|
* All rights reserved.
|
|
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
|
* University of Stuttgart. All rights reserved.
|
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
|
* All rights reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
|
|
#include "ompi_config.h"
|
|
#include "mca/topo/base/base.h"
|
|
#include "communicator/communicator.h"
|
|
#include "mca/topo/topo.h"
|
|
|
|
/*
|
|
*
|
|
* function - makes a new communicator to which topology information
|
|
* has been attached
|
|
*
|
|
* @param comm_old input communicator without topology (handle)
|
|
* @param nnodes number of nodes in graph (integer)
|
|
* @param index array of integers describing node degrees (see below)
|
|
* @param edges array of integers describing graph edges (see below)
|
|
* @param reorder ranking may be reordered (true) or not (false) (logical)
|
|
* @param comm_graph communicator with graph topology added (handle)
|
|
*
|
|
* @retval MPI_SUCCESS
|
|
* @retval MPI_ERR_OUT_OF_RESOURCE
|
|
*/
|
|
|
|
int mca_topo_base_graph_create (mca_topo_base_comm_t *topo_data,
|
|
int *proc_count,
|
|
ompi_proc_t **proc_pointers,
|
|
int *new_rank,
|
|
int nnodes,
|
|
int *index,
|
|
int *edges,
|
|
bool reorder)
|
|
{
|
|
int nedges;
|
|
int i;
|
|
int *p;
|
|
|
|
/* check if the number of nodes is more than the number of procs */
|
|
|
|
if (nnodes > *proc_count) {
|
|
return MPI_ERR_DIMS;
|
|
}
|
|
|
|
/* Create and error check the topology information */
|
|
|
|
nedges = topo_data->mtc_dims_or_index[nnodes-1];
|
|
|
|
/* Check if there are any negative values on the edges */
|
|
|
|
p = topo_data->mtc_periods_or_edges;
|
|
|
|
for (i = 0; i < nedges; ++i, ++p) {
|
|
if (*p < 0 || *p >= nnodes) {
|
|
return MPI_ERR_TOPOLOGY;
|
|
}
|
|
}
|
|
|
|
/* if the graph does not have to be trimmed, then nothing has to change */
|
|
if (nnodes < *proc_count) {
|
|
*proc_count = nnodes;
|
|
}
|
|
|
|
/* check if this rank makes the cut. if it does not return -1 */
|
|
if (*new_rank > (nnodes-1)) {
|
|
/* sorry but in our scheme, you are out */
|
|
*new_rank = MPI_UNDEFINED;
|
|
return MPI_SUCCESS;
|
|
}
|
|
|
|
return(MPI_SUCCESS);
|
|
}
|